spring学习9-bean的初始化过程

三、spring bean的初始化过程

1.得到BeanDefinition

2.实例化前

org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation

3.实例化

4.实例化后

org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation

实例化后这个方法如果返回了false,就不会走后续的spring逻辑

5.属性填充

这个阶段进行自动装配,属性赋值

6.初始化前

org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization

这个方法如果返回了null,表示跳过其余的BeanPostProcessor处理逻辑,一搬情况这里应该返回当前的bean对象

7.初始化

spring提供了一个接口InitializingBean,实现这个接口中的afterPropertiesSet()方法来实现初始化逻辑

public interface InitializingBean {
    void afterPropertiesSet() throws Exception;
}

@PostConstruct注解也可以实现初始化,这个注解的处理是在初始化前进行处理的。

属性注入完成后才会执行初始化

8.初始化后

重写这个方法

org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization

通过bean的后置处理器BeanPostProcessor 及其子接口对这个过程进行干预

9.自定义后置处理器举例


@Component
public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor {

    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        if (beanClass.getName().equals("com.lyy.service.UserService")) {
            System.out.println("UserService--实例化前方法");
        }
        return null;
    }

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        if (bean.getClass().getName().equals("com.lyy.service.UserService")) {
            System.out.println("UserService--实例化后方法");
            //return false;//return false表示跳过后续的spring逻辑
        }
        return true;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean.getClass().getName().equals("com.lyy.service.UserService")) {
            System.out.println("UserService--初始化前方法");
            //return null;//return null表示跳过后续的处理器处理逻辑
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equalsIgnoreCase("UserService")) {
            System.out.println("UserService--初始化后方法");
        }
        return bean;
    }
}

执行顺序

UserService--实例化前方法
UserService--无参构造方法
UserService--实例化后方法
UserService--set方法注入
UserService--初始化前方法
UserService--PostConstruct注解初始化
UserService--初始化方法
UserService--初始化后方法