私有方法中注入对象为空

私有方法注入对象为空

为什么在自身注入对象调用自身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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值