首页  »   软件架构设计

spring学习札记(1)-BeanWrapper、BeanFactory篇

网友分享于:2013-11-17  浏览:5次
spring学习笔记(1)-BeanWrapper、BeanFactory篇
写写关于spring的一些东西,希望对大家有所帮助。欢迎拍砖。

在spring中,两个最重要的包是org.springframework.beans 和 org.springframework.context ,这两个包中的代码为spring的反向控制(依赖注入)提供了基础。

其中org.springframework.beans中包含了核心组件的实现类(BeanWrapper和BeanFactory类)。

BeanWrapper:

根据JavaDoc中的说明,BeanWrapper提供了设置和获取属性值(单个的或者是批量的),获取属性描述信息、查询只读或者可写属性等功能。不仅如此,BeanWrapper还支持嵌套属性,你可以不受嵌套深度限制对子属性的值进行设置。所以,BeanWrapper无需任何辅助代码就可以支持标准JavaBean的PropertyChangeListeners和VetoableChangeListeners。除此之外,BeanWrapper还提供了设置索引属性的支持。通常情况下,我们不在应用程序中直接使用BeanWrapper而是使用DataBinder 和BeanFactory。

通俗点讲:BeanWrapper就是封装了一个bean的行为,设置和获取属性值等。

下面来看个使用BeanWrapper的例子:
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;
    }
    public void showSalary(){
        System.out.println(salary);
    }
}


测试类代码片段:
Object obj = Class.forName("org.tink.beans.Company").newInstance(); 
BeanWrapper company = new BeanWrapperImpl(obj);
company.setPropertyValue("name", "Some Company Inc.");
也可以这样:
PropertyValue value = new PropertyValue("name", "Some Company Inc.");
company.setPropertyValue(value);

Object obj2 = Class.forName("org.tink.beans.Employee").newInstance();
BeanWrapper jim = new BeanWrapperImpl(obj2);
jim.setPropertyValue("salary", 4567.0);
company.setPropertyValue("managingDirector", jim.getWrappedInstance());

Float salary = (Float) company.getPropertyValue("managingDirector.salary");

System.out.println(salary);


诚然,通过这样的方式设定Java Bean属性实在繁琐,但它却提供了一个通用的属性设定机制,而这样的机制,也正是Spring依赖注入机制所依赖的基础。通过BeanWrapper,我们可以无需在编码时就指定JavaBean的实现类和属性值,通过在配置文件加以设定,就可以在运行期动态创建对象并设定其属性(依赖关系) 。


BeanFactory:

Bean Factory,顾名思义,负责创建并维护Bean实例。

Bean Factory负责根据配置文件创建Bean实例,可以配置的项目有:

1. Bean属性值及依赖关系(对其他Bean的引用)

2. Bean创建模式(是否Singleton模式,即是否只针对指定类维持全局唯一的实例)

3. Bean初始化和销毁方法

4. Bean的依赖关系

BeanFactory提供了六种方法供使用:
boolean containsBean(String):如果BeanFactory包含给定名称的bean定义(或bean实例),则返回true

Object getBean(String):返回以给定名字注册的bean实例。根据bean的配置情况,如果为singleton模式将返回一个共享的实例,否则将返回一个新建的实例。如果没有找到指定的bean,该方法可能会抛出BeansException异常(实际上将抛出NoSuchBeanDefinitionException异常),在对bean进行实例化和预处理时也可能抛出异常

Object getBean(String, Class):返回以给定名称注册的bean实例,并转换为给定class类型的实例,如果转换失败,相应的异常(BeanNotOfRequiredTypeException)将被抛出。上面的getBean(String)方法也适用该规则。

Class getType(String name):返回给定名称的bean的Class。如果没有找到指定的bean实例,则抛出NoSuchBeanDefinitionException异常。

boolean isSingleton(String):判断给定名称的bean定义(或bean实例)是否为singleton模式(singleton将在bean的作用域中讨论),如果bean没找到,则抛出NoSuchBeanDefinitionException异常。

String[] getAliases(String):返回给定bean名称的所有别名。



BeanFactory实际上是实例化,配置和管理众多bean的容器。 这些bean通常会彼此合作,因而它们之间会产生依赖。 BeanFactory使用的配置数据可以反映这些依赖关系中 (一些依赖可能不像配置数据一样可见,而是在运行期作为bean之间程序交互的函数)。

一个BeanFactory可以用接口org.springframework.beans.factory.BeanFactory表示, 这个接口有多个实现。 最常使用的的简单的eanFactory实现是org.springframework.beans.factory.xml.XmlBeanFactory。 (这里提醒一下:ApplicationContext是BeanFactory的子类, 所以大多数的用户更喜欢使用ApplicationContext的XML形式)。

虽然大多数情况下,几乎所有被BeanFactory管理的用户代码都不需要知道BeanFactory, 但是BeanFactory还是以某种方式实例化。可以使用下面的代码实例化BeanFactory:

InputStream is = new FileInputStream("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(is);
或者

ClassPathResource res = new ClassPathResource("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(res);
或者

ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
        new String[] {"applicationContext.xml", "applicationContext-part2.xml"});
BeanFactory factory = (BeanFactory) appContext;

很多情况下,用户代码不需要实例化BeanFactory, 因为Spring框架代码会做这件事。例如,web层提供支持代码,在J2EE web应用启动过程中自动载入一个Spring ApplicationContext。然后根据给定的applicationContext.xml配置文件,BeanFactory从中读取类名、属性名/值,然后通过Reflection机制进行Bean加载和属性设定。


下面来看个完整例子:( 沿用上面的bean类)
beans.xml:

<?xml version="1.0" encoding="UTF-8"?>  
<beans  
    xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  
   <bean id="employee" class="org.tink.beans.Employee">  
     <property name="salary">  
       <value>1234.0</value>  
     </property>  
   </bean>  
</beans>  

测试代码:
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");   
Employee el = (Employee)ac.getBean("employee");
el.showSalary();

相关解决方案

最新解决方案