导图放前面,方便记忆

Bean的生命周期

生产

loadBeanDefinitions加载BD

createBean创建Bean

构造对象

createBeanInstall()通过反射构造对象

构造方法选择:

  • 单个构造方法-->该方法

  • 多个构造方法-->优先@Autowired

  • 优先无参构造方法

构造参数选择:

  • 先通过Class类型查找,多个实例,再通过参数名字查找

填充属性

populateBean(),通过三级缓存方法。sigletonObjects、singletonFactories、earilySigletonObjects

初始化实例

initialzeBean()

  • invokeAwareMethods()调用各个Aware接口的实现方法

  • postProcessBeforeInitialization() 初始化前调用bean后置处理器这个方法

  • invokeInitMethods()调用实现InitializingBean的afterPropertiesSet()方法

  • 执行指定的initMethod()

  • postProcessAfterInitialization() 初始化后调用bean后置处理器这个方法,代理等就是通过这个实现的。

注册销毁

registerDisposableBean()将实现DisposableBean接口的bean进行注册

添加单例池

addSingleton()将生产好的bean添加到单例池

使用

销毁

  1. DisposableBean接口的-->destory()

  2. @PreDestory

  3. 自定义的destoryMethod()

代码验证

@Configurable
@ComponentScan("com.daniel.*")
public class Main {

    /*@Bean(initMethod = "initSelf",destroyMethod = "destroySelf")
    public User user(){
        return new User();
    }*/

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Main.class);
        User user = (User) applicationContext.getBean("user");
        user.work();
        System.out.println("====我要销毁容器了====");
        applicationContext.close();
    }
}

为了验证initMethod、@PostConstruct、afterPropertiesSet增加的

@Component
public class User implements BeanNameAware, BeanFactoryAware , InitializingBean {
    private Integer id;
    private String name;
    private String sex;

    @Autowired
    private Address address;

    public User() {
        System.out.println("1.User构造方法创建User");
    }

    @PostConstruct
    public void afterConstruct(){
        System.out.println("4.1.看我注解@PostConstruct:我是在构造方法后执行的");
    }

    @PreDestroy
    public void preDestroy(){
        System.out.println("6.2.看我注解@PreDestroy:我要开始销毁bean了" );
    }

    @Override
    public void setBeanName(String s) {
        System.out.println("3.1.Aware接口BeanName执行了");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("3.2.Aware接口BeanFactory执行了");
    }


    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("4.2. InitializingBean接口的afterPropertiesSet执行了");
    }

    public void initSelf(){
        System.out.println("4.3.我自定义的initMethod方法执行了");
    }

    public void destroySelf(){
        System.out.println("6.3.我自定义的destroy方法执行了");
    }

    public void work(){
        System.out.println("5.我可以工作了...");
    }
}
@Component
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class Address {
    private String city;

    public Address() {
        System.out.println("2.Address出生了,要给User填充属性");
    }
}

这里我为了控制台顺序显性打印出来填充属性的步骤,所以设置为原型了,如果是默认单例的话,环境启动的时候,Address要先User提前构建完成,User步骤中填充属性功能就不显示了


@Component
public class MyBeanDisposable implements DisposableBean {
    @Override
    public void destroy() throws Exception {
        System.out.println("6.1. DisposableBean接口中的destroy方法执行了");
    }
}
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("Bean生产前后处理器.我是postProcessBeforeInitialization...." + beanName);
        return bean;
    }


    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("Bean生产前后处理器.我是postProcessAfterInitialization...." + beanName);
        return bean;
    }

}

控制台最后打印出的消息

1.User构造方法创建User
2.Address出生了,要给User填充属性
Bean生产前后处理器.我是postProcessBeforeInitialization....address
Bean生产前后处理器.我是postProcessAfterInitialization....address
3.1.Aware接口BeanName执行了
3.2.Aware接口BeanFactory执行了
Bean生产前后处理器.我是postProcessBeforeInitialization....user
4.1.看我注解@PostConstruct:我是在构造方法后执行的
4.2. InitializingBean接口的afterPropertiesSet执行了
Bean生产前后处理器.我是postProcessAfterInitialization....user
14:54:05.658 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'myBeanDisposable'
Bean生产前后处理器.我是postProcessBeforeInitialization....myBeanDisposable
Bean生产前后处理器.我是postProcessAfterInitialization....myBeanDisposable
5.我可以工作了...
我要销毁容器了
6.1. DisposableBean接口中的destroy方法执行了
6.2.看我注解@PreDestroy:我要开始销毁bean了