赞
踩
对于普通的 Java 对象,new 的时候会去创建对象,而当它没有任何引用的时候则被垃圾回收机制回收。相较于前者,由Spring IoC 容器托管的对象,它们的生命周期完全由容器控制。Spring 中每个 Bean 的生命周期如下:
该接口提供了两个函数:
- postProcessBeforeInitialzation( Object bean, String beanName ) 当前正在初始化的 Bean 对象会被传递进来,我们就可以对这个 Bean 作任何处理。 这个函数会先于 InitialzationBean 执行,因此称为前置处理。 所有 Aware 接口的注入就是在这一步完成的。
- postProcessAfterInitialzation( Object bean, String beanName ) 当前正在初始化的 Bean 对象会被传递进来,我们就可以对这个 Bean 作任何处理。 这个函数会在 InitialzationBean 完成后执行,因此称为后置处理。
InitializingBean 接口只有一个函数:afterPropertiesSet()
项目结构如下:(红框中为代码演示使用到)
创建启动入口类:org.example.AppLifecycle
package org.example;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppLifecycle {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("lifecycle.xml");
((ClassPathXmlApplicationContext) context).close();
}
}
Spring配置文件:在src/main/resources
下,创建lifecycle.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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="org.example.config"/>
</beans>
准备要进行生命周期管理的Bean对象,创建org.example.model.LifeCycleTest
package org.example.config; import org.springframework.beans.BeansException; import org.springframework.beans.factory.*; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; public class LifeCycleTest implements InitializingBean, DisposableBean, ApplicationContextAware, BeanNameAware, BeanFactoryAware { public void beanInit(){ System.out.println("init-method: 注解是使用@Bean(initMethod=\"方法名\")的方式,xml是使用<bean init-method=\"方法名\" />"); } @PostConstruct public void postConstruct(){ System.out.println("@PostConstruct"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("InitializingBean"); } public void beanDestroy(){ System.out.println("destroy-method: 注解是使用@Bean(destroyMethod=\"方法名\")的方式,xml是使用<bean destroy-method=\"方法名\" />"); } @PreDestroy public void preDestroy(){ System.out.println("@PreDestroy"); } @Override public void destroy() throws Exception { System.out.println("DisposableBean"); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("ApplicationContextAware"); } @Override public void setBeanName(String name) { System.out.println("BeanNameAware"); } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { System.out.println("BeanFactoryAware"); } }
使用创建的配置类org.example.config.AppConfig
:
package org.example.config; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig implements BeanPostProcessor { @Bean(initMethod = "beanInit", destroyMethod = "beanDestroy") public LifeCycleTest lifeCycleTest(){ return new LifeCycleTest(); } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("BeanPostProcessor Before"); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("BeanPostProcessor After"); return bean; } }
代码运行结果
补充说明:第一步的实例化是指new对象,Spring的语义中说初始化Bean包含Bean生命周期中的初始化步骤。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。