龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

品味Spring 的魅力[组图]

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
Spring的哲学是在不影响Java对象的设计的情况下将Java对象加入到框架中。 !-- frame contents -- !-- /frame contents -- EJB的框架采用了一种侵略性(Invasive)的方法来设计对象,它要求你在设计中

  Spring的哲学是在不影响Java对象的设计的情况下将Java对象加入到框架中。
  
   <!-- frame contents -->
<!-- /frame contents -->   EJB的框架采用了一种侵略性(Invasive)的方法来设计对象,它要求你在设计中加入符合EJB规范的代码。一些轻量级的COP框架,例如Avalon,也要求对象设计时必须符合某种规范,例如Serviceable接口,这种做法是典型的Type 1做法。
  
  这种设计思路要求Spring采用一种动态的、灵活的方式来设计框架。所以spring大量采用了反射。首先spring要解决的一个问题就是如何治理bean。因为IOC的思想要求bean之间不能够直接调用,而应该采用一种被动的方式进行协作。所以bean的治理是spring中的核心部分。
  
  反射和内省在代码的层次上思考问题,有时候能够带来出人意料的灵活性。但它的使用有时候也是一个哲学问题,不论是在ORM设计还是在AOP设计上都出现了类似的问题-究竟是使用反射,还是使用代码生成。
  
  在Spring中,处理这个问题的核心是在org.springframework.beans包中。而其中最为核心的部分,则是BeanWrapper。BeanWrapper,顾名思义,就是bean的包装器。所以,它的主要工作,就是对任何一个bean,进行属性(包括内嵌属性)的设置和方法的调用。在BeanWrapper的默认实现类BeanWrapperImpl中,虽然代码较长,但完成的工作却是非常的集中的。
  
  BeanWrapper的深入研究
  
  我们看看这个BeanWrapper是如何发挥运作的,假设我们有两个bean:
  
   public class Company {
   private String name;
   private Employee managingDirector;
  
   public String getName() {
  return this.name;
   }
   public void setName(String name) {
  this.name = name;
   }
   public Employee getManagingDirector() {
  return this.managingDirector;
   }
   public void setManagingDirector(Employee managingDirector) {
  this.managingDirector = managingDirector;
   }
  }
  
  public class Employee {
   private float salary;
  
   public float getSalary() {
  return salary;
   }
   public void setSalary(float salary) {
  this.salary = salary;
   }
  }
  然后我们使用BeanWrapper来调用这两个bean:
  
   Company c = new Company();
  BeanWrapper bwComp = BeanWrapperImpl(c);
  // setting the company name...
  bwComp.setPropertyValue("name", "Some Company Inc.");
  // ... can also be done like this:
  PropertyValue v = new PropertyValue("name", "Some Company Inc.");
  bwComp.setPropertyValue(v);
  
  // ok, let's create the director and tie it to the company:
  Employee jim = new Employee();
  BeanWrapper bwJim = BeanWrapperImpl(jim);
  bwJim.setPropertyValue("name", "Jim Stravinsky");
  bwComp.setPropertyValue("managingDirector", jim);
  
  // retrieving the salary of the managingDirector through the company
  Float salary = (Float)bwComp.getPropertyValue("managingDirector.salary");
  看起来麻烦了许多,但是这样spring就可以使用统一的方式来治理bean的属性了。 Bean的制造工厂
  
  有了对单个Bean的包装,还需要对多个的bean进行治理。在spring中,把bean纳入到一个核心库中进行治理。bean的生产有两种方法:一种是一个bean产生多个实例,一种是一个bean只产生一个实例。
  
精彩图集

赞助商链接