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容器中唯一
具体用法可以参考此博客http://jinnianshilongnian.iteye.com/blog/1413857
Bean命名约定:
Bean的命名遵循XML命名规范,但最好符合Java命名规范,由“字母、数字、下划线组成“,而且应该养成一个良好的命名习惯, 比如采用“驼峰式”,即第一个单词首字母开始,从第二个单词开始首字母大写开始,这样可以增加可读性。
<beans>标签里面一些默认的值:
配置默认default-lazy-init为false
当然,也不是所有的beans都能设置default-lazy-init成为true.对于scheduler的bean不能用lazy-init,如果懒加载了所有的scheduler定时器就都不管用了
下面是关于Bean生命周期的配置
延迟初始化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_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
由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
相关文章推荐
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- XML 与 JSON 优劣对比
- As3.0 xml + Loader应用代码
- 网马生成器 MS Internet Explorer XML Parsing Buffer Overflow Exploit (vista) 0day
- ext读取两种结构的xml的代码
- C#针对xml基本操作及保存配置文件应用实例
- Ruby程序中创建和解析XML文件的方法
- asp下查询xml的实现代码
- sqlserver FOR XML PATH 语句的应用
- 使用sp_xml_preparedocument处理XML文档的方法
- EBS xml publisher中文乱码问题及解决办法
- C#中的Linq to Xml详解
- C#操作XML文件实例汇总
- SQL Server中的XML数据进行insert、update、delete
- SQL Server中的XML数据进行insert、update、delete操作实现代码
- 关于SQLServer2005的学习笔记 XML的处理
- C#通过DataSet读写xml文件的方法