Spring工作原理探秘(上)

日期: 2009-11-01 作者:紫丁香社区 来源:TechTarget中国 英文

  Spring的哲学是在不影响Java对象的设计的情况下将Java对象加入到框架中。 我们下面来看看Spring的工作原理,看看Spring是如何做到不影响Java对象的。   

  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; 13.  }

  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, lets 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的属性了。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐