Spring Framework 4.0 官方文档核心内容整理之 --- XML方式配置Bean
Spring框架的核心部分就是Ioc容器,而Ioc控制的就是各种Bean,一个Spring项目的水平往往从其XML配置文件内容就能略知一二,很多项目,往往是外包公司的项目,配置文件往往是乱七八糟,抱着能跑就行,不报错就行的态度去写,然后在项目中后期发现各种缺失又去一通乱补,其结果就是,整个文档可读性极差,毫无章法。这也不能怪写这个XML的人,拿着苦逼程序员的工资干着架构师的工作必然是这个结果。为了程序员的幸福,我认为有必要来一套简单快速的官方文档核心配置归纳整理和解释,好让苦逼猿们在工作中能正确快速的提高自身和项目的整体水平。
<bean class="这个Bean的类"
name/id="Bean在容器里面的唯一名称"
scope="Bean的生命周期,详细解释看下面"
autowiring-mode="这个Bean的properties的自动注入方式,详细解释看下面"
lazy-init="是否为懒加载,详细解释看下面"
init-method="容器初始化该Bean后的回调方法,详细解释看下面"
destroy-method = "容器在销毁该Bean后的回调方法,详细解释看下面"
abstract="是否为抽象Bean,主要用来统一XML配置文档里面的很多Bean的属性配置,与Java的Abstract Class无任何关系"
parent="父Bean的名称,会继承父Bean的属性,也是只在配置文档中有效,与Java的Class无任何关系"
factory-method="工厂方法的名字"
factory-bean="工厂Bean的名字"
depends-on ="依赖Bean的名字,Spring保证会在初始化这个Bean前先初始化被依赖的Beans,这个属性不会被子Bean继承,子Bean要重新写自己的depends-on"
autowire-candidate = "是否为自动注入的候选,一般当其他Bean设置autowiring-mode属性为自动搜寻时可以避免或允许该Bean被列入匹配列表"
primary = "是否将该Bean在其他Bean的自动注入候选人中设为首选"
>
// Constructor-arg方式给属性赋值写法一
<constructor-arg type="int" value="7500000"/>
// Constructor-arg方式给属性赋值写法二
<constructor-arg name="years" value="7500000"/>
// Constructor-arg方式给属性赋值写法三
<constructor-arg index="0" value="7500000"/>
// Properties方式给属性赋值写法一
<property name="beanOne">
<ref bean="另外一个Bean的名字"/>
</property>
// Properties方式给属性赋值写法二
<property name="beanOne" ref="另外一个Bean的名字"/>
// Properties方式给属性赋值写法三
<property name="integerProperty" value="1"/>
</bean>
Spring Bean 的XML描述文档有下列属性
class (Bean的Class) | 声明用于生成Bean的Class。 |
name (Bean的名称) | Bean 在该环境的唯一名称。 可以用 id 或 name 来声明 |
scope (Bean的生命周期) | Bean 的模式,Spring 官方文档描述如下 单例模式(singleton): 默认的Bean模式,注意区别是Spring的Bean是每个容器允许一个单例,而不是每个类加载器一个单例,所有需要被注入的Bean都会得到该Bean的一个引用。 原型模式 (prototype): 每一个将该Bean注入其他Bean中都会注入一个该Bean的新实例。Spring对原型模式的Bean会进行构造,编译和初始化,但是不会执行销毁回调方法,就算该Bean定义了销毁回调方法也不会被Spring执行,需要自己实现Bean Post Processor。 请求模式 (request): 该Bean在每一个Http请求时都会新生成一个只对应该请求的Bean。只有在该Web应用的上下文中有效。 会话模式 (session): 该Bean在每一个Session的生命周期中存在。只有在该Web应用的上下文中有效。 全局会话模式 (global session) : 该Bean在每一个全局Session的生命周期中存在。一般用在portlet里。 自定义模式 (custom): 通过扩展或重写Spring预定义的Bean Scope。 |
constructor-arg (参数注入方法一) | 构造方式注入参数 , 可以按照类型或者序号或者名称来赋值 例如 通过使用下面的几种方式 都能完成一样的事
最后这个方式要修改下Class,添加如下注解 |
properties(参数注入方法二) | Setter方式注入参数 |
autowiring mode 属性自动关联模式 (项目里最好就使用默认的No选项,或者直接不写,如果一定要用,可以在不需要被关联Bean里定义,autowire-candidate=false) | no (默认): 不可被自动关联,要关联这个Bean的属性只能用 ref 元素来配。不建议在大型应用中使用其他模式。
byName : Spring会按照这个bean里的属性名字去找相应的Bean然后关联。 byType : Spring会按照这个bean里的属性类型去找相应的Bean然后关联。如果没找到,这个属性就是Null,如果在文档里找到了多个同类型的Bean,则会报错。 constructor : Spring会在其他Bean的constructor描述里找,如果找到多个,则会报错 |
lazy-initialization mode (懒加载模式) | 容器对Bean的初始化方式,如果不写,则默认为饥渴模式, 如果写<bean id="xxxxx" class="com.xxx" lazy-init="true"/> 则容器会在第一次需要这个Bean的时候才去初始化。 |
initialization method (初始化后回调方法) | <bean id="xxx" class="xxx.xxx" init-method="init"/> Spring会在该Bean初始化完成后执行init方法 public class xxx { public void init() { } } |
destruction method (销毁后回调方法 ) | <bean id="xxx" class="xxx.xxx" destroy-method="cleanup" /> Spring会在该Bean销毁后执行此方法 public class xxx { public void cleanup() { // do some destruction work (like releasing pooled connections) } } |