bean 加载时的生命周期

bean 加载时的生命周期

0 类加载(静态代码块)
1 对象初始化(构造代码块,构造器)
2 BeanNameAware#setBeanName
3 BeanFactoryAware#setBeanFactory
4 ApplicationContextAware#setApplicationContext
5 @PostConstruct
6 InitializingBean#afterPropertiesSet
7 BeanPostProcessor#postProcessBeforeInitialization
8 BeanPostProcessor#postProcessAfterInitialization
9 DisposableBean#destroy

其中 7、8 在容器装配 bean 时会重复回调。

示例

分别定义了两个 CDPlayer 的 bean

    @Bean
    public CDPlayer cdPlayer() {
        return new CDPlayer();
    }

CDPlayer 类上使用了 @Component 注解:

@Component
public class CDPlayer implements
//        MediaPlayer,
        BeanNameAware,
        BeanFactoryAware,
        ApplicationContextAware,
        BeanPostProcessor,
        InitializingBean,
        DisposableBean {

    @Resource(name = "sgtPeppers")
    private CompactDisc disc;

    static {
        System.out.println("CDPlayer: load class static{}");
    }

    public CDPlayer() {
        System.out.println("CDPlayer: step constructer");
    }

    {
        // 1
        System.out.println("CDPlayer: step 1 {}");
    }

    @PostConstruct
    public void init() {
        // 5
        System.out.println("CDPlayer: step 5 init ");
    }

//    @Override
//    public void play() {
//        disc.play(1);
//    }

    @Override
    public void setBeanName(String name) {
        // 2
        System.out.println("CDPlayer: step 2 setBeanName=" + name);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        // 3
        System.out.println("CDPlayer: step 3 setBeanFactory=" + beanFactory.toString());
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        // 6
        System.out.println("CDPlayer: step 6 afterPropertiesSet");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        // 4
        System.out.println("CDPlayer: step 4 setApplicationContext=" + applicationContext.toString());
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // 7
        System.out.println("CDPlayer: step 7 postProcessBeforeInitialization=" + beanName);
        return null;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // 8
        System.out.println("CDPlayer: step 8 postProcessAfterInitialization=" + beanName);
        return null;
    }

    @Override
    public void destroy() throws Exception {
        // 9
        System.out.println("CDPlayer: step 9 destroy");
    }
}

启动项目,日志就会输出:


// 类加载
CDPlayer: load class static{}

// 装配 CDPlayer bean
CDPlayer: step 1 {}
CDPlayer: step constructer
CDPlayer: step 2 setBeanName=CDPlayer
CDPlayer: step 3 setBeanFactory=org.springframework.beans.factory.support.DefaultListableBeanFactory@464bee09: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,appConfig,aspectJInvoker,audience,encoreableIntroducer,invoker,trackCounter,aspectConfig,cake,cookies,dessertProvider,iceCream,sgtPeppers,envConfig,envOne,spELOne,main,MVCConfig,notepad,padConfig,shoppingConfig,shoppingService,CDPlayer,CDPlayerConfig,DVDPlayer,propertySourcesPlaceholderConfigurer,enumConverterFactory,platformSessionArgumentResolvers,myNotPad,scopedTarget.shoppingCart,shoppingCart,scopedTarget.shoppingCart2,shoppingCart2,setPeppers,cdPlayer,myDisc,nowDate,myDessert,org.springframework.aop.config.internalAutoProxyCreator,point,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0,org.springframework.aop.aspectj.AspectJPointcutAdvisor#1,org.springframework.aop.aspectj.AspectJPointcutAdvisor#2,org.springframework.aop.aspectj.AspectJPointcutAdvisor#3,org.springframework.aop.aspectj.AspectJPointcutAdvisor#4,org.springframework.aop.aspectj.AspectJPointcutAdvisor#5,trackPlayer,org.springframework.aop.aspectj.DeclareParentsAdvisor#0,disc]; root of factory hierarchy
CDPlayer: step 4 setApplicationContext=org.springframework.context.annotation.AnnotationConfigApplicationContext@48533e64: startup date [Tue Sep 25 10:24:42 CST 2018]; root of context hierarchy
CDPlayer: step 5 init
CDPlayer: step 6 afterPropertiesSet

// 装配 cdPlayer bean
CDPlayer: step 1 {}
CDPlayer: step constructer
CDPlayer: step 2 setBeanName=cdPlayer
CDPlayer: step 3 setBeanFactory=org.springframework.beans.factory.support.DefaultListableBeanFactory@464bee09: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,appConfig,aspectJInvoker,audience,encoreableIntroducer,invoker,trackCounter,aspectConfig,cake,cookies,dessertProvider,iceCream,sgtPeppers,envConfig,envOne,spELOne,main,MVCConfig,notepad,padConfig,shoppingConfig,shoppingService,CDPlayer,CDPlayerConfig,DVDPlayer,propertySourcesPlaceholderConfigurer,enumConverterFactory,platformSessionArgumentResolvers,myNotPad,scopedTarget.shoppingCart,shoppingCart,scopedTarget.shoppingCart2,shoppingCart2,setPeppers,cdPlayer,myDisc,nowDate,myDessert,org.springframework.aop.config.internalAutoProxyCreator,point,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0,org.springframework.aop.aspectj.AspectJPointcutAdvisor#1,org.springframework.aop.aspectj.AspectJPointcutAdvisor#2,org.springframework.aop.aspectj.AspectJPointcutAdvisor#3,org.springframework.aop.aspectj.AspectJPointcutAdvisor#4,org.springframework.aop.aspectj.AspectJPointcutAdvisor#5,trackPlayer,org.springframework.aop.aspectj.DeclareParentsAdvisor#0,disc]; root of factory hierarchy
CDPlayer: step 4 setApplicationContext=org.springframework.context.annotation.AnnotationConfigApplicationContext@48533e64: startup date [Tue Sep 25 10:24:42 CST 2018]; root of context hierarchy
CDPlayer: step 5 init
CDPlayer: step 6 afterPropertiesSet

// 容器中其他的 bean 被装配
CDPlayer: step 7 postProcessBeforeInitialization=org.springframework.context.event.internalEventListenerProcessor
CDPlayer: step 8 postProcessAfterInitialization=org.springframework.context.event.internalEventListenerProcessor
CDPlayer: step 7 postProcessBeforeInitialization=org.springframework.context.event.internalEventListenerFactory
CDPlayer: step 8 postProcessAfterInitialization=org.springframework.context.event.internalEventListenerFactory
CDPlayer: step 7 postProcessBeforeInitialization=appConfig
CDPlayer: step 8 postProcessAfterInitialization=appConfig
CDPlayer: step 7 postProcessBeforeInitialization=trackCounter
CDPlayer: step 8 postProcessAfterInitialization=trackCounter
CDPlayer: step 7 postProcessBeforeInitialization=disc
CDPlayer: step 8 postProcessAfterInitialization=disc
CDPlayer: step 7 postProcessBeforeInitialization=aspectJInvoker
CDPlayer: step 8 postProcessAfterInitialization=aspectJInvoker
CDPlayer: step 7 postProcessBeforeInitialization=audience
CDPlayer: step 8 postProcessAfterInitialization=audience
CDPlayer: step 7 postProcessBeforeInitialization=encoreableIntroducer
CDPlayer: step 8 postProcessAfterInitialization=encoreableIntroducer

你可能感兴趣的:(bean 加载时的生命周期)