@Autowired注入之后为null

使用场景:

在serviceImpl中需要调用一个工具类来转换返回的数据类型,但是在工具类中需要调用dao层的方法来查询数据

工具类中的方法是非静态,并且使用了@Autowired注解来注入dao层,但是打断点的时候发现注入的dao层对象是null

在serviceImpl中调用的时候,没有使用类名.方法名的方式来调用,而是选择了实例化工具类再调用(new 工具类().方法名)

经过下述步骤来寻找问题,但是没发现问题:

1.判断dao层是否加了注解或者继承JPA的一些接口

2.启动类的包扫描没有问题(springboot项目)

最后的解决办法:

在serviceImpl中使用@Autowired注入工具类,调用时用注入的工具类直接调用工具类中的方法

例如:

@Autowired
private XxUtils xxUtils;


//调用的时候
xxUtils.test();

上面的问题(工具类中注入的dao层对象为空)就解决了

当然,在这之前我在工具类的类名上面加了一个@Service注解(@Component注解也是可以的)

原理:

我理解的是:

serviceImpl和repository都是用了注解(@Service,@Repository,@Component等)使它们交由容器管理

相当于项目启动时,被实例化了,这个对象里需要什么东西,也一起装配进来(@Autowired)

工具类中注入了repository,我理解为,项目启动时,在容器中实例化了一个工具类对象,repository对象在这个工具类对象中能够使用

但是由于工具类没有使用注解,没有交由容器管理,在serviceImpl中调用的时候,是new XxUtils.test()的方式,即重新创建了一个工具类对象,这个新创建的对象中没有装进repository对象的地址,因此是null

由于@Autowired是在容器启动的时候完成装配的,要是用的工具类对象就也要使用提前装配好的,而不是现用现new

如有不对之处请指正

 

此外类似websocket这种不能自动注入的,可以采取下面方法来获取需要使用的类

https://blog.csdn.net/hanerer1314/article/details/81712128

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值