Spring Bean 生命周期示意图:
了解Spring的生命周期非常重要,我们可以利用Spring机制来定制Bean的实例化过程。
---------------------------------------------------------------------------------------------------------------------------------------------------
spring-service.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">
<!-- 定义一个bean -->
<bean id="narCodeService" class="com.test.service.impl.NarCodeServiceImpl">
</bean>
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
<bean id="beanLifecycle" class="com.test.spring.BeanLifecycle" init-method="init" destroy-method="close">
<property name="name" value="张三"></property>
<property name="sex" value="男"></property>
</bean>
<bean id="postProcessor" class="com.test.spring.PostProcessor"/>
</beans>
Service Class:
package com.test.spring; import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanClassLoaderAware;
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;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.context.annotation.ImportAware;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.type.AnnotationMetadata; import com.sun.org.apache.xml.internal.security.Init; /**
* 测试Spring Bean的生命周期
* @author zss
*
*/
public class BeanLifecycle implements InitializingBean,DisposableBean
,BeanFactoryAware,BeanNameAware,ApplicationContextAware{
private String name;
private String sex; public String getName() {
return name;
} public void setName(String name) {
System.out.println("》》》调用BeanLifecycle对象"+this.getName()+"属性set方法,设值为:"+name);
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
System.out.println("》》》调用BeanLifecycle对象"+this.getSex()+"属性set方法,设值为:"+sex);
this.sex = sex;
}
/**
* 依次开始调用初始化回调方法
*/
@PostConstruct
public void initPostConstruct(){
System.out.println("》》》注解初始化方法被调用");
} @Override
public void afterPropertiesSet() throws Exception {
System.out.println("》》》BeanLifecycle调用了InitailizingBean的afterPorpertiesSet方法了.....");
} public void init (){
System.out.println("》》》init方法被调用");
} /**
* 依次开始调用销毁回调方法
*/ @PreDestroy
public void preDestroy(){
System.out.println("》》》注解销毁方法被调用");
} @Override
public void destroy() throws Exception {
System.out.println("》》》BeanLifecycle从Spring IoC容器中移除了.......");
}
public void close() {
System.out.println("》》》close方法被调用");
} @Override
public void setApplicationContext(ApplicationContext paramApplicationContext)
throws BeansException {
System.out.print("》》》调用ApplicationContextAware接口setApplicationContext方法:");
System.out.println(paramApplicationContext); } // @Override
// public void setResourceLoader(ResourceLoader paramResourceLoader) {
// System.out.print("》》》调用ResourceLoaderAware接口setResourceLoader方法:");
// System.out.println(paramResourceLoader);
// } // @Override
// public void setImportMetadata(AnnotationMetadata paramAnnotationMetadata) {
// System.out.println(333333);
// } // @Override
// public void setEnvironment(Environment paramEnvironment) {
// System.out.print("》》》调用EnvironmentAware接口setEnvironment方法:");
// System.out.println(paramEnvironment);
// } @Override
public void setBeanName(String paramString) {
System.out.println("》》》调用BeanNameAware接口setBenaName方法: "+paramString); } @Override
public void setBeanFactory(BeanFactory paramBeanFactory)
throws BeansException { System.out.print("》》》调用BeanFactoryAware接口setBeanFactory方法:");
System.out.println(paramBeanFactory); } // @Override
// public void setBeanClassLoader(ClassLoader paramClassLoader) {
// System.out.print("》》》调用BeanClassLoaderAware接口setBeanClassLoader方法:");
// System.out.println(paramClassLoader);
// } // @Override
// public void setApplicationEventPublisher(
// ApplicationEventPublisher paramApplicationEventPublisher) {
// System.out.print("》》》调用ApplicationEventPublisherAware接口setApplicationEventPublisher方法:");
// System.out.println(paramApplicationEventPublisher);
// } @Override
public String toString() {
return "BeanLifecycle [name=" + name + ", sex=" + sex + "]";
} }
Test:
package com.test.spring; import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class T {
ClassPathXmlApplicationContext applicationcontext=null;
@Before
public void before() {
System.out.println("》》》Spring ApplicationContext容器开始初始化了......");
applicationcontext= new ClassPathXmlApplicationContext(new String[]{"test1-service.xml"});
System.out.println("》》》Spring ApplicationContext容器初始化完毕了......");
}
@Test
public void test() {
BeanLifecycle beanLifecycle =applicationcontext.getBean("beanLifecycle",BeanLifecycle.class);
//applicationcontext.close();
applicationcontext.registerShutdownHook();
}
}
测试结果:
》》》Spring ApplicationContext容器开始初始化了......
2017-03-19 00:08:01 INFO:ClassPathXmlApplicationContext-Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6c7e6b26: startup date [Sun Mar 19 00:08:01 CST 2017]; root of context hierarchy
2017-03-19 00:08:01 INFO:XmlBeanDefinitionReader-Loading XML bean definitions from class path resource [test1-service.xml]
》》》调用BeanLifecycle对象null属性set方法,设值为:张三
》》》调用BeanLifecycle对象null属性set方法,设值为:男
》》》调用BeanNameAware接口setBenaName方法: beanLifecycle
》》》调用BeanFactoryAware接口setBeanFactory方法:org.springframework.beans.factory.support.DefaultListableBeanFactory@75a6bd5: defining beans [narCodeService,org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#0,beanLifecycle,postProcessor]; root of factory hierarchy
》》》调用ApplicationContextAware接口setApplicationContext方法:org.springframework.context.support.ClassPathXmlApplicationContext@6c7e6b26: startup date [Sun Mar 19 00:08:01 CST 2017]; root of context hierarchy
后置处理器处理bean=【beanLifecycle】开始
》》》注解初始化方法被调用
BeanLifecycle [name=张三, sex=男]
》》》BeanLifecycle调用了InitailizingBean的afterPorpertiesSet方法了.....
BeanLifecycle [name=张三, sex=男]
》》》init方法被调用
后置处理器处理bean=【beanLifecycle】完毕!
》》》Spring ApplicationContext容器初始化完毕了......
2017-03-19 00:08:03 INFO:ClassPathXmlApplicationContext-Closing org.springframework.context.support.ClassPathXmlApplicationContext@6c7e6b26: startup date [Sun Mar 19 00:08:01 CST 2017]; root of context hierarchy
》》》注解销毁方法被调用
》》》BeanLifecycle从Spring IoC容器中移除了.......
》》》close方法被调用
关于Spring BeanPostProcessor(后置处理器)讲解请查看:http://www.cnblogs.com/sishang/p/6576665.html