Spring Bean 生命周期测试
本文内容纲要:
- 注册InstantiationAwareBeanPostProcessor接口。- 输出
- 生命周期图解
- Spring 实现按 init-method 和destory-method的三种方式
本文代码GitHub地址
Bean的生命周期是开始创建到销毁的过程。需要实现相关的类BeanNameAware ,DisposableBean, InitializingBean ,并注册InstantiationAwareBeanPostProcessor。
Bean类实现BeanNameAware ,DisposableBean, InitializingBean 接口
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 的子孙类。
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 --- BeanFactoryPostProcessorMyInstantiationAwareBeanPostProcessor接口: 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"); } }
方式2:注解配置
添加*@PostConstruct 和**@PreDestroy进行指定*
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();
}
}
本文内容总结:注册InstantiationAwareBeanPostProcessor接口。,输出,生命周期图解,Spring 实现按 init-method 和destory-method的三种方式,
原文链接:https://www.cnblogs.com/lgjlife/p/10664320.html
以上是 Spring Bean 生命周期测试 的全部内容, 来源链接: utcz.com/z/362498.html