`

Spring part 2 :Bean的生命周期

 
阅读更多

 

 

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"> 指定销毁方法 
*/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Spring.3.x企业应用开发实战(完整版).part2

    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 ...

    Spring3.x企业应用开发实战(完整版) part1

    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 ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    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. 使用...

    Spring 2.0 开发参考手册

    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. 对...

    Spring中文帮助文档

    3.5.1. 生命周期回调 3.5.2. 了解自己 3.6. bean定义的继承 3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 ...

    spring chm文档

    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. 对...

    Spring API

    3.5.1. 生命周期回调 3.5.2. 了解自己 3.6. bean定义的继承 3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 ...

    JavaServer Faces 2.0完全参考手册(JSF2.0中文版).part1

    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编程宝典-十年典藏版.pdf.part2(共2个)

    主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e技术入门、Hibernate高级应用、Spring核心之IoC、...

    基于SSM框架+Mysql的企业CRM客户关系管理系统项目源码+数据库+项目说明.zip

    【资源说明】 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的热启动模式...

    java面试宝典

    241、bean 实例的生命周期 56 242、激活机制 56 243、remote接口和home接口主要作用 56 244、客服端调用EJB对象的几个基本步骤 56 245、 如何给weblogic指定大小的内存? 56 246、如何设定的weblogic的热启动模式...

Global site tag (gtag.js) - Google Analytics