国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Spring自動注入失敗的解決方法

瀏覽:7日期:2023-07-15 11:42:06
Spring自動注入失敗如何解決?

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

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 }}

本應被注入Service但是并沒有的類

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

為什么我調用GET /mileage/3這個請求的時候,會報這樣的錯誤:

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是因為,Spring無法獲取你用new關鍵字創建的類,也無法自動注入它。

Spring Ioc容器有三個主要的邏輯組件:應用程序可以使用的注冊表(ApplicationContext);通過把依賴項與上下文中的bean匹配,將依賴的對象注入的配置器系統;以及一個依賴解析器,它可以查看許多不同bean的配置,并確定如何按必要的順序實例化和配置它們。

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

注入你的bean

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

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

如果你需要為不同的請求都創建一個類的新實例,可以通過Spring注解的scopes實現。

使用@Configurable

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

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

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

為了做到這點,你需要一個類,該類提供了對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; }}

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

@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自動注入失敗的解決方法的詳細內容,更多關于Spring自動注入失敗的解決的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
主站蜘蛛池模板: 免费国产一级特黄久久 | 精品一久久香蕉国产二月 | 中文字幕免费在线视频 | 九九香蕉 | 日韩精品一区二区三区高清 | 日韩精品亚洲人成在线观看 | 欧美性色一级在线观看 | 九九视频在线免费观看 | 久久久久久毛片免费观看 | 毛片在线播放网站 | 欧美第一视频 | 成年人免费网站视频 | 一级成人a毛片免费播放 | 国产成人精品免费视频大全办公室 | 一本伊大人香蕉高清在线观看 | 国产人做人爱免费视频 | 日韩经典在线观看 | 日本一线a视频免费观看 | 91成人免费观看在线观看 | 能直接看的一级欧美毛片 | 国产精品1区2区3区在线播放 | 久久经典免费视频 | 一本伊大人香蕉高清在线观看 | aa级毛片| 免费香蕉成视频成人网 | 欧美性精品videofree | 91大神大战丝袜美女在线观看 | 男女交性拍拍拍高清视频 | 成人精品一区久久久久 | 久久精品成人一区二区三区 | 成人www视频网站免费观看 | 国产一区二区亚洲精品天堂 | 欧美精品一区二区三区免费 | 美女午夜色视频在线观看 | 国产精品19禁在线观看2021 | 日本视频在线观看不卡高清免费 | 国产精品91在线播放 | 波多野结衣免费视频观看 | 波多野结衣在线播放视频 | 久久久久久久久a免费 | 亚洲精品在线看 |