@Autowired注解在抽象类中失效的原因及解决

 更新时间:2021年08月14日 11:32:52   作者:jy的blog  
这篇文章主要介绍了@Autowired注解在抽象类中失效的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

@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

1.简介

在本快速教程中,我们将说明如何在抽象类中使用 @Autowired 自动装配注解。

我们将 @Autowired 应用于 abstract 抽象类,并关注此时要考虑的重点。

2.Setter 方式注入

我们可以在设置方法上使用_@Autowired_:

public abstract class BallService {
    private LogRepository logRepository;
    @Autowired
    public final void setLogRepository(LogRepository logRepository) {
        this.logRepository = logRepository;
    }
}

当我们使用_@Autowired_上setter方法,我们应该用final 关键字,这样子类便不能覆盖setter方法。否则,注解将无法正常运行。

3.构造函数注入

我们不能在抽象类的构造函数上使用_@Autowired_。

Spring 不会在抽象类的构造函数上解析 @Autowired 注解。子类应为 super 构造函数提供必要的参数。

相反,我们应该在子类的构造函数上使用_@Autowired_:

public abstract class BallService {
    private RuleRepository ruleRepository;
    public BallService(RuleRepository ruleRepository) {
        this.ruleRepository = ruleRepository;
    }
}
@Component
public class BasketballService extends BallService {
    @Autowired
    public BasketballService(RuleRepository ruleRepository) {
        super(ruleRepository);
    }
}

4.备忘单

让我们总结一些要记住的规则。

首先,抽象类不会进行组件扫描,因为没有具体的子类就无法实例化。

其次,在抽象类中可以进行setter注入,但是如果不对setter方法使用_final_关键字,因而存在一定误用的风险。如果子类覆盖 setter 方法,则应用程序可能不能正常运行。

第三,由于 Spring 在抽象类中不支持构造函数注入,因此通常应该让具体的子类提供构造函数参数。这意味着我们需要在具体子类中依赖构造函数注入。

最后,将构造函数注入用于必需的依赖项,并将setter注入用于可选的依赖项是一个很好的经验法则。但是,正如我们可以从抽象类的一些细微差别中看到的那样,通常在这里构造函数注入更为有利。

因此,实际上我们可以说具体的子类控制着它的抽象父类如何获得其依赖项。 Spring 在装配子类时, 会对其依赖进行注入。

5.结论

在本文中,我们练习了在抽象类中使用_@Autowired_,并解释了一些关键点。

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

相关文章

  • java关键字final使用方法详解

    java关键字final使用方法详解

    在程序设计中,我们有时可能希望某些数据是不能够改变的,这个时候final就有用武之地了。final是java的关键字,本文就详细说明一下他的使用方法
    2013-11-11
  • 详解Flutter TabLayout 布局用法

    详解Flutter TabLayout 布局用法

    Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。这篇文章主要介绍了Flutter TabLayout 布局用法,需要的朋友可以参考下
    2019-07-07
  • Java的递归算法详解

    Java的递归算法详解

    Java递归算法是基于Java语言实现的递归算法。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。接下来通过本文给大家介绍Java递归算法相关知识,感兴趣的朋友一起学习吧
    2021-09-09
  • 一种求正整数幂的高效算法详解

    一种求正整数幂的高效算法详解

    本篇文章是对java中一种求正整数幂的高效算法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Java超详细梳理异常处理机制

    Java超详细梳理异常处理机制

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等
    2022-04-04
  • mybatis实现遍历Map的key和value

    mybatis实现遍历Map的key和value

    这篇文章主要介绍了mybatis实现遍历Map的key和value方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 解决SpringMVC接收不到ajaxPOST参数的问题

    解决SpringMVC接收不到ajaxPOST参数的问题

    今天小编就为大家分享一篇解决SpringMVC接收不到ajaxPOST参数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • 详解Spring MVC自动为对象注入枚举类型

    详解Spring MVC自动为对象注入枚举类型

    本篇文章主要介绍了Spring MVC自动为对象注入枚举类型,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • java中把字符串转成 double的方法

    java中把字符串转成 double的方法

    Java 中可以使用 Double 类中的静态方法 parseDouble() 将一个字符串转换为 double 类型的数值,本文结合实例代码对java字符串转成 double详细讲解,需要的朋友参考下吧
    2023-08-08
  • spring boot 1.5.4 集成shiro+cas,实现单点登录和权限控制

    spring boot 1.5.4 集成shiro+cas,实现单点登录和权限控制

    这篇文章主要介绍了spring boot 1.5.4 集成shiro+cas,实现单点登录和权限控制,需要的朋友可以参考下
    2017-06-06

最新评论