基于spring注入为null的原因及解决方案

目录
  • spring注入为null
    • 场景
    • 经检查找出原因
    • 解决方法
      • @PostConstruct:
  • Spring注入的属性为null可能的情况
    • 保证Bean能够交付给Spring容器
    • 检查实例化的方式
    • 检查注入的位置

spring注入为null

解决方法用到@PostConstruct注解,平常没接触过,写博客记录一下。

场景

在使用Aviator时需要自定义函数,但是在使用自定函数的时候发现@Resource注入的类是null,使用的框架是springboot所以没什么好配置的,在网上找了下原因,找到其中一个“在spring中如果使用new创建一个对象时,这个对象将不在受spring管理器管理”的博客,所以检查了下自己是否使用new方式管理bean。

经检查找出原因

在项目启动时我用了静态块用new方式管理了bean。

但是使用静态块必须使用静态变量,而spring无法注入静态变量(有方法可以实现,但是比较麻烦)。

解决方法

将静态块改造成方法,并且使用注入方式传入对象,然后使用@PostConstruct注解,在将在依赖注入完成后,自动执行被注解的方法,这样就达到了启动项目注册函数的效果。

@PostConstruct:

被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。

Spring注入的属性为null可能的情况

Spring注入的属性为null可能的情况,使用注解方式。

保证Bean能够交付给Spring容器

1、你的组件上面是否加入了合适的注解。例如:@Service, @Component等。

2、检查一下你context-scan扫描器配置的路径是否正确。(SpringBoot检查一下你的包是否和主入口程序在一个目录下,并且检@ComponentScan配置的路径是否正确)

检查实例化的方式

1、很低级问题,但是一不注意就犯了。检查是不是new了一个对象,这样的话就绕过了容器的依赖注入过程,也可能出现获取不到应有的属性这种情况。

说明:Spring是一个bean的容器,由容器负责对象的初始化和依赖注入。当我们想要从中获取一个Bean的实例时,就从Spring容器中获取。

检查注入的位置

1、把@Autowired注解加在了一个静态属性上,注入为空。

说明:Spring帮我们做属性的自动注入,是在帮助我们实例化Bean之后完成的。而static修饰该属性是归属于类而不是实例的。当Spring我们想给static属性注入值的时候,对象还没创建,这种情况一定会出现注入为空的情况。

2、在应用的Filter或Listener中使用了@Autowired ,注入为空web容器启动是按照一定顺序的,即:Listener --> Filter -->Servlet。

因为Filter和Listener加载顺序优先于spring容器初始化实例,所以会出现null。Spring的入口就在Servlet里。可以用ApplicationContext根据bean名称(注意名称为实现类而不是接口)去获取bean

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Spring关于@Resource注入为null解决办法

    初学spring,我在dao层初始化c3p0的时候,使用@Resource注解新建对象是发现注入为null,告诉我 java.lang.NullPointerException. @Repository public class UserDaoImpl implements UserDao { @Resource ComboPooledDataSource dataSource; 反复检查了配置文件,没有发现任何问题,最后在同学的帮助下终于发现了问题的所在,特记录于此,一个教训. 问题就出在我的

  • 解决SpringMvc中普通类注入Service为null的问题

    SpringMvc中普通类注入Service为null 场景: 使用Quartz定时器时,普通的java类需要注入spring的service类,在调用时报错! 解决方式: /** * 定时获取课程的service */ @Autowired protected QuartzGetCourseService quartzGetCourseService = (QuartzGetCourseService) SpringContextUtil .getBean("quartzGetCourseSe

  • 解决springboot遇到autowire注入为null的问题

    这个问题困扰了很久,有些类不是controller在使用autowired注入的类显示为空,找到网上的方法是在类初始化时主动注入被Autowired的类,如下图 这样的方法是可行的,最后引用时使用上图中doubleTeachSendMsg.doubleTeachService.sendMsg();方法即可,但是使用起来未免太麻烦,而且也不是spring依赖注入的原则,这个出现原因其实就是此类是在bean加载之前被调用,或者springboot在加载时没有识别到此类,所以注入为空,要想使此类被识别

  • SpringBoot的拦截器中依赖注入为null的解决方法

    该项目是基于SpringBoot框架的Maven项目. 今天在拦截器中处理拦截逻辑时需要使用注解调用其他方法 并且要从配置文件中读取参数.所以我使用了以下注解: @Reference CoreRedisService redisService; @Value("${channel}") private String channel; @Value("${allowMethod}") private String allowMethod; 一个是获取接口的引用,两外两

  • 基于spring注入为null的原因及解决方案

    目录 spring注入为null 场景 经检查找出原因 解决方法 @PostConstruct: Spring注入的属性为null可能的情况 保证Bean能够交付给Spring容器 检查实例化的方式 检查注入的位置 spring注入为null 解决方法用到@PostConstruct注解,平常没接触过,写博客记录一下. 场景 在使用Aviator时需要自定义函数,但是在使用自定函数的时候发现@Resource注入的类是null,使用的框架是springboot所以没什么好配置的,在网上找了下原因

  • @Autowired注入为null问题原因分析

    问题说明 最近看到Spring事务,在学习过程中遇到一个很苦恼问题 搭建好Spring的启动环境后出现了一点小问题 在启动时候却出现[java.lang.NullPointerException] 不过因为当时一个小小的疏忽很low的问题 请往下看... 工程结构 代码片段 spring.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springfr

  • Spring在多线程下@Resource注入为null的问题

    目录 多线程下@Resource注入为null 前情叙述 解决方案 附上其它解决 多线程下@Resource注入为null 前情叙述 记录以下这个坑,我的情况大致是这样的,我在用webmagic写爬虫,在类中通过@Resoource(@Autowired也一样)注入dao接口实例. 然后我在process方法中引用这个实例发现这个实例在这里一直为null,然后我在测试类或者当前类的main函数中引用dao实例就没问题,一切正常(当时 黑人问号脸???) 几经波折,发现原因是spring和多线程安

  • 基于spring DI的三种注入方式分析

    一.前言: IOC(控制反转)与DI(依赖注入) Spring框架对Java开发的重要性不言而喻,其核心特性就是IOC(Inversion of Control, 控制反转)和AOP,平时使用最多的就是其中的IOC,我们通过将组件交由Spring的IOC容器管理,将对象的依赖关系由Spring控制,避免硬编码所造成的过度程序耦合. 在讲依赖注入之前,我觉得有必要了解一下IOC(控制反转)与DI(依赖注入)的关系,在这篇文章中有详细的介绍:spring IOC 与 DI. 二.DI的三种常见注入方

  • 基于spring三方包类注入容器的四种方式小结

    如果引用第三方jar包,肯定是不能直接使用常用注解@Controller.@Service.@Repository.@Component将类的实例注入到spring容器中.以下四种方法可以向spring容器中导入三方包中类实例 . 1 xml配置 这种情况大家用的比较多,就是在spring的xml文件中配置需要导入的bean.在springweb项目工程web.xml中 ContextLoaderListener或者DispatcherServlet的初始参数contextConfigLocat

  • Spring不能注入Static变量的原因及Spring注入静态变量

    下面给大家介绍spring不能注入static变量的原因,具体详情如下所示: Spring 依赖注入 是依赖 set方法 set方法是 是普通的对象方法 static变量是类的属性 @Autowired private static JdbcTemplate jdbcTemplate; 单纯看这个注入过程是没有报错的,但是在接下来的jdbcTemplate.query()会报空指针错误. ps:Spring注入静态变量 今天碰到一个问题,我的一个工具类提供了几种静态方法,静态方法需要另外一个类的

  • 基于Spring + Spring MVC + Mybatis 高性能web构建实例详解

    一直想写这篇文章,前段时间痴迷于JavaScript.NodeJs.AngularJS,做了大量的研究,对前后端交互有了更深层次的认识. 今天抽个时间写这篇文章,我有预感,这将是一篇很详细的文章,详细的配置,详细的注释,看起来应该很容易懂. 用最合适的技术去实现,并不断追求最佳实践.这就是架构之道. 希望这篇文章能给你们带来一些帮助,同时希望你们可以为这个项目贡献你的想法. 源码地址:https://github.com/Eliteams/quick4j 点击打开 源码地址:https://gi

  • 基于Spring中的线程池和定时任务功能解析

    1.功能介绍 Spring框架提供了线程池和定时任务执行的抽象接口:TaskExecutor和TaskScheduler来支持异步执行任务和定时执行任务功能.同时使用框架自己定义的抽象接口来屏蔽掉底层JDK版本间以及Java EE中的线程池和定时任务处理的差异. 另外Spring还支持集成JDK内部的定时器Timer和Quartz Scheduler框架. 2.线程池的抽象:TaskExecutor TaskExecutor涉及到的相关类图如下: TaskExecutor接口源代码如下所示: p

  • 基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(详解)

    1.pom添加依赖 <!-- spring data jpa,会注入tomcat jdbc pool/hibernate等 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <

随机推荐