电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

我有一個被Spring @Service注解的類(MileageFeeCalculator),它有一個用@Autowired注入的變量(rateService),但是當(dāng)我用這個變量的時候,它顯示為null。日志顯示MileageFeeCalculator bean和MileageRateService bean都被創(chuàng)建了,但是當(dāng)我調(diào)用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 }}

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

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

為什么我調(diào)用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關(guān)鍵字創(chuàng)建的類,也無法自動注入它。

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

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

注入你的bean

最好的選擇是讓Spring注入所有的bean;這樣的代碼量會最少并且也最容易維護(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)建一個類的新實例,可以通過Spring注解的scopes實現(xiàn)。

使用@Configurable

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

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

這種方法只適用于在特殊情況下與遺留代碼對接。創(chuàng)建一個Spring可以自動注入并且遺留代碼也能調(diào)用的單例適配器總是可取的,但是也許可以直接向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; }}

之后你的遺留代碼就可以調(diào)用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自動注入失敗的解決方法的詳細(xì)內(nèi)容,更多關(guān)于Spring自動注入失敗的解決的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 干式磁选机_湿式磁选机_粉体除铁器-潍坊国铭矿山设备有限公司 | 冷藏车厂家|冷藏车价格|小型冷藏车|散装饲料车厂家|程力专用汽车股份有限公司销售十二分公司 | 免费分销系统 — 分销商城系统_分销小程序开发 -【微商来】 | 石牌坊价格石牌坊雕刻制作_石雕牌坊牌楼石栏杆厂家_山东嘉祥石雕有限公司 | 高低温老化试验机-步入式/低温恒温恒湿试验机-百科 | 润滑脂-高温润滑脂-轴承润滑脂-食品级润滑油-索科润滑油脂厂家 | 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | 东莞螺丝|东莞螺丝厂|东莞不锈钢螺丝|东莞组合螺丝|东莞精密螺丝厂家-东莞利浩五金专业紧固件厂家 | 北京中创汇安科贸有限公司| 螺杆真空泵_耐腐蚀螺杆真空泵_水环真空泵_真空机组_烟台真空泵-烟台斯凯威真空 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 水质传感器_水质监测站_雨量监测站_水文监测站-山东水境传感科技有限公司 | 5L旋转蒸发器-20L-50L旋转蒸发器-上海越众仪器设备有限公司 | 真空冷冻干燥机_国产冻干机_冷冻干燥机_北京四环冻干 | 高温高压釜(氢化反应釜)百科| 精密线材测试仪-电线电缆检测仪-苏州欣硕电子科技有限公司 | 蔬菜配送公司|蔬菜配送中心|食材配送|饭堂配送|食堂配送-首宏公司 | 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 制氮设备_PSA制氮机_激光切割制氮机_氮气机生产厂家-苏州西斯气体设备有限公司 | FAG轴承,苏州FAG轴承,德国FAG轴承-恩梯必传动设备(苏州)有限公司 | 自清洗过滤器-全自动自清洗过反冲洗过滤器 - 中乂(北京)科技有限公司 | 防爆电机-高压防爆电机-ybx4电动机厂家-河南省南洋防爆电机有限公司 | 不锈钢闸阀_球阀_蝶阀_止回阀_调节阀_截止阀-可拉伐阀门(上海)有限公司 | 事迹材料_个人事迹名人励志故事| 电子元器件呆滞料_元器件临期库存清仓尾料_尾料优选现货采购处理交易商城 | 铜镍-康铜-锰铜-电阻合金-NC003 - 杭州兴宇合金有限公司 | 猪I型/II型胶原-五克隆合剂-细胞冻存培养基-北京博蕾德科技发展有限公司 | 液晶拼接屏厂家_拼接屏品牌_拼接屏价格_监控大屏—北京维康 | 学生作文网_中小学生作文大全与写作指导 | 深圳天际源广告-形象堆头,企业文化墙,喷绘,门头招牌设计制作专家 | 齿轮减速机电机一体机_齿轮减速箱加电机一体化-德国BOSERL蜗轮蜗杆减速机电机生产厂家 | 重庆中专|职高|技校招生-重庆中专招生网 | 多功能真空滤油机_润滑油全自动滤油机_高效真空滤油机价格-重庆润华通驰 | 没斑啦-专业的祛斑美白嫩肤知识网站-去斑经验分享 | 高空重型升降平台_高空液压举升平台_高空作业平台_移动式升降机-河南华鹰机械设备有限公司 | 烽火安全网_加密软件、神盾软件官网| 北京软件开发_软件开发公司_北京软件公司-北京宜天信达软件开发公司 | 细砂提取机,隔膜板框泥浆污泥压滤机,螺旋洗砂机设备,轮式洗砂机械,机制砂,圆锥颚式反击式破碎机,振动筛,滚筒筛,喂料机- 上海重睿环保设备有限公司 | 水厂自动化-水厂控制系统-泵站自动化|控制系统-闸门自动化控制-济南华通中控科技有限公司 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 |