您的位置:首页 > 编程语言 > Java开发

Spring3之Bean基本配置和生命周期

2015-11-25 00:00 639 查看
Bean的概念
由IoC容器管理的那些组成你应用程序的对象我们就叫它Bean, Bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。

Bean的命名
每个Bean可以有一个或多个id(或称之为标识符或名字),在这里我们把第一个id称为“标识符”,其余id叫做“别名”;这些id在IoC容器中必须唯一。如何为Bean指定id呢,有以下几种方式:

不指定id,只配置必须的全限定类名,由IoC容器为其生成一个标识,客户端必须通过接口getBean(classname.class)获取Bean;

指定id,必须在Ioc容器中唯一;通过getBean("id",classname.class)获取

指定name,这样name就是“标识符”,必须在Ioc容器中唯一;

指定id和name,id就是标识符,而name就是别名,必须在Ioc容器中唯一;

指定多个name,多个name用“,”、“;”、“ ”分割,第一个被用作标识符,其他的(alias1、alias2、alias3)是别名,所有标识符也必须在Ioc容器中唯一;

使用<alias>标签指定别名,别名也必须在IoC容器中唯一

<bean name="bean1;alias11,alias12;alias13 alias14" class="com.chou.spring.bean.MyBeanA"/>
<!-- 当指定id时,name指定的标识符全部为别名 -->
<bean id="bean2" name="alias21;alias22" class="com.chou.spring.bean.MyBeanB"/>
<!-- 如果id和name一样,IoC容器能检测到,并消除冲突 -->
<bean id="bean3" id="bean3" class="com.chou.spring.bean.MyBeanC"/>


具体用法可以参考此博客http://jinnianshilongnian.iteye.com/blog/1413857

Bean命名约定:
Bean的命名遵循XML命名规范,但最好符合Java命名规范,由“字母、数字、下划线组成“,而且应该养成一个良好的命名习惯, 比如采用“驼峰式”,即第一个单词首字母开始,从第二个单词开始首字母大写开始,这样可以增加可读性。

<beans>标签里面一些默认的值:

<beans xmlns="http://www.springframework.org/schema/beans"
.....
default-lazy-init="false" default-autowire="no"
default-init-method="MyInit" default-destroy-method="Mydestory">
<bean ...../>
</beans>


配置默认default-lazy-init为false
当然,也不是所有的beans都能设置default-lazy-init成为true.对于scheduler的bean不能用lazy-init,如果懒加载了所有的scheduler定时器就都不管用了

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property  name ="triggers">
<list>
<ref bean="buildHtmlTrigger"/>
<ref bean="mailSenderTrigger"/>
<ref bean="topicBuildTrigger"/>
</list>
</property>
</ bean >
</beans>


下面是关于Bean生命周期的配置

延迟初始化Bean

<bean id="bean_b" class="com.chou.spring.bean.MyBeanB" lazy-init="true">
<property name="beanA" ref="bean_a"/>
</bean>


● lazy-init延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean。
● Spring容器会在创建容器时提前初始化“singleton”作用域Bean,“singleton”就是单例的意思即整个容器每个Bean只有一个实例,Spring容器预先初始化Bean通常能帮助我们提前发现配置错误,所以如果没有什么情况建议保持默认单例,除非有某个Bean可能需要加载很大资源,而且很可能在整个应用程序生命周期中很可能使用不到,可以设置为延迟初始化。
● 延迟初始化的Bean通常会在第一次使用时被初始化;或者在被非延迟初始化Bean作为依赖对象注入时在会随着初始化该Bean时被初始化,因为在这时使用了延迟初始化Bean。
● 容器管理初始化Bean消除了编程实现延迟初始化,完全由容器控制,只需在需要延迟初始化的Bean定义上配置即可,比编程方式更简单,而且是无侵入代码的。

Bean初始化顺序
depends-on:指当前Bean初始化及销毁时的顺序,使用depends-on属性值指定的Bean要先初始化完毕后才初始化当前Bean,由于只有“singleton”Bean能被Spring管理销毁,所以当指定的Bean都是“singleton”时,使用depends-on属性指定当前的Bean要在指定的Bean之后销毁。
init-method="init":指定Bean初始化时调用的方法,在构造器注入和setter注入完毕后执行。
destroy-method="destroy":指定Bean销毁时调用方法,只有“singleton”作用域能销毁,“prototype”作用域的一定不能,其他作用域不一定能;在Spring容器中如果没指定作用域默认就是“singleton”

<bean id="bean_a" class="com.chou.spring.bean.MyBeanA"
init-method="MyInit" destroy-method="Mydestory"/>

<bean id="bean_b" class="com.chou.spring.bean.MyBeanB" depends-on="bean_a">
<property name="beanA" ref="bean_a"/>
</bean>


● “bean_b”指定了“depends-on”属性为“bean_a”,所以在“bean_b”Bean初始化之前要先初始化“bean_a”,而在销毁“bean_a”之前先要销毁“bean_b”,其实通俗点理解就是depends-on属性就是给自己指定一个Bean,你要在初始化的时候挡在我前面先初始化,在我销毁之前你也要比我先销毁,可以说是找个垫背的bean。
● “depends-on”属性可以指定多个Bean,若指定多个Bean可以用“;”、“,”、空格分割。
● 那“depends-on”有什么好处呢?主要是给出明确的初始化及销毁顺序,比如要初始化“bean_b”时要确保“bean_a”Bean的资源准备好了,否则使用“bean_b”时会看不到准备的资源;而在销毁时要先在“bean_b”Bean里把对“bean_a”资源的引用释放掉才能销毁“bean_b”,否则可能销毁 “bean_a”时而“bean_b”还保持着资源访问,造成资源不能释放或释放错误。

例如:在平常开发中我们可能需要访问文件系统,而文件打开、关闭是必须配对的,不能打开后不关闭,从而造成其他程序不能访问该文件。
可以参考这个博客的列子,写的很有代表性:http://jinnianshilongnian.iteye.com/blog/1415461
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring bean xml ioc