Spring @Autowired 注入为 null
原因
- 配置缺失,比如为开启注解扫描驱动、注入组件为注册;
- 使用 new 关键字创建的对象不受spring容器管理,无法注入;
- 注入静态变量, 静态变量/类变量不是对象的属性,而是一个类的属性,spring则是基于对象层面上的依赖注入。
。
懂的直接上代码先
静态注入的三种方式
在一些工具类中可能会依赖 service 层的对象,一般情况下工具类都是使用静态方法,对应的成员变量也需要声明为静态的,此时如果直接使用 @Autowired 进行依赖注入,在方法调用的时候会报 NullpointerException.
- @Autowired
- private static AdvancedDatastore dsForRW;
可以试一下,dsForRW在这种状态下不能够被依赖注入,会抛出运行时异常java.lang.NullPointerException,为什么呢?静态变量/类变量不是对象的属性,而是一个类的属性,spring则是基于对象层面上的依赖注入。
但是自己比较喜欢封装工具类,并通过@Component注解成功能组件,但是功能组件中的方法一般都是静态方法,静态方法只能调用静态成员变量,于是就有了下面的问题。封有的时候封装功能组件会需要底层的service注入,怎么办呢?
去网上搜了下解决办法,简单总结一下几种实现方式;
- 1.xml方式实现
- 这种方式适合基于XML配置的WEB项目;
- <bean id="mongoFileOperationUtil" class="com.*.*.MongoFileOperationUtil" init-method="init">
- <property name="dsForRW" ref="dsForRW"/>
- </bean>
- 1
- 2
- 3
- public class MongoFileOperationUtil {
- private static AdvancedDatastore dsForRW;
- private static MongoFileOperationUtil mongoFileOperationUtil;
- public void init() {
- mongoFileOperationUtil = this;
- mongoFileOperationUtil.dsForRW = this.dsForRW;
- }
- }
- 2.@PostConstruct方式实现
- import org.mongodb.morphia.AdvancedDatastore;
- import org.springframework.beans.factory.annotation.Autowired;
- @Component
- public class MongoFileOperationUtil {
- @Autowired
- private static AdvancedDatastore dsForRW;
- private static MongoFileOperationUtil mongoFileOperationUtil;
- @PostConstruct
- public void init() {
- mongoFileOperationUtil = this;
- mongoFileOperationUtil.dsForRW = this.dsForRW;
- }
- }
@PostConstruct 注解的方法在加载类的构造函数之后执行,也就是在加载了构造函数之后,执行init方法;(@PreDestroy 注解定义容器销毁之前的所做的操作)
这种方式和在xml中配置 init-method和 destory-method方法差不多,定义spring 容器在初始化bean 和容器销毁之前的所做的操作;
3.set方法上添加@Autowired注解,类定义上添加@Component注解
- import org.mongodb.morphia.AdvancedDatastore; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MongoFileOperationUtil { private static AdvancedDatastore dsForRW; @Autowired public void setDatastore(AdvancedDatastore dsForRW) { MongoFileOperationUtil.dsForRW = dsForRW; } } 首先Spring要能扫描到AdvancedDatastore的bean,然后通过setter方法注入; 然后注意:成员变量上不需要再添加@Autowired注解;
Spring @Autowired 注入为 null的更多相关文章
- spring@Autowired注入为null的问题,2017年9月14日21点41分记录
这个小问题纠结了三个小时..发出来留个纪念 这是启动项目的时候 这是请求控制器的时候 图1注入的时候是null,图2请求控制器的时候是有的,这是因为图1debug的地方是构造器..autowire ...
- struts2的action中@Autowired注入为null的解决方案
今天遇到类似问题,记录下来以便以后查阅: @Aspect作用于action,致使action中的@Autowired注入为null的解决方案,以下三种任选一种: 1.去掉@Autowired,改用se ...
- 关于工具类中@Autowired注入为NULL的问题记录
记录:在实体类中加入@Component注解和@Autowired注解时Service不能注入成功. @Component //把普通pojo实例化到spring容器中 0 public clas ...
- Quartz定时器+Spring + @Autowired注入 空指针异常
在Quartz的定时方法里引用@Autowired注入Bean,会报空指针错误 解决办法: 第一种方法:(推荐,简单,亲测可行) 使用@Resource(name="指定要注入的Bean&q ...
- Java 各级注解及@Autowired注入为null解决办法
1.@controller 控制器 用于标注控制层,相当于struts中的action层. 2.@service 服务层 用于标注服务层,主要用来进行业务的逻辑处理. 3.@repository DA ...
- 于工具类中@Autowired注入为NULL的问题记录
记录:在实体类中加入@Component注解和@Autowired注解时Service不能注入成功. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...
- Spring Autowired 注入失败总是Null
报错:NullPointerException 分析:错误原因是注入失败? <context:annotation-config/> <context:component-scan ...
- spring @Autowired注入对象,在构造方法中为null问题
出现问题的代码如下: @Service public class BaseHttpServiceImpl implements BaseHttpClient { private final stati ...
- @Autowired注入为null问题分析
题说明 最近看到Spring事务,在学习过程中遇到一个很苦恼问题 搭建好Spring的启动环境后出现了一点小问题 在启动时候却出现[java.lang.NullPointerException] 不过 ...
随机推荐
- 下载 python
https://www.python.org/ftp/python/ https://www.cnblogs.com/linxue/p/10097785.html https://blog.csdn. ...
- shell中的字符串操作——字符串的切割
default.yaml {default_baseurl: 'http://10.113.10.68:8082'} test.sh a=`cat default.yaml` t=":&qu ...
- hlt 与 llt 相关
HLT:HIGH LEVEL TEST,通常指SDV/SIT/SVT等测试活动SDV : system design verification 系统设计验证 SIT : system integrat ...
- mybatis在sql中的CDATA区
示例 <if test="startTime != null"> <![CDATA[ AND rra.create_time >= #{startTime} ...
- 微信小程序获取当前地理位置
获取用户地理位置,需要用到以下三个api方法: wx.getSetting() : 获取用户的授权列表信息 wx.openSetting():调起客户端小程序设置界面 wx.getLocation ...
- React 版本16.9.0 中配置路由以及路由传参
我的脚手架版本如下: "dependencies": { "antd": "^3.21.4", "jquery": &q ...
- asp.net core 托管到windows服务,并用iis做反向代理
使用NSSM把.Net Core部署至 Windows 服务 为什么部署至Windows Services 在很多情况下,很少会把.Net Core项目部署至Windows服务中,特别是Asp.n ...
- RNN 的不变性
卷积神经网络的不变性 不变性的实现主要靠两点:大量数据(各种数据):网络结构(pooling)不变性的类型 1)平移不变性 卷积神经网络最初引入局部连接和空间共享,就是为了满足平移不变性. ...
- Element + Vue I18n动态import加载国际化语言包翻译文件
需求 项目为多页应用,包含产品a.b.c.d.e,每个产品都有自己的翻译文件.一次加载所有翻译文件是极度不合理的.于是考虑动态加载. 实现 参考官方文档:延迟加载翻译 项目结构 │ ├── dist ...
- 自己写的一个 CGBLIB 动态代理【原创】
CGLIB代理类,用CGLIB来实现一个代理类.大致原理描述如下: 1.使用Enhancer类来生成一个继续于被代理类的子类,此子类会重写被代理类(父类)中所有的非final的public方法: 2. ...