小编给大家分享一下如何解决弹簧自动注入失败的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
春自动注入失败如何解决?
我有一个被Spring @ service注解的类(MileageFeeCalculator),它有一个用@ autowired注入的变量(rateService),但是当我用这个变量的时候,它显示为null。日志显示MileageFeeCalculator bean和MileageRateService bean都被创建了,但是当我调用服务上的mileageCharge()方法时,就会报NullPointerException错误。为什么春天不能自动注入这个实例?控制器:
@ Controller public class  MileageFeeController {,,, ,,,@RequestMapping(“/里程/{英里}“) ,,@ResponseBody ,,,public float mileageFee (@PathVariable int 英里),{ ,,,,,,,MileageFeeCalculator calc =, new MileageFeeCalculator (); ,,,,,,,return calc.mileageCharge(英里); ,,,} }
服务:
@ Service public class  MileageFeeCalculator { ,,@ autowired ,,,private MileageRateService rateService;,//, & lt;——安康;should be autowired, is 零 ,,,public float mileageCharge (final int 英里),{ ,,,,,,,return (miles *, rateService.ratePerMile ());,//, & lt;——安康;throws 肺水肿 ,,,} }
本应被注入服务但是并没有的类
@ Service public class  MileageRateService { ,,,public float ratePerMile (), { ,,,,,,,return 0.565 f; ,,,} }
为什么我调用得到/里程/3这个请求的时候,会报这样的错误:
java.lang.NullPointerException:零 ,,,at com.chrylis.example.spring_autowired_npe.MileageFeeCalculator.mileageCharge (MileageFeeCalculator.java: 13) ,,,at com.chrylis.example.spring_autowired_npe.MileageFeeController.mileageFee (MileageFeeController.java: 14) ,,,…
回答
@ autowired注解的字段为零是因为,弹簧无法获取你用新关键字创建的类,也无法自动注入它。
Spring Ioc容器有三个主要的逻辑组件:应用程序可以使用的注册表(ApplicationContext);通过把依赖项与上下文中bean的匹配,将依赖的对象注入的配置器系统;以及一个依赖解析器,它可以查看许多不同bean的配置,并确定如何按必要的顺序实例化和配置它们。
奥委会容器并没有魔法,除非你以某种方式通知它,否则它无法获取Java对象。当你调用新的创建对象时,JVM实例化新对象,并将其中一个副本交给你——它并不经历春的配置过程。有三种方法可以配置豆实例。
注入你的豆
最好的选择是让春天注入所有的bean,这样的代码量会最少并且也最容易维护。为了使注入如你所愿,需要把MileageFeeCalculator像这样注入。
@ controller public class  MileageFeeController { ,,@ autowired ,,,private MileageFeeCalculator 钙; ,,,@RequestMapping(“/里程/{英里}“) ,,@ResponseBody ,,,public float mileageFee (@PathVariable int 英里),{ ,,,,,,,return calc.mileageCharge(英里); ,,,} }
如果你需要为不同的请求都创建一个类的新实例,可以通过春天注解的范围实现。
使用@Configurable
如果你真的需要把新出来的对象保存进行注入,那可以使用春天的@Configurable注解,通过使用AOP在编译时织入你的对象中。这种方法将代码插入到对象的构造函数中,提醒春这个对象正在被创建,这样春天就能够配置新实例了。这需要你添加一些配置信息。并打开春天的运行时配置处理器.Roo Active Record系统使用这种方法来允许实体的新实例获取注入的必要持久性信息。
@ service @Configurable public class  MileageFeeCalculator { ,,@ autowired ,,,private MileageRateService rateService; ,,,public float mileageCharge (final int 英里),{ ,,,,,,,return (miles *, rateService.ratePerMile ()); ,,,} }
手动查找豆:不推荐
这种方法只适用于在特殊情况下与遗留代码对接。创建一个弹簧可以自动注入并且遗留代码也能调用的单例适配器总是可取的,但是也许可以直接向Spring应用程序上下文请求豆实例。