Spring中Bean的完整生命周期
1) instantiate bean对象实例化
2) populate properties 封装属性
3) 如果Bean实现BeanNameAware 执行 setBeanName
4) 如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext
5) 如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization
6) 如果Bean实现InitializingBean 执行 afterPropertiesSet
7) 调用<bean init-method="XXX"> 指定初始化方法
8) 如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization
9) 执行业务处理
10)如果Bean实现 DisposableBean 执行 destroy
11)调用<bean destroy-method="XXX"> 指定销毁方法
接口
public interface ILifecycle { public void method(); }
实现类
public class LifecycleImpl implements ILifecycle, BeanNameAware, ApplicationContextAware, InitializingBean, DisposableBean { public LifecycleImpl() { System.out.println("1) instantiate bean对象实例化"); } public void myInit() { System.out.println("7) 调用<bean init-method=\"myInit\"> 指定初始化方法 "); } public void myDestroy(){ System.out.println("11)调用<bean destroy-method=\"myDestroy\"> 指定销毁方法 "); } @Override public void method() { System.out.println("9) 执行业务处理"); } public void setProperty(String info) { System.out.println("2) populate properties 封装属性"); } @Override public void setBeanName(String name) { System.out.println("3) 如果Bean实现BeanNameAware 执行 setBeanName.--->" + name); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("4) 如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext.--->" + applicationContext); } @Override public void afterPropertiesSet() throws Exception { System.out.println("6) 如果Bean实现InitializingBean 执行 afterPropertiesSet "); } @Override public void destroy() throws Exception { System.out.println("10)如果Bean实现 DisposableBean 执行 destroy"); } }
后处理bean,对容器内所有bean有效
public class BeanProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException { System.out.println("5) 如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization"); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("8) 如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization"); return bean; } }
配置
<bean id="lifecycle" class="demo02.LifecycleImpl" init-method="myInit" destroy-method="myDestroy"> <property name="property" value="注入"></property> </bean> <bean class="demo02.BeanProcessor"></bean>
测试
@Test public void demo1(){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); LifecycleImpl bean = context.getBean("lifecycle",LifecycleImpl.class); bean.method(); context.close(); } /** 1) instantiate bean对象实例化 2) populate properties 封装属性 3) 如果Bean实现BeanNameAware 执行 setBeanName.--->lifecycle 4) 如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext.--->org.springframework.context.support.ClassPathXmlApplicationContext@6fc5f743: startup date [Mon Sep 07 22:27:22 CST 2015]; root of context hierarchy 5) 如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization 6) 如果Bean实现InitializingBean 执行 afterPropertiesSet 7) 调用<bean init-method="myInit"> 指定初始化方法 8) 如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization 9) 执行业务处理 22:27:22,535 INFO ClassPathXmlApplicationContext:1042 - Closing org.springframework.context.support.ClassPathXmlApplicationContext@6fc5f743: startup date [Mon Sep 07 22:27:22 CST 2015]; root of context hierarchy 22:27:22,535 INFO DefaultListableBeanFactory:444 - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@731d2572: defining beans [lifecycle,demo02.BeanProcessor#0]; root of factory hierarchy 10)如果Bean实现 DisposableBean 执行 destroy 11)调用<bean destroy-method="myDestroy"> 指定销毁方法 */
可以在实现BeanPostProcessor类里对原有业务方法进行增强处理
public class BeanProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("5) 如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization"); return bean; } @Override public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException { System.out.println("8) 如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization"); if (beanName.equals("lifecycle")) { return Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("method")) { System.out.println("增强method======================================="); } return method.invoke(bean, args); } }); } return bean; } }
输出:
/** 1) instantiate bean对象实例化 2) populate properties 封装属性 3) 如果Bean实现BeanNameAware 执行 setBeanName.--->lifecycle 4) 如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext.--->org.springframework.context.support.ClassPathXmlApplicationContext@2dec8909: startup date [Tue Sep 08 09:10:45 CST 2015]; root of context hierarchy 5) 如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization 6) 如果Bean实现InitializingBean 执行 afterPropertiesSet 7) 调用<bean init-method="myInit"> 指定初始化方法 8) 如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization 增强method======================================= 9) 执行业务处理 09:10:45,408 INFO ClassPathXmlApplicationContext:1042 - Closing org.springframework.context.support.ClassPathXmlApplicationContext@2dec8909: startup date [Tue Sep 08 09:10:45 CST 2015]; root of context hierarchy 09:10:45,408 INFO DefaultListableBeanFactory:444 - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@7e859a68: defining beans [lifecycle,demo02.BeanProcessor#0]; root of factory hierarchy 10)如果Bean实现 DisposableBean 执行 destroy 11)调用<bean destroy-method="myDestroy"> 指定销毁方法 */
相关推荐
3.5.2 ApplicationContext中Bean的生命周期 3.6 小结 第4章 在IoC容器中装配Bean 4.1 Spring配置概述 4.1.1 Spring容器高层视图 4.1.2 基于XML的配置 4.2 Bean基本配置 4.2.1 装配一个Bean 4.2.2 Bean的命名 4.3 ...
3.5.2 ApplicationContext中Bean的生命周期 3.6 小结 第4章 在IoC容器中装配Bean 4.1 Spring配置概述 4.1.1 Spring容器高层视图 4.1.2 基于XML的配置 4.2 Bean基本配置 4.2.1 装配一个Bean 4.2.2 Bean的命名 4.3 ...
7.3.1. 通知的生命周期 7.3.2. Spring里的通知类型 7.3.2.1. 拦截around通知 7.3.2.2. 前置通知 7.3.2.3. 异常通知 7.3.2.4. 后置通知 7.3.2.5. 引入通知 7.4. Spring里的advisor(Advisor) API 7.5. 使用...
7.3.1. 通知的生命周期 7.3.2. Spring里的通知类型 7.4. Spring里的advisor(Advisor) API 7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对...
3.5.1. 生命周期回调 3.5.2. 了解自己 3.6. bean定义的继承 3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 ...
7.3.1. 通知的生命周期 7.3.2. Spring里的通知类型 7.4. Spring里的advisor(Advisor) API 7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对...
3.5.1. 生命周期回调 3.5.2. 了解自己 3.6. bean定义的继承 3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 ...
5.2 控制托管bean生命周期 5.3 JSF表达式语言 5.3.1 JSFl.1 与JSFl.2 之间表达式语言的关键区别 5.3.2 统一EL概念 5.3.3 值表达式 5.3.4 表达式操作符 5.3.5 方法表达式 5.4 托管bean的Web应用程序开发细节 5.4.1 ...
主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e技术入门、Hibernate高级应用、Spring核心之IoC、...
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、... 文件上传用到MultipartFile类,需要引入相关插件并在MVC配置文件中配置multipartResolver解析器bean 2. 将thy
241、bean 实例的生命周期 56 242、激活机制 56 243、remote接口和home接口主要作用 56 244、客服端调用EJB对象的几个基本步骤 56 245、 如何给weblogic指定大小的内存? 56 246、如何设定的weblogic的热启动模式...
241、bean 实例的生命周期 56 242、激活机制 56 243、remote接口和home接口主要作用 56 244、客服端调用EJB对象的几个基本步骤 56 245、 如何给weblogic指定大小的内存? 56 246、如何设定的weblogic的热启动模式...