springbean的生命周期

产生-》使用-》销毁

 

1:springboot容器启动

 

2:通过loadBeanDefinitions将xm和注解定义的bean加载到beanDefinitionMap集合中

 

3:循环beanDefinitionMap集合调用createBean方法创建对象

3.1:构造对象

  通过createBeanInstance方法进行对象的构造, 先用反射机制从“Bean定义”中的BeanC拉屎拿到这个类的构造方法。

  获取构造方法的规则:

    1、首先拿取@AutoWired注解的构造方法,如果存在多个无法识别报错;

    2、使用无参构造方法;

    3:使用有参构造方法,如果存在多个无法识别报错;

3.2:填充属性

  使用populateBean从单例池中为@AutoWired注解的属性赋值;

3.3:初始化实例

initializeBean方法对实例初始化;

1:初始化容器相关信息

  通过invokeAwareMethods方法为实现了各种Aware接口的bean设置beanName、beanFactory等容器信息;(Aware的接口代表信息感知接口,实现了这些接口就可以在bean实例中感知并获取到对应的信息)

1.2:通过invokeInitMethods方法执行Bean的初始化方法,也就是实现了InitializingBean接口的afterPropertiesSet()方法;

  然后继续执行自定义的initMethod方法

1.3:在执行invokeInitMethods前后还需要对Bean后置处理器BeanPostProcessor处理

  在invokeInitMethods之前调用postProcessBeforeInitialization方法,执行之后调用postProcessAfterInitialization,处理各自Bean的后置处理器;

  这些处理器包括容器自身提供的负责aop处理的AnnotationAwareAspectJAutoProxyCreator、负责构造后@PostConstruct和销毁前@PreDestroy处理的InitDestroyAnnotationBeanPostProcessor等系统处理器,以及自定义的Bean通过实现BeanPostProcessor的处理器等等;

  这些处理器可以通过实现PriorityOrdered接口来指定顺序

3.4:注册销毁

  通过registerDisposableBean方法,将实现了DisposableBean接口的Bean进行注册这样在销毁时就会执行destroy方法

4:保存对象

  将这些完整的Bean对象通过addSingleton方法放入单例池singletonObjecs中就可以被获取和使用了

 

样例代码:

package com.doudou.mall.service.impl;

import com.doudou.mall.service.IOrderService;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

@Service
public class OrderServiceImpl implements IOrderService, InitializingBean, DisposableBean, ApplicationContextAware,BeanPostProcessor {

    /**
     * InitializingBean
     * 
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("顺序3");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println();
    }

    @PostConstruct
    public void test() throws Exception {
        System.out.println("顺序2");

    }

    /**
     * ApplicationContextAware
     * 
     * @param applicationContext
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("顺序1");
    }

    /**
     * BeanPostProcessor
     * 
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("顺序4");
        return bean;
    }

    /**
     * BeanPostProcessor
     * 
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("顺序5");
        return bean;
    }
}

 

posted @ 2023-06-27 21:23  银河系的极光  阅读(15)  评论(0)    收藏  举报