标签:私有 代理 private 对象 bean 为空 方法 public 注入
私有方法注入对象为空
为什么在自身注入对象调用自身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
标签:私有,代理,private,对象,bean,为空,方法,public,注入 来源: https://blog.csdn.net/qq_43517448/article/details/121461243
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。