spring不常遇到的问题

  最近帮同事解决在使用spring过程中遇到的一些奇怪问题,在这里总结下,归根结底还是基础不扎实,领悟不到位。
  spring注入泛型的问题:定义了Map<Long,Object>的成员变量,在运行时内容居然变为了String 为key的元素。当时的情况是使用set注入是没问题的,但是使用Autowire注解就有问题了。使用配置或者注解来实现IOC,在功能上是等效的。当时好奇的是类型不一样咋赋值啊,泛型不是编译时有类型检查么??依稀想起以前同事写的一篇关于泛型相关的文章,泛型编译时类型检查确实保证的代码的正确性,但是反射可以在运行时避开类型检查而将任何的类型塞进去。本地测试的demo(反射避开类型检查):
这里写图片描述
  网上也有人遇到这个问题,但是好像使用注解就是不行,只能用set注入。这可能跟spring的版本有关吧, 本地在配置map节点时指定key-type为Long 然后使用注解也可以正确注入map。
  之前对泛型的理解还是不够全面,也就知道泛型的类型擦除,但是是不是所有的泛型信息都被擦除了呢?显然不是 传送门:大牛的博客
  另一个奇怪的问题是在一个方法上使用@Transactional导致成员变量注入不进去,不使用@Transactional倒是可以。当然也不是说注入进去了就是对的,因为并没有开启事务。
这里写图片描述
大图链接
  如果上面的图片看的清楚的话,当前对象是个cglib生成的动态代理对象。如果对spring AOP理解不够透彻的话,会觉得理所当然,spring事务就是基于动态代理啊,没毛病。是动态代理没错,但是在执行到具体业务方法的时候,spring 都是调用被代理对象的方法来执行的,而不是通过cglib生成的动态代理对象。那为啥上面是通过动态代理对象来直接调用业务方法的??因为这个方法是final的,而final方法是没法重写的,所以动态代理对象的类直接继承了我们被代理的类中的方法。this的成员变量spring是没有帮我们注入的,但是他的目标对象(被代理的对象)的成员变量spring给我们注入了,所以this的相关成员变量都是null的。最后解决方法就是把final去掉。

参考资料:

http://zhwj184.iteye.com/blog/1847544
https://stackoverflow.com/questions/44881890/spring-boot-2-transactional-annotation-makes-autowired-fields-null

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值