下载本文示例代码
Spring的哲学是在不影响Java对象的设计的情况下将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; } 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 companyFloat salary = (Float)bwComp.getPropertyValue("managingDirector.salary"); 看起来麻烦了许多,但是这样spring就可以使用统一的方式来管理bean的属性了。共2页。 1 2 :
Spring的哲学是在不影响Java对象的设计的情况下将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; } 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 companyFloat salary = (Float)bwComp.getPropertyValue("managingDirector.salary"); 看起来麻烦了许多,但是这样spring就可以使用统一的方式来管理bean的属性了。共2页。 1 2 :
下载本文示例代码
品味Spring 的魅力品味Spring 的魅力品味Spring 的魅力品味Spring 的魅力品味Spring 的魅力品味Spring 的魅力品味Spring 的魅力品味Spring 的魅力品味Spring 的魅力品味Spring 的魅力品味Spring 的魅力品味Spring 的魅力品味Spring 的魅力品味Spring 的魅力品味Spring 的魅力
阅读(100) | 评论(0) | 转发(0) |