“http://www.springframeork.org/dtd/spring-beans.dtd”>
singleton=”true/false” ①(可选) depends-on=”Spring容器中被依赖的Bean的ID名” ②(可选) autowire=”no/byName/byType/constructor/autodetect” ③(可选) dependency-check=”none/simple/object/all” ④(可选) init-method=”设置依赖关系注入后执行的方法名” destroy-method=”设置Bean在销毁前执行的方法名” abstract=”true/false”⑥ parent=”父类bean的ID名”>⑦
注: ①如果一个bean的singleton属性设置成true,表示整个Spring容器里只有一个共享实例存在,如果设置成false,表示每次请求该ID的bean,Spring都会新建一个bean实例.该属性默认值为true.JAVA在创建和销毁JAVA实例时,都会导致系统开销.除非必要,尽量避免将bean的singleton属性设置成no-singleton行为.
②在极端情况下,bean之间的依赖不够直接,可以使用depends-on属性在初始化主调bean之前,强制一个或多个bean初始化
③Spring能自动装配bean与bean之间的依赖关系,也就是无需使用ref显式指定依赖bean,可以通过bean元素的autowire属性指定自动装配,让某些bean使用自动装配,而某些bean不使用。自动装配可以减少配置文件的工作量。
no:不使用自动装配,Bean依赖必须通过ref元素定义。这是默认的配置。
byName:根据属性名自动装配。即找到当前bean的属性中有与Spring容器中的bean元素的ID名匹配的。如果有就装配,没有就不装配。
byType:根据属性类型自动装配。Spring容器先查找当前类属性的类型与容器中全部bean类型是否有相同的,如果有就自动装配。如果有多个这样的bean就会抛出异常。
constructor:与byType类似,区别是有于构造注入的参数。如果容器中的bean没有与构造方法中的参数类型匹配的,就会抛出异常。
Autodetect:容器根据bean内部结构,来决定使用constructor还是byType.如果找到一个默认的不代参数的构造方法,那就会使用byType.
④dependency-check属性用来检查bean的属性的默认值是否有效.
none:不进行依赖检查,没有指定值的bean属性仅仅是没有设值.
simple:仅对基本类型和集合(除了合作者的Bean)进行依赖检查
object:仅对合作者bean进行依赖检查
all:对合作者bean,基本类型和集合全部进行依赖检查.
⑤使用bean元素里的lookup-method子元素是指容器能重写容器中的bean的抽象或具体方法,返回查找容器中其他bean的结果,当被依赖的bean的singleton属性为false时,此方法将每次产生一个新的对象.lookup方法注入不仅能用于设置注入,也可用于构造注入.
⑥当bean元素里abstract属性为true时,指明该bean是抽象bean,不能为实例化,因为上抽象bean不能被实例化,因此抽象bean可以没有class属性.因为抽象bean不能实例化,既不能通过getBean获得抽象bean,也不能让其它bean的ref指向该bean.
⑦设置了该bean的parent属性指向该bean的父类的ID,表示该bean继承这个父类.当子类指定了init-method,destroy-method和factory-medthod属性,则它们会覆盖父类的定义.子类无法从父类继承depends-on,autowire,dependency-check,singleton,lazy-init.如果父类定义指定了class属性,子类可以省略class属性.
高级依赖注入的配置
前面的依赖注入,要么是javabean式的值,要么是直接依赖于其它bean.实际应用中,某个实例的属性可能是某个方法的返回值,类的field值,或者者属性值.
属性值的依赖注入:
方法一: 把获得的值注入到其它的Bean里
Class=”org.springframework..beans.factory.config.PropertyPathFactoryBean”>
方法二: 用获得的值创建一个新Bean
Field值的依赖注入:
方法一:把获得的值注入到其它的Bean里
FieldRetrievingFactoryBean”>
方法二:用获得的值创建一个新Bean
java.sql.Connection.TRANSACTION_SERIALIZABLE
方法返回值的依赖注入:
方法一:某个对象方法的值
方法二:获得静态方法的值
BeanFactoryPostProcessor的实现类
1.PropertyPlaceholderConfigurer (属性占位符配置器)
PropertyPlaceholderConfigurer可以读取java properties文件中的属性,然后插入BeanFacotry定义中,从而,无须对BeanFactory主XML定义进行修改,就可以修改一些基本属性(比如说数据库的urls,用户名,密码)
2.PropertyOverrideConfigurer是BeanFactoryPostProcessor另一个实现类,它使用的属性文件用于覆盖xml配置文件中的默认值.
注:properties属性文件格式必须是: beanName.property=value
通过配置文件设置工厂bean和产品bean
在容器中的bean本身就是工厂,其作用是产生其他bean实例,通常情况这种bean没有特殊要求,仅需要提供一个工厂方法,该方法用来返回其它的bean实例.工厂bean配置和其他bean的配置也没有任何区别.产品bean就是由工厂bean产生的实例,不再由Spring容器产生,因此与普通bean配置不同,不再需要提供class元素.
Factory-method=”指定产生该产品bean的工厂bean方法名”>
MethodInvokingFactoryBean”>
//可以有多个参数