Spring Bean 生命周期测试

 本文代码GitHub地址html

Bean的生命周期是开始建立到销毁的过程。须要实现相关的类BeanNameAware   ,DisposableBean, InitializingBean ,并注册InstantiationAwareBeanPostProcessor。java

 

 

Bean类实现BeanNameAware   ,DisposableBean, InitializingBean 接口git

package com.bean.life.entity; import org.springframework.beans.BeansException; import org.springframework.beans.factory.*; import org.springframework.stereotype.Component; @Component public class User implements BeanFactoryAware , BeanNameAware , InitializingBean , DisposableBean { @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { System.out.println("BeanFactoryAware  setBeanFactory"); }  @Override public void setBeanName(String s) { System.out.println("BeanNameAware接口:  setBeanName = " + s); }  @Override public void afterPropertiesSet() throws Exception { System.out.println("InitializingBean接口:  afterPropertiesSet"); }  @Override public void destroy() throws Exception { System.out.println("DisposableBean接口:  destroy"); }
@PostConstruct public void init(){ System.out.println("PostConstruct"); } @PreDestroy public void destory(){ System.out.println("PreDestroy"); } }

 注册InstantiationAwareBeanPostProcessor接口。

这里的InstantiationAwareBeanPostProcessorAdapter是 InstantiationAwareBeanPostProcessor 的子孙类。github

package com.bean.life.entity; import org.springframework.beans.BeansException; import org.springframework.beans.PropertyValues; import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter; import org.springframework.stereotype.Component; import java.beans.PropertyDescriptor; import java.lang.reflect.Constructor; @Component public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter { public MyInstantiationAwareBeanPostProcessor() { super(); } @Override public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException { if(beanName.equals("user")){ System.out.println("MyInstantiationAwareBeanPostProcessor接口: determineCandidateConstructors: " + beanName); } return super.determineCandidateConstructors(beanClass, beanName); } @Override public Object getEarlyBeanReference(Object bean, String beanName) throws BeansException { if(beanName.equals("user")){ System.out.println("MyInstantiationAwareBeanPostProcessor接口: getEarlyBeanReference: " + beanName); } return super.getEarlyBeanReference(bean, beanName); } @Override public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException { if(beanName.equals("user")){ System.out.println("MyInstantiationAwareBeanPostProcessor接口: postProcessBeforeInstantiation: " + beanName); } return super.postProcessBeforeInstantiation(beanClass, beanName); } @Override public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException { if(beanName.equals("user")){ System.out.println("MyInstantiationAwareBeanPostProcessor接口: postProcessAfterInstantiation : " + beanName); } return super.postProcessAfterInstantiation(bean, beanName); } @Override public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException { if(beanName.equals("user")){ System.out.println("MyInstantiationAwareBeanPostProcessor接口:  postProcessPropertyValues: " + beanName); } return super.postProcessPropertyValues(pvs, pds, bean, beanName); } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if(beanName.equals("user")){ System.out.println("MyInstantiationAwareBeanPostProcessor接口: postProcessBeforeInitialization: " + beanName); } return super.postProcessBeforeInitialization(bean, beanName); } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if(beanName.equals("user")){ System.out.println("MyInstantiationAwareBeanPostProcessor接口:  postProcessAfterInitialization: " + beanName); } return super.postProcessAfterInitialization(bean, beanName); } }

 

输出

MyBeanFactoryPostProcessor --- BeanFactoryPostProcessor MyInstantiationAwareBeanPostProcessor接口: postProcessBeforeInstantiation: user MyInstantiationAwareBeanPostProcessor接口: determineCandidateConstructors: user MyInstantiationAwareBeanPostProcessor接口: postProcessAfterInstantiation : user MyInstantiationAwareBeanPostProcessor接口: postProcessPropertyValues: user BeanNameAware接口: setBeanName = user BeanFactoryAware setBeanFactory MyInstantiationAwareBeanPostProcessor接口: postProcessBeforeInitialization: user PostConstruct InitializingBean接口: afterPropertiesSet MyInstantiationAwareBeanPostProcessor接口: postProcessAfterInitialization: user PreDestroy DisposableBean接口: destroy

 

 生命周期图解

Spring 实现按 init-method 和destory-method的三种方式

 

  •  方式1:xml配置方式
package com.bean.life.entity; public class User { public void init(){ System.out.println("PostConstruct"); } public void destory(){ System.out.println("PreDestroy"); } }

 

 

<bean id="user" class="com.bean.life.entity" init-method="init" destroy-method="destroy">
</bean>

 

 

  • 方式2:注解配置

添加@PostConstruct 和@PreDestroy进行指定spring

package com.bean.life.entity; @Component public class User { @PostConstruct public  void init(){ System.out.println("PostConstruct"); } @PreDestroy public  void destory(){ System.out.println("PreDestroy"); } }

 

  • 方式3: 使用注解@Bean
public @interface Bean { @AliasFor("name") String[] value() default {}; @AliasFor("value") String[] name() default {}; Autowire autowire() default Autowire.NO; String initMethod() default ""; String destroyMethod() default "(inferred)"; }

 

@Configuration public class UserConfig{ @Bean(initMethod="init",destoryMethod="destory") public User user(){ return new User(); } }

 

原文出处:https://www.cnblogs.com/lgjlife/p/10664320.htmlide

相关文章
相关标签/搜索