spring中ioc容器与aop之间的关系

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

经验分享 程序员 微信小程序 职场和发展