@Autowired注解在抽象类中实效的原因分析

最近在工作中遇到这个问题,在抽象类中使用Autowired这个注解,注入mybatis的dao时,总是出现空指针异常,通过日志的打印,发现是这个dao注入失败为空。然后通过new出spring上下文对象,再去调用getBean()方法,获取到这个注入的dao,这样是可行的,但是总是觉得这不是最佳实践,一定有比这个更加优雅的方式能解决这个问题。

我们来还原一下这个问题:

1.定义一个抽象类,声明为spring组件,在其中自动装配另一个bean:

1 @Component
2 public abstract class BaseService {
3      @Autowired
4      Dao dao;
5  }

2.然后在他的子类中使用这个自动装配的对象:

1 @Component
2 public class myService extends BaseService{
3     public void print(){
4         //运行时为null
5         System.out.print(dao.toString());
6     }
7 }

在我们实例化子类对象的时候,抽象父类不能实例化,因为spring注入的是实例对象,而不是类,所以spring不会将dao自动装配注入到一个实例中。但是我们通过在在抽象类中获取的上下文对象中却可以拿到dao,因为这个上下文对象

是我们自己手动new出来的,不是spring通过反射注入到对象中去的。因此这种方案是可行的。

下面介绍一种更优雅的解决方案:

1.同样是定义一个抽象类;

1 public class BaseService {
2     Dao dao;
3 }

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更加优雅呢?

时间: 2024-10-09 14:29:47

@Autowired注解在抽象类中实效的原因分析的相关文章

SQL中常见sqlCode原因分析

000 | 00000 | SQL语句成功完成 01xxx | SQL语句成功完成,但是有警告 +012 | 01545 | 未限定的列名被解释为一个有相互关系的引用 +098 | 01568 | 动态SQL语句用分号结束 +100 | 02000 | 没有找到满足SQL语句的行 +110 | 01561 | 用DATA CAPTURE定义的表的更新操作不能发送到原来的子系统 +111 | 01590 | 为2型索引设置了SUBPAGES语句 +117 | 01525 | 要插入的值的个数不等于

@Autowired注解

@Autowired注解,默认情况下,如果因为找不到合适的bean将会导致autowiring抛出失败异常,可以通过@Autowired(required=false)的方式避免. @Autowired注解可以用于成员变量.set方法.构造器(一个类中只能有一个构造被注释成@Autowired(required=true)).list集合.map. 新建一个web项目,导入jar包,jar包如图: 一.@Autowired注解用于成员变量.set方法.构造器(一个类中只能有一个构造被注释成@Au

Spring中@Autowired注解与自动装配

1 使用配置文件的方法来完成自动装配我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法.比如:Boss 拥有 Office 和 Car 类型的两个属性:public class Boss { private Car car; private Office office; // 省略 get/setter @Override public String toString() { retu

Spring中@Autowired注解、@Resource注解的区别(转)

标签: Autowired Resource Spring(3)  Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分是name和type,Spring将@Reso

Spring中@Autowired注解、@Resource注解的区别

Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析

@Resource与@Autowired注解的区别

一.写本博文的原因 年初刚加入到现在的项目时,在使用注解时我用的@Resource.后来,同事:你怎么使用@Resource注解?我:使用它有错吗?同事:没错,但是现在都使用@Autowired.我:我研究一下. 在大学,学习J2EE实训时一直使用的是@Resource注解,后来我就养成习惯了.现在对这两个注解做一下解释: @Resource默认按照名称方式进行bean匹配,@Autowired默认按照类型方式进行bean匹配 @Resource(import javax.annotation.

@Autowired注解与@Qualifier注解搭配使用

问题:当一个接口实现由两个实现类时,只使用@Autowired注解,会报错,如下图所示 实现类1 实现类2 controller中注入 然后启动服务报错,如下所示: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean

@Autowired注解与@Qualifier注解搭配使用----解决多实现选择注入问题

问题:当一个接口实现由两个实现类时,只使用@Autowired注解,会报错,如下图所示 实现类1 实现类2 controller中注入 然后启动服务报错,如下所示: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean

Bean装配之@Autowired注解

@Required(不常用) @Autowired(常用) 下面用例子解释以上内容: @Autowired注解的三种方式如下,第一种是直接在属性名上加注解,这样就可以不用在写set方法进行注入,这种方式与set方式作用一样:第二种是在set方法上加注解:第三种是在构造器上加注解 测试代码如下: xml配置文件正常即可: 图解:可以在当前类中,声明ApplicationContext的引用,然后可以用@Autowired进行注解,这时候可以在当前类中得到这个容器,并且可以使用这个容器了 图解: 数