SpringBean生命周期

SpringBean的创建过程的生命周期可以分为

  • 通过构造方法创建普通对象
  • 对普通对象属性进行依赖注入(被@Autowired注解修饰的变量)
  • 执行初始化前的操作(被@PostConstruct注解修饰的方法)
  • 执行初始化操作(需要实现InitializingBean接口,重写afterPropertiesSet()方法)
  • 初始化后操作(AOP切面生成代理对象)
  • 将代理对象或者普通对象(有aop操作则放入代理对象,否则放入普通对象)放入单例池中(Map)

最终Bean就被创建完成可以被使用了

通过构造方法创建普通对象

spring创建普通对象的规则是

  1. 当只有一个构造方法时使用该构造方法创建普通对象(没有构造器时默认使用无参构造方法来创建普通对象)
  2. 如果类中有多个构造方法,spring默认优先使用无参构造来创建普通对象,如果没有无参构造且构造方法有多个时使用被@Autowired注解修饰的构造方法来创建普通对象,如果没有被@Autowired注解修饰的构造方法则报错。

代理对象与普通对象的关系

spring在生成代理对象后并没有再次进行依赖注入等操作,那么代理对象是如何调用的注入的属性的呢?

答案是spring在生成代理对象后又依赖了原先进行了依赖注入等操作的普通对象,在进行完切面操作后再调用普通对象的方法,这样就能使用注入的属性了,基本代码为

class UserServiceProxy extends UserService {
    UserService target;

    public void test(){
        // @Before切面逻辑
        target.test();
    }
}

也就是说如果一个类有aop切面相关的操作的话,那么单例池(Map)中存放的是aop代理后的代理对象,代理对象持有进行了依赖注入后的普通对象。

你可能感兴趣的:(spring,java)