什么是bean?
bean就是由Spring容器初始化、装配及被管理的对象,除此之外,bean就没有特别之处了(与应用中的其他对象没有什么区别)。而bean定义以及bean相互间的依赖关系将通过配置元数据来描述。
1、 bean的配置:
生命周期
1> bean的定义(见下一页表格附件)
2> bean的初始化(两种方式):
·在配置文档中通过指定init-method属性来完成(推荐)
·实现org.springframework.beans.factory.InitializingBean接口
3> bean的使用(三种)
·详细见第2节。
4> bean的销毁(两种方式):
·在配置文档中通过指定destroy-method属笥来完成(推荐)
·实现org.springframework.beans.factory.DisposableBean接口
ref的属性指定依赖的三种模式:
1> 用local性性指定:被参考引用的bean在同一个xml文件中,且是用id命名的。
2> 用bean属性指定:同一个或者不同的xml中均可(推荐)
3> 用parent属性指定:引用父bean
Bean自动装配的5种模式 autowire=***
1> byName模式 按名字自动装配
2> byType模式 按类型自动装配
3> constructor模式 按构造函数的类型自动装配
4> autodetect模式 自动按先constructor后byType模式匹配。
5> no模式 (默认) 不自动装配
Bean依赖检查的4种模式 dependency-check = ***
1> simple 对基本类型、字符串和集合进行依赖检查
2> object 对依赖的对象进行检查
3> all 对全部属属性进行检查
4> none (默认)不检查
集合的注入方式
1> List
2> Set
3> Map
4> Properties
Bean如下:
示例代码:
public class SomeBean {
private String[] someStrArray;
private SomeObj[] someObjArray;
private List someList;
private Map someMap;
private Set test;
private Properties test2;
....
}
示例配置:
<beans> <bean id="someBean" class="onlyfun.caterpillar.SomeBean"> <property name="someArray"> <list> <value>Hello!Justin!</value> <value>Hello!Momor!</value> <value>Hello!Bush!</value> </list> </property> <property name="someObjArray"> <list> <ref bean="someObj1"/> <ref bean="someObj2"/> </list> </property> <property name="someList"> <list> <value>Hello!Justin!</value> <ref bean="someObj1"/> <ref bean="someObj2"/> </list> </property> <property name="someMap"> <map> <entry key="somekey1"> <ref bean="someObj1"/> </entry> <entry key="somekey2"> <value>Hello!Justin!</value> </entry> </map> </property> <property name="test"> <set> <value>a set element</value> <ref bean="otherBean"/> <ref bean="anotherBean"/> </set> </property> <property name="test2"> <props> <prop key="someProkey1"> someProValue1 </prop> <prop key="someProkey2"> someProValue2 </prop> </props> </property> </bean> </beans>
可以配置的项目有:
1. Bean属性值及依赖关系(对其他Bean的引用)
2. Bean创建模式(是否Singleton模式,即是否只针对指定类维持全局唯一的实例)
3. Bean初始化和销毁方法
4. Bean的依赖关系
下面是一个较为完整的Bean配置示例:
<beans> <description>Spring Bean Configuration Sample</description> <bean id="TheAction" class="net.xiaxin.spring.qs.UpperAction" singleton="true" init-method="init" destroy-method="cleanup" depends-on="ActionManager" > <property name="message"> <value>HeLLo</value>
</property> <property name="desc"> <null/> </property> <property name="dataSource"> <ref local="dataSource"/>
</property> </bean> <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:comp/env/jdbc/sample</value> </property> </bean> </beans>
⑴
附2:管理bean
beans包提供了以编程的方式管理和操控bean的基本功能,而context包下的ApplicationContext以一种更加面向框架的方式增强了BeanFactory的功能。
1> BeanWrapper
1> BeanFactory
2> ApplicationContext(推荐使用的方式)
由于ApplicationContext包括了BeanFactory所有的功能,所以通常建议优先采用ApplicationContext。
ApplicationContext actx2= new FileSystemXmlApplicationContext("WebRoot\\WEB-INF\\applicationContext.xml");
或者将applicationContext.xml放在src下:
ApplicationContext actx3= new ClassPathXmlApplicationContext("applicationContext.xml");
idJava Bean在BeanFactory中的唯一标识,代码中通过BeanFactory获取
JavaBean实例时需以此作为索引名称。
⑵ class
Java Bean 类名
⑶ singleton
指定此Java Bean是否采用单例(Singleton)模式,如果设为“true”,则在
BeanFactory作用范围内,只维护此Java Bean的一个实例,代码通过BeanFactory
获得此Java Bean实例的引用。反之,如果设为“false”,则通过BeanFactory获取
此Java Bean实例时,BeanFactory每次都将创建一个新的实例返回。
⑷ init-method
初始化方法,此方法将在BeanFactory创建JavaBean实例之后,在向应用层返回引
用之前执行。一般用于一些资源的初始化工作。
⑸ destroy-method
销毁方法。此方法将在BeanFactory销毁的时候执行,一般用于资源释放。
⑹ depends-on
Bean依赖关系。一般情况下无需设定。Spring会根据情况组织各个依赖关系的构建工作(这里
示例中的depends-on属性非必须)。
只有某些特殊情况下,如JavaBean中的某些静态变量需要进行初始化(这是一种Bad
Smell,应该在设计上应该避免)。通过depends-on指定其依赖关系可保证在此Bean加
载之前,首先对depends-on所指定的资源进行加载。
⑺ <value>
通过<value/>节点可指定属性值。BeanFactory将自动根据Java Bean对应的属性
类型加以匹配。
下面的”desc”属性提供了一个null值的设定示例。注意<value></value>代表一
个空字符串,如果需要将属性值设定为null,必须使用<null/>节点。
⑻ <ref>
指定了属性对BeanFactory中其他Bean的引用关系。示例中,TheAction的dataSource属
性引用了id为dataSource的Bean。BeanFactory将在运行期创建dataSource bean实例,并将其
引用传入TheAction Bean的dataSource属性。
下面的代码演示了如何通过BeanFactory获取Bean实例:
InputStream is = new FileInputStream("bean.xml");
XmlBeanFactory factory = new XmlBeanFactory(is);
Action action = (Action) factory.getBean("TheAction");
此时我们获得的Action实例,由BeanFactory进行加载,并根据配置文件进行了初始化和属性设定。
联合上面关于BeanWrapper的内容,我们可以看到,BeanWrapper实现了针对单个Bean的属性设
定操作。而BeanFactory则是针对多个Bean的管理容器,根据给定的配置文件,BeanFactory从中读取
类名、属性名/值,然后通过Reflection机制进行Bean加载和属性设定。
附1: