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

相關文章
相關標籤/搜索