spring中ioc容器与aop之间的关系
spring的ioc 容器中默认都是原生对象,只有通过aop增强的对象才是代理对象。
配置了aop的类或者类中方法上有@Transactional注解的(因为@Transactional注解的原理就是基于aop的)。
当出现了aop增强,在ioc容器当中的对象是代理的对象,但里面的属性对象为null,
代理对象如何调用该对象中的方法呢?
使用的生成代理对象之前的target对象,该对象里面其他对象属性就有值,不会出现空指针,
问题1:
自身调用问题导致事务失效
因为调用方法时用的是target对象,并不是代理对象,所以并不会被方法增强。
解决:
使用代理对象调用(注入自身对象进行方法调用,或者aspectJ从ioc中获取)
问题2:
空指针问题
描述,在有方法增强的对象调用的情况下,进行ioc中的代理对象调用,如果调用的方法是private的,则在该方法当中使用的其他对象会出现空指针的情况。
使用的是代理对象调用是时,使用的也是原有的target对象进行调用,但是实在外部调用,所以spring框架就在调用方法不为public的情况返回了null,所以出现了空指针。但如果该方法是public,这表明该方法是可以被外部调用到的,就不会空指针(具体可看代理对象调用过程)。
问题3:
有aop增强与没有对象增强的注入到ioc中的区别
spring的ioc 容器中默认都是原生对象,通过aop增强的对象ioc保存的是代理对象。
4.bean的生命周期
bean -->对象
对象类----->无参构造方法(实例化)推断构造方法------->对象------>依赖注入---->初始化前(@PostConstruct)-------->初始化(InitializingBean) ---->初始化后(AOP)------->代理对象 ----->bean
有增强时的情况属性为null
方法:
https://www.bilibili.com/video/BV1dy4y1u7pB?p=6