在抽象类中使用@Autowired

简介: 在本快速教程中,我们将说明如何在抽象类中使用 @Autowired 自动装配注解。我们将 @Autowired 应用于 abstract 抽象类,并关注此时要考虑的重点。

在抽象类中使用@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_,并解释了一些关键点。

可以在Github项目中找到本教程的源代码 。

相关文章
|
6月前
|
Java Spring
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
`@RequiredArgsConstructor(onConstructor = @__(@Autowired))` 是一个注解,通常用于在类中生成一个包含所有`final`和`@NonNull`注解的字段的构造函数,并且对这些字段进行自动注入(使用Spring框架的`@Autowired`注解)。让我们详细解释一下: 1. **`@RequiredArgsConstructor` 注解:** - **作用:** Lombok 提供的注解,用于自动生成类的构造函数。 - **生成的构造函数:** 生成一个包含所有`final`字段的构造函数,同时也包括被`@NonNull`注解
648 1
|
5月前
|
Java
@RequiredArgsConstructor(onConstructor_ = @Autowired)报错
@RequiredArgsConstructor(onConstructor_ = @Autowired)报错
|
6月前
|
Java Spring 容器
同一接口有多个实现类,怎么来注入一个指定的实现?@Resource、@Autowired、@Qualifier
同一接口有多个实现类,怎么来注入一个指定的实现?@Resource、@Autowired、@Qualifier
267 0
@RequiredArgsConstructor(onConstructor=@_(@Autowired))是什么语法?
@RequiredArgsConstructor(onConstructor=@_(@Autowired))是什么语法?
222 0
|
设计模式 Java uml
Java设计模式-抽象工厂模式Abstract Factory
Java设计模式-抽象工厂模式Abstract Factory
SpringAOP导致@Autowired依赖注入失败
SpringAOP导致@Autowired依赖注入失败
198 1
|
程序员 PHP 开发者
抽象类 Abstract|学习笔记
快速学习抽象类 Abstract
抽象类 Abstract|学习笔记
通过实现ApplicationContextAware接口获取Bean
通过实现ApplicationContextAware接口获取Bean
143 0
|
XML Java 编译器
@Autowired 注解是如何实现的?
使用spring开发时,进行配置主要有两种方式,一是xml的方式,二是java config的方式
@Autowired 注解是如何实现的?
|
Java 程序员
每天一个知识点(六)抽象类必须要有抽象方法吗?抽象类能使用 final 修饰吗?
抽象类必须要有抽象方法吗?抽象类能使用 final 修饰吗?