广告
返回顶部
首页 > 资讯 > 精选 >如何解决Spring自动注入失败的问题
  • 161
分享到

如何解决Spring自动注入失败的问题

2023-06-15 01:06:56 161人浏览 八月长安
摘要

小编给大家分享一下如何解决spring自动注入失败的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring自动注入失败如何解决?我有一个被Spring @

小编给大家分享一下如何解决spring自动注入失败的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

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自动注入失败的问题”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 如何解决Spring自动注入失败的问题

本文链接: https://www.lsjlt.com/news/276409.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解决Spring自动注入失败的问题
    小编给大家分享一下如何解决Spring自动注入失败的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring自动注入失败如何解决?我有一个被Spring @...
    99+
    2023-06-15
  • Spring自动注入失败的解决方法
    目录Spring自动注入失败如何解决?回答注入你的bean使用@Configurable手动查找bean:不推荐Spring自动注入失败如何解决? 我有一个被Spring @Ser...
    99+
    2022-11-12
  • 解决netty中spring对象注入失败的问题
    目录netty中spring对象注入失败发现了问题所在在netty中注入spring成份可以通过以下方式netty中spring对象注入失败 今天在做项目的时候发现在netty中注入...
    99+
    2022-11-13
  • 解决@FeignClient注入service失败问题
    目录@FeignClient注入service失败Feign注入失败之坑错误信息加上之后,问题解决@FeignClient注入service失败 在入口类上方加入注解 @Enable...
    99+
    2022-11-13
  • SpringBoot@Componet注解注入失败的问题
    目录@Componet注解注入失败问题描述解决方法SpringBoot @component的作用介绍举例说明 总结@Componet注解注入失败 问题描述 在spring...
    99+
    2023-03-06
    SpringBoot @Componet @Componet注解 @Componet注解注入失败
  • Springboot的spring-boot-maven-plugin导入失败的问题如何解决
    本篇内容介绍了“Springboot的spring-boot-maven-plugin导入失败的问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,...
    99+
    2023-06-20
  • springboot多模块化整合mybatis,mapper自动注入失败问题及解决
    目录springboot多模块化整合mybatis,mapper自动注入失败问题解决springboot mapper注入失败的一种原因具体情况是解决办法springboot多模块化...
    99+
    2022-11-12
  • spring自动注入失败的原因有哪些
    Spring自动注入失败的原因可能有以下几种:1. 类没有被标注为一个Spring的Bean:在需要被自动注入的类上,必须添加`@C...
    99+
    2023-09-27
    spring
  • Spring 父类变量注入失败的解决
    目录Spring 父类变量注入失败下面小记下这个过程Spring通过父类注入公用属性的技巧XML配置方式提取父类Annotation方式提取父类Spring 父类变量注入失败 昨天遇...
    99+
    2022-11-12
  • @Autowired自动注入接口失败怎么解决
    这篇文章主要介绍了@Autowired自动注入接口失败怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇@Autowired自动注入接口失败怎么解决文章都会有所收获,下面我们一起来看看吧。@Autowire...
    99+
    2023-06-29
  • Spring三种方法的注解自动注入问题
    目录Spring三种方法的注解自动注入1 @Autowired注解2 @Resource3 @InjectSpring 注解版 属性赋值 自动注入总结Spring三种方法的注解自动注...
    99+
    2022-12-28
    Spring注解 Spring自动注入 Spring注解自动注入
  • 如何解决springboot启动失败的问题
    这篇文章主要介绍如何解决springboot启动失败的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!springboot启动失败的问题springboot版本是1.3.0.M1,连接的mysql版本为8,用spr...
    99+
    2023-06-22
  • SpringCloud启动失败问题如何解决
    本篇内容主要讲解“SpringCloud启动失败问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringCloud启动失败问题如何解决”吧!SpringCloud启动失败问题Nac...
    99+
    2023-07-05
  • RocketMQTemplate 注入失败如何解决
    今天就跟大家聊聊有关RocketMQTemplate 注入失败如何解决,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。RocketMQTemplate 注入失败在使用rocketmq ...
    99+
    2023-06-20
  • @Autowired自动注入接口失败的原因及解决
    目录@Autowired 自动注入接口失败可以这样做@Autowired 自动注入失败报空指针异常今天就遇到了这个问题 @Autowired 自动注入接口失败 有个自动注入...
    99+
    2022-11-13
  • SpringBoot @Componet注解注入失败如何解决
    今天小编给大家分享一下SpringBoot @Componet注解注入失败如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-07-05
  • 如何解决通过spring-boot-maven-pluginpackage失败问题
    目录1.pom文件示例2.执行mvn package出现异常3.异常堆栈详细信息4.主要问题概述5.解决方案6.修改后pom文件7.再次执行mvn package问题解决总结1.po...
    99+
    2023-05-15
    spring-boot-maven-plugin package失败 spring-boot-maven-plugin package
  • spring cloud中Feign导入jar失败的问题及解决方案
    目录Feign导入jar失败的问题网上很多人在使用的feign时在pom.xml中填写的是用以下的方式也能够完美导入feignSpringcloudfeign异常报错及解决报错异常如...
    99+
    2022-11-13
  • 解决Spring Data Jpa 实体类自动创建数据库表失败问题
    目录Spring Data Jpa 实体类自动创建数据库表失败找了半天发现是一个配置的问题可能导致JPA 无法自动建表的问题汇总1、没加@Entity或引错Entity所在包2、jp...
    99+
    2022-11-12
  • spring bean的自动注入及循环依赖问题怎么解决
    这篇文章主要介绍了spring bean的自动注入及循环依赖问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇spring bean的自动注入及循环依赖问题怎么解决文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作