私有方法注入对象为空
为什么在自身注入对象调用自身private方法,方法中注入的对象为空
为什么this调用不会?
@Transactional(rollbackFor = Exception.class, value = "instalmentTransactionManager")
public void testObjectDisable() {
activityManagerServiceImpl.test02();
}
private void test02() {
mapper.insertSelective(Record.builder().type(1).build());
}
问题:mapper出现空指针异常,使用this不会空指针。
因为使用注入对象会重新从ioc中获取代理对象,这时候如果方法是私有的,就无法进行属性赋值。
网上类似问题:Controller方法中,私有方法注入不了问题
定义在切面AOP下的Controller类会走代理,不管private还是public方法bean都是null值。
当方法为private的时候,由于没有被AOP拦截,它继续使用代理类,如前面的图所示,代理类中的 bean=null。
因此我们可以判定public方法在AOP过程中有其他的操作,不然bean的属性也是null,调试模式继续走,你会发现在org.springframework.aop.framework.CglibAopProxy类中有一个静态内部类CglibMethodInvocation,其中有一个方法invokeJoinpoint()是这样写的
/**
* Gives a marginal performance improvement versus using reflection to
* invoke the target when invoking public methods.
*/
@Override
protected Object invokeJoinpoint() throws Throwable {
if (this.publicMethod) {
return this.methodProxy.invoke(this.target, this.arguments);
}
else {
return super.invokeJoinpoint();
}
}
bean就是在这个代理类中进行“属性注入”。
invoke(this.target, this.arguments):意思就是说当publicMethod=true的时候,就会用实际对象来进行反射调用,实际对象的bean属性值我们之前已经看到了,是已经注入的。因此public方法的bean会重新赋值,即:用实际对象来代替原有的代理对象。
4.总结
private方法中bean=null的根本原因并不是private方法无法被代理,我们按照public方法的调试,它在InvocableHandlerMethod中显示的bean属性也是null。
根本原因是:代理类中private 方法无法获取被代理目标对象,也就无法获取注入的bean属性
地址:https://blog.csdn.net/q258523454/article/details/118118553