pring bean生命周期详解
来源:互联网 发布:大数据客户流失预警 编辑:程序博客网 时间:2024/06/18 15:13
https://my.oschina.net/u/1246663/blog/207450
上下文ApplicationContext容器中的生命周期:
bean:
package com.pas.service;//引包public class PersonService implements BeanNameAware, BeanFactoryAware,ApplicationContextAware, InitializingBean, DisposableBean {private String name;public PersonService() {System.out.println("Person" + this.hashCode() + "实例化!");}public String getName() {return name;}public void setName(String name) {this.name = name;System.out.println("set方法被调用");}public void sayHi() {System.out.println("hi:" + this.name);} //自定义的初始化函数public void myinit() {System.out.println("myinit被调用");}@Overridepublic void setBeanName(String name) {System.out.println("setBeanName被调用:" + name);}/* * 传递bean工厂 */@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("setBeanFactory被调用");}@Overridepublic void setApplicationContext(ApplicationContext applicationContext)throws BeansException {System.out.println("setApplicationContext被调用");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("afterPropertiesSet被调用");} //自定义的销毁方法,配置见配置文件节public void mydes() throws Exception {System.out.println("mydes被调用,释放各种资源");}@Overridepublic void destroy() throws Exception {System.out.println("destroy被调用,释放各种资源");}}
测试函数: package com.pas.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.pas.service.PersonService;public class Test {public static void main(String[] args) {/* * 上下文ApplicationContext中的生命周期:(此处为单例scope) * 1、实例化(默认使用无参数的构造函数) * 可以重载一个无参数的构造方法 * 如果需要使用有参的构造函数实例化,需要指定factory-method等参数 * 2、设置属性(注入属性) * 调用set方法设置属性 * 3、如果实现bean名字关注BeanNameAware,调用BeanNameAware的setBeanName方法 * 4、如果实现bean工厂关注BeanFactoryAware,调用其setBeanFactory可得到factory * 5、如果你实现了 ApplicationContextAware接口,则调用方法 setApplicationContext * 该方法传递ApplicationContext * 6、如果bean 和 一个后置处理器关联,则会自动去调用 * postProcessBeforeInitialization方法 * (面向所有对象编程,切面编程) * 7、如果实现InitializingBean接口,则调用afterPropertiesSet * 8、如果配置了自定义的初始化方法,(init-method="myinit")则执行其与7之后,postProcessAfterInitialization方法 * 9、如果bean 和 一个后置处理器关联, * 则会自动去调用 postProcessAfterInitialization方法 * 10、使用我们的bean * 11、容器关闭 * 12、可以通过实现DisposableBean 接口来调用方法 destory * 13、可以在<bean destory-method="mydes"/> 调用定制的销毁方法 * * 实际开发中常见为:1->2->6->10->9->11 * 实例化->set方法->后置处理器before->使用->后置处理器before->容器关闭 */ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");out("xml加载完毕");try {PersonService ps=(PersonService) ac.getBean("personService2");ps.sayHi();} catch (Exception e) {e.printStackTrace();}}public static void out(Object s){System.out.println(s);}}
配置文件applicationContext.xml:
<!-- scope="prototype"为原型模式,每次获取都创建新对象 --><bean id="personService" destroy-method="mydes" init-method="myinit" class="com.pas.service.PersonService"><property name="name"><value>pingansheng</value></property></bean><bean id="personService2" scope="prototype" class="com.pas.service.PersonService"><property name="name"><value>小红</value></property></bean><!-- 配置自定义的后置处理器 --><bean id="postProcessor" class="com.pas.service.MyBeanPostProcessor" />
后置处理器MyBeanPostProcessor:
package com.pas.service;//importpublic class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName)throws BeansException {System.out.println("之前做些事");System.out.println("postProcessBeforeInitialization被调用");return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName)throws BeansException {System.out.println("之后做些事");System.out.println("postProcessAfterInitialization被调用");return bean;}}
测试输出: bean工厂加载完毕Person1640499969实例化!set方法被调用setBeanName被调用:personServicesetBeanFactory被调用afterPropertiesSet被调用myinit被调用hi:pingansheng
图示:Bean工厂容器bean的生命周期:
大部分代码相同,测试代码稍有差别:
package com.pas.test;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.xml.XmlBeanFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.core.io.ClassPathResource;import com.pas.service.PersonService;public class Test {public static void main(String[] args) {/* * bean工厂中bean的生命周期: * 1、实例化(默认使用无参数的构造函数) * 可以重载一个无参数的构造方法 * 如果需要使用有参的构造函数实例化,需要指定factory-method等参数 * 2、设置属性(注入属性) * 调用set方法设置属性 * 3、如果实现bean名字关注BeanNameAware,调用BeanNameAware的setBeanName方法 * 4、如果实现bean工厂关注BeanFactoryAware,调用其setBeanFactory可得到factory * 5、如果实现InitializingBean接口,则调用afterPropertiesSet * 6、如果配置了自定义的初始化方法,(init-method="myinit")则执行其与7之后,postProcessAfterInitialization方法 * 7、使用我们的bean * 8、容器关闭 * 9、可以通过实现DisposableBean 接口来调用方法 destory * 10、可以在<bean destory-method="mydes"/> 调用定制的销毁方法 */BeanFactory fc=new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));out("bean工厂加载完毕");try {PersonService ps=(PersonService) fc.getBean("personService");ps.sayHi();} catch (Exception e) {e.printStackTrace();}}public static void out(Object s){System.out.println(s);}}
bean工厂加载完毕Person371789756实例化!set方法被调用setBeanName被调用:personServicesetBeanFactory被调用afterPropertiesSet被调用myinit被调用hi:pingansheng
![](http://static.oschina.net/uploads/space/2014/0312/110918_Ptee_1246663.png)
0 0
- pring bean生命周期详解
- Spring Bean配置默认为单实例 pring Bean生命周期
- Spring Bean配置默认为单实例 pring Bean生命周期
- Spring Bean配置默认为单实例 pring Bean生命周期
- Bean的生命周期详解
- Spring Bean生命周期详解
- Spring-Bean生命周期详解
- Spring Bean生命周期详解
- Spring Bean生命周期详解
- pring中lazy-init详解
- Spring bean 的生命周期的详解
- 详解Spring中bean的生命周期
- spring中bean的生命周期详解
- Spring bean 的生命周期的详解
- Spring IOC -bean对象的生命周期详解
- Spring bean 的生命周期的详解
- spring中bean的生命周期详解
- Spring IOC -bean对象的生命周期详解
- hdu 5548 sort 2016青岛区域赛网络赛 二分+队列优化
- Struts2_09_参数的编码问题
- 深入理解类加载机制
- Spring Boot基础教程5-日志配置-logback和log4j2
- Android学习笔记之ListView
- pring bean生命周期详解
- 美团O2O排序解决方案——线下篇
- 151. Reverse Words in a String
- .NET 类库和工具
- 九度1069
- 根据inode编号来删除文件或目录
- Ruby的require工作
- Spring Bean 生命周期
- 并发容器