spring的bean的生命周期
来源:互联网 发布:淘宝软妹服装店铺 编辑:程序博客网 时间:2024/06/15 02:47
Spring的bean生命周期分为11步
1、初始化bean,调用构造函数,创建bean实例
2、对其bean的属性进行注入赋值
3、如果bean实现BeanNameAware接口,执行setBeanName方法
4、如果bean实现BeanFactoryAware或ApplicationContextAware接口,将会执行setBeanFactory方法,可以获取到上下文对象BeanFactory
5、如果有其他类实现了BeanPostProcessor接口,将会执行postProcessBeforeInitialization方法
6、如果bean实现InitializingBean接口,将执行afterPropertiesSet方法
7、我们可以自定义一个bean类的初始化方法,例如:initBean方法,这个需要在配置文件中设置,才能执行
8、这一步跟第五步是同一个类,也就是其他类实现了BeanPostProcessor接口,但它将会执行postProcessAfterInitialization方法
9、这是执行的我们自己将要执行的业务方法,这里举例使用show方法
10、如果bean实现DisposableBean接口,将会执行destroy方法
11、可以自定义一个bean类的销毁方法,例如:destroyBean方法,这个需要在配置文件中设置,才能执行
第五步和第八步可以对bean进行功能增强,一般会使用动态代理技术,也是spring的AOP(面向切面)编程的方式
上面列举了具体的11步,下面使用一个例子列举
这是bean类
LifeCycleBean.java
package cn.ioc.lifecycle;import org.springframework.beans.BeansException;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.BeanFactoryAware;import org.springframework.beans.factory.BeanNameAware;import org.springframework.beans.factory.DisposableBean;import org.springframework.beans.factory.InitializingBean;public class LifeCycleBean implements BeanNameAware,BeanFactoryAware,InitializingBean,DisposableBean{ private String info; public LifeCycleBean() { super(); System.out.println("第一步:使用无参构造实例化对象"); } public void setInfo(String info) { System.out.println("第二步:info属性封装"); this.info = info; } public void show(){ System.out.println("第九步:这是我自己定义的一个方法,执行我的业务"+info); } @Override public void setBeanName(String name) { System.out.println("第三步:获取BeanName的名字--"+name); } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { System.out.println("第四步:获取到BeanFactory对象"+beanFactory); } @Override public void afterPropertiesSet() throws Exception { System.out.println("第六步:Spring自带的Bean初始化"); } public void initBean(){ System.out.println("第七步:这是我自己定义的一个Bean初始化"); } @Override public void destroy() throws Exception { System.out.println("第十步:这是Spring自带的Bean清除"); } public void destroyBean(){ System.out.println("第十一步:这是我自己定义的一个Bean清除"); }}
这个一个实现了BeanPostProcessor接口的类
ProxyBean.java
package cn.ioc.lifecycle;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;public class ProxyBean implements BeanPostProcessor{ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("第五步:代理类的初始化Bean"+" "+bean+" 执行的类名:"+beanName); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("第八步:代理类的后处理Bean"+" "+bean+" 执行的类名:"+beanName); return bean; }}
配置文件:
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 指定实现了BeanPostProcessor接口的类 --> <bean class="cn.ioc.lifecycle.ProxyBean"></bean> <!-- init-method:指定自定义初始化方法名称 destroy-method:指定自定义销毁方法名称 --> <bean name="LifeCycleBeanTest" class="cn.ioc.lifecycle.LifeCycleBean" init-method="initBean" destroy-method="destroyBean"> <!-- 为bean类的属性赋值 --> <property name="info" value="spring生命周期展示"></property> </bean></beans>
测试类
LifeCycleTest.java
package cn.ioc.test;import org.junit.Test;import org.springframework.context.support.ClassPathXmlApplicationContext;import cn.ioc.lifecycle.LifeCycleBean;public class LifeCycleTest { @Test public void test1(){ //读取配置文件 ClassPathXmlApplicationContext applicationContex = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); //获取bean对象 LifeCycleBean bean = (LifeCycleBean) applicationContex.getBean("LifeCycleBeanTest"); //自定义方法执行 bean.show(); //关闭时,bean对象销毁 applicationContex.close(); }}
测试结果:
第一步:使用无参构造实例化对象第二步:info属性封装第三步:获取BeanName的名字--LifeCycleBeanTest第四步:获取到BeanFactory对象org.springframework.beans.factory.support.DefaultListableBeanFactory@544fe44c: defining beans [cn.ioc.lifecycle.ProxyBean#0,LifeCycleBeanTest]; root of factory hierarchy第五步:代理类的初始化Bean cn.ioc.lifecycle.LifeCycleBean@4eb7f003 执行的类名:LifeCycleBeanTest第六步:Spring自带的Bean初始化第七步:这是我自己定义的一个Bean初始化第八步:代理类的后处理Bean cn.ioc.lifecycle.LifeCycleBean@4eb7f003 执行的类名:LifeCycleBeanTest第九步:这是我自己定义的一个方法,执行我的业务spring生命周期展示第十步:这是Spring自带的Bean清除第十一步:这是我自己定义的一个Bean清除
- Spring Bean的生命周期
- Spring Bean的生命周期
- spring - bean的生命周期
- Spring Bean的生命周期
- spring bean 的生命周期
- Spring bean的生命周期
- spring bean的生命周期
- Spring Bean的生命周期
- Spring Bean的生命周期
- Spring bean的生命周期
- Spring Bean的生命周期
- Spring Bean的生命周期
- Spring bean的生命周期
- Spring Bean的生命周期
- Spring Bean的生命周期
- Spring Bean 的生命周期
- spring Bean的生命周期
- spring Bean的生命周期
- 获取优酷(youku),土豆(tudou),乐视(letv),爱奇艺(iqiyi)等HTML5页面上的视频真正地址
- 浅谈JDBC
- 2017-04-23(long long 读入!!!)
- LeetCode#234. Palindrome Linked List
- [Math]学习四元数-由虚数引入四元数(1)-旋转
- spring的bean的生命周期
- nginx基础入门
- Leetcode——72 Edit Distance && 97Interleaving String
- 算法课第9周第1题——474. Ones and Zeroes
- bzoj 1150 [CTSC2007]数据备份Backup
- Mybatis的Mapper.xml文件中如何遍历一个对象的集合属性
- Android--tools:context的作用
- VMware Workstation 12.5.0 简体中文版 安装 激活密钥
- Java面试准备十九:IO