Spring Bean生命周期

Spring Bean生命周期

1、实例化Instantiation

2、属性赋值Populate

3、初始化Initialization

4、销毁Destruction

 

AbstractAutowireCapableBeanFactory

创建Bean

    protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
            throws BeanCreationException {

        // Instantiate the bean.
        BeanWrapper instanceWrapper = null;
        if (mbd.isSingleton()) {
            instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
        }
        if (instanceWrapper == null) {
            instanceWrapper = createBeanInstance(beanName, mbd, args);
        }
        Object bean = instanceWrapper.getWrappedInstance();

        // Initialize the bean instance.
        Object exposedObject = bean;
        try {
            populateBean(beanName, mbd, instanceWrapper);
            exposedObject = initializeBean(beanName, exposedObject, mbd);
        }
        
        return exposedObject;
    }

感知Aware Group1

BeanNameAware

BeanClassLoaderAware

BeanFactoryAware

	private void invokeAwareMethods(String beanName, Object bean) {
		if (bean instanceof Aware) {
			if (bean instanceof BeanNameAware) {
				((BeanNameAware) bean).setBeanName(beanName);
			}
			if (bean instanceof BeanClassLoaderAware) {
				ClassLoader bcl = getBeanClassLoader();
				if (bcl != null) {
					((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
				}
			}
			if (bean instanceof BeanFactoryAware) {
				((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
			}
		}
	}

感知Aware Group2

EnvironmentAware

EmbeddedValueResolverAware

ResouceLoaderAware

ApplicationEventPublisherAware

MessageSourceAware

ApplicationContextAware

	private void invokeAwareInterfaces(Object bean) {
		if (bean instanceof EnvironmentAware) {
			((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
		}
		if (bean instanceof EmbeddedValueResolverAware) {
			((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
		}
		if (bean instanceof ResourceLoaderAware) {
			((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
		}
		if (bean instanceof ApplicationEventPublisherAware) {
			((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
		}
		if (bean instanceof MessageSourceAware) {
			((MessageSourceAware) bean).setMessageSource(this.applicationContext);
		}
		if (bean instanceof ApplicationContextAware) {
			((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
		}
	}

 

测试代码:

@Slf4j
@Data
public class MyAware implements
        BeanNameAware,
        BeanClassLoaderAware,
        BeanFactoryAware,
        EnvironmentAware,
        EmbeddedValueResolverAware,
        ResourceLoaderAware,
        ApplicationEventPublisherAware,
        MessageSourceAware,
        ApplicationContextAware,
        InitializingBean {

    private String name;

    @Autowired
    private MyBeanPostProcessor myBeanPostProcessor;

    public MyAware() {
        log.info("new MyAware()");
    }

    public void myInit() {
        log.info("myInit");
    }

    public void myDestroy() {
        log.info("myDestroy");
    }

    @Override
    public void setBeanName(String name) {
        log.info("BeanNameAware={}", name);
    }

    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        log.info("BeanClassLoaderAware={}", classLoader);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        log.info("BeanFactoryAware={}", beanFactory);
    }

    @Override
    public void setEnvironment(Environment environment) {
        log.info("EnvironmentAware={}", environment);
    }

    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        log.info("EmbeddedValueResolverAware={}", resolver);
    }

    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        log.info("ResourceLoaderAware={}", resourceLoader);
    }

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        log.info("ApplicationEventPublisherAware={}", applicationEventPublisher);
    }

    @Override
    public void setMessageSource(MessageSource messageSource) {
        log.info("MessageSourceAware={}", messageSource);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        log.info("ApplicationContextAware={}", applicationContext);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("InitializingBean=afterPropertiesSet()");
    }
}
@Slf4j
public class MyBeanPostProcessor implements
        InstantiationAwareBeanPostProcessor,
        BeanPostProcessor,
        DestructionAwareBeanPostProcessor,
        DisposableBean{
    public MyBeanPostProcessor() {
        log.info("new MyBeanPostProcessor()");
    }

    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        log.info("postProcessBeforeInstantiation");
        return null;
    }

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        log.info("postProcessAfterInstantiation");
        return true;
    }

    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        log.info("postProcessProperties");
        return null;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        log.info("postProcessBeforeInitialization");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        log.info("postProcessAfterInitialization");
        return bean;
    }

    @Override
    public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {
        log.info("postProcessBeforeDestruction");
    }

    @Override
    public boolean requiresDestruction(Object bean) {
        log.info("requiresDestruction");
        return true;
    }

    @Override
    public void destroy() throws Exception {
        log.info("DisposableBean=destroy");
    }
}
@Configuration
@ComponentScan(basePackages = {"com.example.demo.bean"})
public class MainConfig {

    @Bean
    public MyBeanPostProcessor myBeanPostProcessor() {
        return new MyBeanPostProcessor();
    }

    @Bean(initMethod = "myInit", destroyMethod = "myDestroy")
    public MyAware myAware() {
        return new MyAware();
    }
}

简略化后的测试LOG

MyBeanPostProcessor - postProcessBeforeInstantiation
MyAware - new MyAware()
MyBeanPostProcessor - postProcessAfterInstantiation
MyAware - BeanNameAware=myAware
MyAware - BeanClassLoaderAware=sun.misc.Launcher$AppClassLoader
MyAware - BeanFactoryAware=DefaultListableBeanFactory
MyAware - EnvironmentAware=StandardEnvironment
MyAware - EmbeddedValueResolverAware=EmbeddedValueResolver
MyAware - ResourceLoaderAware=AnnotationConfigApplicationContext
MyAware - ApplicationEventPublisherAware=AnnotationConfigApplicationContext
MyAware - MessageSourceAware=AnnotationConfigApplicationContext
MyAware - ApplicationContextAware=AnnotationConfigApplicationContext
MyBeanPostProcessor - postProcessBeforeInitialization
MyAware - myInit
MyAware - InitializingBean=afterPropertiesSet()
MyBeanPostProcessor - postProcessAfterInitialization
MyBeanPostProcessor - requiresDestruction
MyBeanPostProcessor - postProcessBeforeDestruction
MyAware - myDestroy
MyBeanPostProcessor - DisposableBean=destroy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值