java 注入为空_Spring @Autowired 注入为 null
原因
配置缺失,比如为开启注解扫描驱动、注入组件为注册;
使用 new 关键字创建的对象不受spring容器管理,无法注入;
注入静态变量, 静态变量/类变量不是对象的属性,而是一个类的属性,spring则是基于对象层面上的依赖注入。
。
懂的直接上代码先
静态注入的三种方式
在一些工具类中可能会依赖 service 层的对象,一般情况下工具类都是使用静态方法,对应的成员变量也需要声明为静态的,此时如果直接使用 @Autowired 进行依赖注入,在方法调用的时候会报 NullpointerException.
@Autowiredprivate static AdvancedDatastore dsForRW;
可以试一下,dsForRW在这种状态下不能够被依赖注入,会抛出运行时异常java.lang.NullPointerException,为什么呢?静态变量/类变量不是对象的属性,而是一个类的属性,spring则是基于对象层面上的依赖注入。
但是自己比较喜欢封装工具类,并通过@Component注解成功能组件,但是功能组件中的方法一般都是静态方法,静态方法只能调用静态成员变量,于是就有了下面的问题。封有的时候封装功能组件会需要底层的service注入,怎么办呢?
去网上搜了下解决办法,简单总结一下几种实现方式;
1.xml方式实现
这种方式适合基于XML配置的WEB项目;
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方式实现importorg.mongodb.morphia.AdvancedDatastore;importorg.springframework.beans.factory.annotation.Autowired;
@Componentpublic classMongoFileOperationUtil {
@Autowiredprivate staticAdvancedDatastore dsForRW;private staticMongoFileOperationUtil mongoFileOperationUtil;
@PostConstructpublic voidinit() {
mongoFileOperationUtil= this;
mongoFileOperationUtil.dsForRW= this.dsForRW;
}
}
@PostConstruct 注解的方法在加载类的构造函数之后执行,也就是在加载了构造函数之后,执行init方法;(@PreDestroy 注解定义容器销毁之前的所做的操作)
这种方式和在xml中配置 init-method和 destory-method方法差不多,定义spring 容器在初始化bean 和容器销毁之前的所做的操作;
3.set方法上添加@Autowired注解,类定义上添加@Component注解
importorg.mongodb.morphia.AdvancedDatastore;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component; @Componentpublic classMongoFileOperationUtil {private staticAdvancedDatastore dsForRW; @Autowiredpublic voidsetDatastore(AdvancedDatastore dsForRW) { MongoFileOperationUtil.dsForRW=dsForRW; }} 首先Spring要能扫描到AdvancedDatastore的bean,然后通过setter方法注入; 然后注意:成员变量上不需要再添加@Autowired注解;
java 注入为空_Spring @Autowired 注入为 null相关推荐
- JAVA学习(七)__Spring的@Autowired注入规则
@Autowired 默认是按照byType进行注入的,但是当byType方式找到了多个符合的bean,又是怎么处理的? 经过一些代码的测试,我发现,Autowired默认先按byType,如果发现找 ...
- Java 中各种空(''、\u0000、null)的区别?
在使用下面的SQL查询时,发现去不掉空格,而且把limit 去掉以后空格就没有了,琢磨了很久才发现问题的关键所在.主要是\u0000在作怪!!! select id,company_name,user ...
- @Autowired注入、构造器注入、setter注入的使用方式?区别?
文章目录 三种注入方式的使用 1.@Autowired注入(不推荐) 2.1.构造器注入(推荐) 2.2.构造器注入-lombok升级版(推荐) 3.setter注入 循环依赖问题如何解决? 注入方式 ...
- ssh 框架引入service_搭建SSH开发框架时autowired注入为空的问题
最近在搭建SSH框架,使用@Autowired自动装配时,需要注入的对象是空,表明注入失败. 尝试了很多次还是不行,现在感觉可能是spring没配置好,所以类里的注解写对也注入不进去.但是从log4j ...
- java工具类@Autowired注入失败
失败原因 使用了@PostConstruct 注解 同时java类当中存在构造函数 @PostConstructpublic void init() {autoSSPD = this;}public ...
- java应用中spring自动注入_Spring自动注入的几种方式
---恢复内容开始--- @Service("accountEmailService") public class AccountEmailServiceImpl implemen ...
- java 注入 循环_spring依赖注入——循环依赖
上一篇博客简单地分析了下依赖注入.但是对于依赖注入的很多细节,都没有深入的分析.这一篇博客会继续分析spring的依赖注入.这篇博客会解决分析getBean缓存时候遗留下来的循环依赖问题. 循环依赖分 ...
- SpringDataJPA+Hibernate框架源码剖析(六)@PersistenceContext和@Autowired注入EntityManager的区别
SpringDataJPA+Hibernate框架源码剖析系列文章: SpringDataJPA+Hibernate框架源码剖析(一)框架介绍 SpringDataJPA+Hibernate框架源码剖 ...
- static属性能用@Autowired注入吗?
本文内容: 1.起因 2.static 3.@Autowired 4.解决方案 先说结论:不能. || 起因 从某系统交接过来一部分功能的代码,其中包含了一个工具类,该工具类中用到了一个Compon ...
- 不能执行autowired_想用@Autowired注入static静态成员?官方不推荐你却还偏要这么做...
生命太短暂,不要去做一些根本没有人想要的东西.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习 ...
最新文章
- 常见前端数据格式转换
- C++编写DLL的方法
- 微信公众号开发(—)接口与服务器关联
- Cisco IOS Unicast NAT 工作原理 [一]
- 容器编排技术 -- Kubernetes kubectl create secret tls 命令详解
- java 编译class_.java文件怎样编译成.class文件,你值得一看的技巧
- centos 6.5 zabbix 离线安装历程
- Codeforces Round #359 (Div. 2) C. Robbers' watch DFS
- 【教育知识与能力】人物总结
- OSGEARTH三维地形开源项目
- 浅析麒麟信安云几大优势之“安全性”篇
- 系统分析员到底做什么?
- 〖Python〗-- 面向对象编程、继承、组合、接口和抽象类
- 电路中IC器件电压符号的解释
- 2012年世界500强排行榜(企业名单)
- c++新技能不断get中
- vue watch首次不触发的解决方案
- 五大经典算法之四贪心算法
- ROS学习笔记(2)
- 当地图遇到微博,生活其实可以这么玩