@Autowired注解在抽象类中实效的原因分析
最近在工作中遇到这个问题,在抽象类中使用Autowired这个注解,注入mybatis的dao时,总是出现空指针异常,通过日志的打印,发现是这个dao注入失败为空。然后通过new出spring上下文对象,再去调用getBean()方法,获取到这个注入的dao,这样是可行的,但是总是觉得这不是最佳实践,一定有比这个更加优雅的方式能解决这个问题。
我们来还原一下这个问题:
1.定义一个抽象类,声明为spring组件,在其中自动装配另一个bean:
@Component
public abstract class BaseService {
@Autowired
Dao dao;
}
2.然后在他的子类中使用这个自动装配的对象:
@Component
public class myService extends BaseService{
public void print(){
//运行时为null
System.out.print(dao.toString());
}
}
在我们实例化子类对象的时候,抽象父类不能实例化,因为spring注入的是实例对象,而不是类,所以spring不会将dao自动装配注入到一个实例中。但是我们通过在在抽象类中获取的上下文对象中却可以拿到dao,因为这个上下文对象
是我们自己手动new出来的,不是spring通过反射注入到对象中去的。因此这种方案是可行的。
下面介绍一种更优雅的解决方案:
1.同样是定义一个抽象类;
 public class BaseService {
     Dao dao;
 }
2.在子类中使用注解:
@Component
public class myService extends BaseService{
//Autowired修饰方法时,根据方法参数类型判断实例化哪个类
@Autowired
public void printDao(Dao dao){
super.dao = dao;//父类属性注入
} public void print(){
System.out.print(dao.toString());
}
}
这样写是不是要比我们直接去new applicationContext更加优雅呢?
@Autowired注解在抽象类中实效的原因分析的更多相关文章
- 关于在Java中链接SQLServer数据库中失败的原因分析
		首先声明:笔者是Java的初学者,并且一值是走在自学的道路上,长久以来只有“度娘”相伴.(加入了各种Java学习群,基本没有热心帮人解决问题的.可以理解-_-!!!)大神级的人物就不必看拙文了,没有什 ... 
- DB2中常见sqlCode原因分析
		000 | 00000 | SQL语句成功完成 01xxx | SQL语句成功完成,但是有警告 +012 | 01545 | 未限定的列名被解释为一个有相互关系的引用 +098 | 01568 | 动 ... 
- @Autowired注解和启动自动扫描的三种方式(spring bean配置自动扫描功能的三种方式)
		前言: @Autowired注解代码定义 @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, Elemen ... 
- @Autowired注解 --required a single bean, but 2 were found出现的原因以及解决方法
		@Autowired注解是spring用来支持依赖注入的核心利器之一,但是我们或多或少都会遇到required a single bean, but 2 were found(2可能是其他数字)的问题 ... 
- Spring中@Autowired注解与自动装配
		1 使用配置文件的方法来完成自动装配我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. ... 
- Spring中@Autowired注解、@Resource注解的区别 (zz)
		Spring中@Autowired注解.@Resource注解的区别 Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@ ... 
- Spring中Autowired注解,Resource注解和xml default-autowire工作方式异同
		前面说到了关于在xml中有提供default-autowire的配置信息,从spring 2.5开始,spring又提供了一个Autowired以及javaEE中标准的Resource注释,都好像可以 ... 
- spring boot 中@Autowired注解无法自动注入的错误
		版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/huihuilovei/article/de ... 
- Spring中 @Autowired注解与J2EE@Resource注解的区别
		在开发中经常使用到@Autowired和@Resource进行装配. 不禁好奇这两个注解的差异在何处??? 相同点: @Resource的作用相当于@Autowired,均可标注在字段或属性的sett ... 
随机推荐
- airodump-ng使用手册
			选项: -i, --ivs 捕捉WEP加密的包,忽略出IV之外的所有的包,保存为.ivs格式 airodump-ng wls35u1 -i -w captures airodump-ng wls35u ... 
- 文本域、bootstrap-table显示以及MySQL三者间的换行符问题
			首先,今天在做项目的时候遇到的一个问题,如何实现文本输入换行以及在前台Bootstrap-table中显示也能够换行. 也许你马上就会想到说,用富文本编辑器,然而我们需要实现的只是文本输入以及换行功能 ... 
- linux 内存 大于 jvm xmx
			文章来源: http://www.cnblogs.com/guozp/p/7845605.html 1.虽然你jvm参数设置了-Xms6g -Xmx6g,但操作系统不并会马上分配6G的物理内存,而是确 ... 
- Ambari概览
			文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/7886195.html 转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点, ... 
- idea for Mac 日常配置&快捷键
			配置: 1.jdk:file > project structure -- Project SDK; 快捷键: geter adn seter :command+n command+点到具体方法 ... 
- HTML5学习的价值是什么?
			随着互联网的发展和移动端的发展,很多公司对HTML5前端开发的需求旺盛,市场人才短缺供不应求. 对于HTML5的迅速发展和市场的大量需求,究竟为何HTML5如此受欢迎,它的价值在哪里呢? 语义特性(C ... 
- 【MySQL】20个经典面试题,全部答对月薪10k+
			Part2:经典题目 1.MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联: 2.MySQL中myisam与innodb的区别,至少5点 (1).问5点不同: (2).innodb引 ... 
- 写一段PHP代码,确保多个进程同时写入同一个文件成功(腾讯)
			
- python中csv文件的读取问题
			在python读取csv格式的文件时,使用csv.reader读取文件对象,出现了line contains NULL byte的错误,如下: reader = csv.reader(open(fil ... 
- centos7 忘记mysql root密码办法
			1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的状态下,其他的用户也可以任意地登录和 ... 
