站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题品味Spring 的魅力

品味Spring 的魅力

摘要: Spring的哲学是在不影响Java对象的设计的情况下将Java对象加入到框架中
  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:

<table borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1> <tr> <td>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;
 }
}</td></tr></table>
  然后我们使用BeanWrapper来调用这两个bean:

<table borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1> <tr> <td>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");</td></tr></table>
  看起来麻烦了许多,但是这样spring就可以使用统一的方式来管理bean的属性了。




↑返回目录
前一篇: 企业JavaBean(EJB) 3.0 全新体验
后一篇: Hibernate的JNDI绑定分析