Spring Bean 生命周期

本文详细介绍了Spring框架中Bean的生命周期,包括Bean的实例化过程、属性填充、依赖注入、Aware接口处理、初始化前后处理、AOP操作及销毁过程。通过一个具体的例子展示了Bean生命周期中的关键步骤。

Spring Bean 生命周期

bean 生命周期 执行流程

在这里插入图片描述

  1. 推断构造方法(实例化)
  • 实例化时,会根据构造方法 参数的 byType、byName去寻找单例bean

  • 当只有一个构造方法时

     可以是无参构造
     可以是有参构造,根据byType寻找单例bean
     	当找到的单例bean有多个时,判断是否有和byName相同的bean对象,有则使用,没有则报错(不知道选哪个bean)
     	当找到的单例bean只有一个时,无论byName是否相同,直接使用该bean对象
     当有多个构造方法时
     	判断有没有无参构造方法
     		有则使用该构造方法
     		没有则报错(不知道用哪个构造方法)
    
  1. 属性填充(依赖注入)
  • 实例化后的对象被封装在BeanWrapper对象中
  • Spring根据BeanDefinition中的信息 以及 通过BeanWrapper提供的设置属性的接口完成依赖注入
  1. 处理Aware接口
  • Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean

    如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的就是Spring配置文件中Bean的id值
    如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的是Spring工厂自身
    如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文
    
  1. postProcessBeforeInitialization
  • 如果想对Bean进行一些自定义的处理,那么可以让Bean实现了BeanPostProcessor接口,并重写postProcessBeforeInitialization(Object obj, String s)方法
  1. InitializingBean 与 init-method
  • 如果实例化的Bean实现了InitializingBean接口,则会自动调用其配置的初始化方法
  • 如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法
  1. postProcessAfterInitialization(AOP)
  • 如果Bean实现了BeanPostProcessor接口,并重写了postProcessAfterInitialization(Object obj, String s)方法,则spring会调用该方法

  • 同时会进行AOP相关操作

    找出所有的切面
    判断有没有切点是当前bean,有则进行动态代理,返回代理对象
    
  1. DisposableBean 与 destroy-method
  • 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法
  • 如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法

验证

  • 手动定义一个bean,并进行上述各个方法的调用,验证上述bean的执行流程
@Component
public class UserService implements BeanNameAware, InitializingBean, DisposableBean {

    private UserService() {
        // 111
        System.out.println("111");
    }

    // 222
    @Autowired
    private OrderService orderService;

    @Override
    public void setBeanName(String s) {
        // 333
        System.out.println("333");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        // 555
        System.out.println("555");
    }

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

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if ("userService".equals(beanName)) {
            // 444
            System.out.println("444");
        }
        return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if ("userService".equals(beanName)) {
            // 666
            System.out.println("666");
        }
        return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值