`

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宝典源码part2

    2. **Bean的生命周期管理**:Spring容器负责Bean的创建、初始化、配置、装配以及销毁。了解Bean的生命周期,包括初始化回调、属性设置、后初始化回调等,对于优化应用性能和解决潜在问题至关重要。 3. **AOP**:...

    spring in action 第二版 part1-part3

    Part2:Spring MVC与Web开发 在这一部分,书中详细阐述了Spring MVC框架,它是Spring用于构建Web应用程序的主要模块。读者将了解如何创建控制器、模型、视图和解析器,以及如何使用Spring MVC处理HTTP请求和响应。...

    精通spring(part 4)共分5个part (罗时飞)

    Spring的核心容器主要包括BeanFactory和ApplicationContext,它们负责管理对象的生命周期和依赖关系。 #### 1.2 Spring框架的优点 - **非侵入式设计**:Spring采用依赖注入(Dependency Injection, DI)和面向接口...

    SpringInAction2-part1-pic

    通过XML配置文件或注解,开发者可以定义Bean的生命周期和依赖关系,实现灵活的控制。 此外,书中还深入探讨了Spring的AOP模块,这是处理横切关注点,如日志记录、事务管理、安全检查等的机制。AOP允许我们将这些...

    spring part 1

    1. **Spring IoC容器**:IoC是Spring的核心,它负责管理对象的生命周期和对象之间的依赖关系。通过XML配置或注解,我们可以定义bean及其依赖,容器负责实例化、配置和组装这些bean。 2. **Bean的定义与初始化**:...

    Spring ActionScript 开发教程

    - **Part2:安装Spring ActionScript Framework** - 这一步骤涉及到如何在开发环境中安装Spring ActionScript框架。 - 可能包括添加库路径、配置编译器等步骤。 - **Part3: 使用Spring ActionScript中的XML配置** ...

    ssm-spring-part.rar

    Spring的IoC容器负责管理对象的生命周期和依赖关系。在XML配置文件中,我们可以定义bean(对象)及其属性,以及它们之间的依赖关系。IoC使得代码更加解耦,提高了可测试性和可维护性。 3. **`spring-xml-practice-...

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

    Spring 3.x企业应用开发实战光盘源码part02

    2. **IoC容器**:Spring的IoC容器负责创建对象、管理它们的生命周期和装配这些对象。它可以读取配置元数据(如XML或Java注解),根据这些信息创建和组装对象。 3. **AOP**:Spring的AOP支持使开发者能以声明的方式...

    精通spring(part 5)共分5个part (罗时飞)

    - Bean的生命周期包括实例化、初始化、销毁等阶段。 - 初始化:可以通过实现`InitializingBean`接口或使用`@PostConstruct`注解来实现。 - 销毁:可以通过实现`DisposableBean`接口或使用`@PreDestroy`注解来实现。 ...

    精通spring(part 1)共分5个part (罗时飞)

    - **IoC容器**:IoC容器是Spring的核心部分,负责管理对象的生命周期和配置。通过XML或注解的方式定义Bean,Spring IoC容器能够自动创建并注入所需的依赖。 - **AOP实现**:Spring AOP提供了强大的AOP支持,可以通过...

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

    开发者突击:Java Web主流框架整合开发(part03和part04)(共6个压缩包)

    学习者会了解到Servlet生命周期、请求响应处理以及JSP脚本元素、EL表达式和JSTL标签库的使用。 2. **MVC框架Spring**:Spring框架是Java Web开发中的核心组件,提供了依赖注入(DI)和面向切面编程(AOP)等特性。...

    Spring in Action(第二版)中文版 Part3

    首先,Spring的IoC(Inversion of Control,控制反转)容器是其核心组件,负责管理对象的生命周期和依赖关系。IoC通过配置文件或注解实现,使得开发者可以专注于业务逻辑,而非对象创建和管理。这部分会讲解如何定义...

    深入学习Spring

    在源码分析部分,书中可能涵盖了Spring的核心组件如ApplicationContext、BeanFactory的工作原理,以及Bean的生命周期管理。理解这些源码有助于开发者更高效地利用Spring,解决实际问题。 设计模式在Spring中扮演着...

    spring in acion

    书中可能会讲解如何使用Spring的Bean容器来管理对象的生命周期,包括配置XML、注解驱动的bean定义,以及自动扫描和装配bean。 2. **面向切面编程(AOP)**:AOP是Spring处理横切关注点的有效方式,如日志、事务、...

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

    spring2.0语法着色文档

    Spring IoC容器是Spring框架的核心,负责管理bean的生命周期和依赖关系。主要包括BeanFactory和ApplicationContext两个接口。 **BeanFactory与ApplicationContext:** - **BeanFactory** 是Spring IoC容器的基础,...

Global site tag (gtag.js) - Google Analytics