久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

Spring自動(dòng)注入失敗的解決方法

瀏覽:4日期:2023-07-15 11:42:06
Spring自動(dòng)注入失敗如何解決?

我有一個(gè)被Spring @Service注解的類(MileageFeeCalculator),它有一個(gè)用@Autowired注入的變量(rateService),但是當(dāng)我用這個(gè)變量的時(shí)候,它顯示為null。日志顯示MileageFeeCalculator bean和MileageRateService bean都被創(chuàng)建了,但是當(dāng)我調(diào)用service上的mileageCharge ()方法時(shí),就會(huì)報(bào)NullPointerException錯(cuò)誤。為什么Spring不能自動(dòng)注入這個(gè)實(shí)例?

Controller:

@Controllerpublic class MileageFeeController {@RequestMapping('/mileage/{miles}') @ResponseBody public float mileageFee(@PathVariable int miles) {MileageFeeCalculator calc = new MileageFeeCalculator();return calc.mileageCharge(miles); }}

Service:

@Servicepublic class MileageFeeCalculator { @Autowired private MileageRateService rateService; // <--- should be autowired, is null public float mileageCharge(final int miles) {return (miles * rateService.ratePerMile()); // <--- throws NPE }}

本應(yīng)被注入Service但是并沒有的類

@Servicepublic class MileageRateService { public float ratePerMile() {return 0.565f; }}

為什么我調(diào)用GET /mileage/3這個(gè)請求的時(shí)候,會(huì)報(bào)這樣的錯(cuò)誤:

java.lang.NullPointerException: null 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注解的字段為null是因?yàn)?,Spring無法獲取你用new關(guān)鍵字創(chuàng)建的類,也無法自動(dòng)注入它。

Spring Ioc容器有三個(gè)主要的邏輯組件:應(yīng)用程序可以使用的注冊表(ApplicationContext);通過把依賴項(xiàng)與上下文中的bean匹配,將依賴的對象注入的配置器系統(tǒng);以及一個(gè)依賴解析器,它可以查看許多不同bean的配置,并確定如何按必要的順序?qū)嵗团渲盟鼈儭?/p>

Ioc容器并沒有魔法,除非你以某種方式通知它,否則它無法獲取Java對象。當(dāng)你調(diào)用new創(chuàng)建對象時(shí),JVM實(shí)例化新對象,并將其中一個(gè)副本交給你——它并不經(jīng)歷Spring的配置過程。有三種方法可以配置bean實(shí)例。

注入你的bean

最好的選擇是讓Spring注入所有的bean;這樣的代碼量會(huì)最少并且也最容易維護(hù)。為了使注入如你所愿,需要把MileageFeeCalculator像這樣注入。

@Controllerpublic class MileageFeeController { @Autowired private MileageFeeCalculator calc; @RequestMapping('/mileage/{miles}') @ResponseBody public float mileageFee(@PathVariable int miles) {return calc.mileageCharge(miles); }}

如果你需要為不同的請求都創(chuàng)建一個(gè)類的新實(shí)例,可以通過Spring注解的scopes實(shí)現(xiàn)。

使用@Configurable

如果你真的需要把new出來的對象保存進(jìn)行注入,那可以使用Spring的@Configurable注解,通過使用AOP在編譯時(shí)織入你的對象中。這種方法將代碼插入到對象的構(gòu)造函數(shù)中,提醒Spring這個(gè)對象正在被創(chuàng)建,這樣Spring就能夠配置新實(shí)例了。這需要你添加一些配置信息。并打開Spring的運(yùn)行時(shí)配置處理器。Roo Active Record系統(tǒng)使用這種方法來允許實(shí)體的new實(shí)例獲取注入的必要持久性信息。

@Service@Configurablepublic class MileageFeeCalculator { @Autowired private MileageRateService rateService; public float mileageCharge(final int miles) {return (miles * rateService.ratePerMile()); }}手動(dòng)查找bean:不推薦

這種方法只適用于在特殊情況下與遺留代碼對接。創(chuàng)建一個(gè)Spring可以自動(dòng)注入并且遺留代碼也能調(diào)用的單例適配器總是可取的,但是也許可以直接向spring application context請求bean實(shí)例。

為了做到這點(diǎn),你需要一個(gè)類,該類提供了對ApplicationContext對象的引用

@Componentpublic class ApplicationContextHolder implements ApplicationContextAware { private static ApplicationContext context; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {context = applicationContext; } public static ApplicationContext getContext() {return context; }}

之后你的遺留代碼就可以調(diào)用getContext()方法獲取所需的bean實(shí)例了。

@Controllerpublic class MileageFeeController {@RequestMapping('/mileage/{miles}') @ResponseBody public float mileageFee(@PathVariable int miles) {MileageFeeCalculator calc = ApplicationContextHolder.getContext().getBean(MileageFeeCalculator.class);return calc.mileageCharge(miles); }}

以上就是Spring自動(dòng)注入失敗的解決方法的詳細(xì)內(nèi)容,更多關(guān)于Spring自動(dòng)注入失敗的解決的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 欧美成年黄网站色视频 | 香蕉在线影院 | 国产中文字幕一区 | 精品久久久久久国产 | а天堂中文最新一区二区三区 | 亚洲精品视频在线 | 精品国产乱码久久久久久88av | 精品自拍视频 | 99久久免费精品国产男女性高好 | 亚洲一区中文字幕在线观看 | 精品成人一区 | 国产精品成人在线观看 | 91精品久久久久久综合五月天 | 国产在线综合视频 | 久久精品色欧美aⅴ一区二区 | 国产精品伦理一区 | 欧日韩毛片 | igao视频| a√毛片 | 亚洲精品在线免费 | 成人在线观看免费 | 亚洲视频一 | 午夜精品亚洲日日做天天做 | 国产欧美精品一区二区三区 | 婷婷激情综合 | 91亚洲精品久久久 | 国产精品久久久久久久久久久新郎 | 色综合免费 | 欧美成人激情 | 色婷婷国产精品免费网站 | 国产精品1区2区 | 一区在线观看视频 | 国产精品永久 | 亚洲精品一二三 | 久久99国产精品 | 亚洲精品乱码8久久久久久日本 | 国产伦精品一区二区三区在线 | 伊人看片| 成人免费淫片aa视频免费 | 欧美一区不卡 | 成人aaaa|