Рубрики
Без рубрики

Использование @Autowired в абстрактных классах

Узнайте о различиях использования @Autowired для абстрактных классов и конкретных классов

Автор оригинала: baeldung.

1. введение

В этом кратком руководстве мы объясним, как использовать аннотацию @Autowired в абстрактных классах .

Мы применим @Autowired к абстрактному классу и сосредоточимся на важных моментах, которые мы должны принять во внимание.

2. Инъекция Сеттера

Мы можем использовать @Autowired для метода setter:

public abstract class BallService {

    private LogRepository logRepository;

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

Когда мы используем @Autowired в методе setter, мы должны использовать последнее ключевое слово , чтобы подкласс не мог переопределить метод 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 возможна в абстрактном классе , но это рискованно, если мы не используем ключевое слово final для метода setter. Приложение может быть нестабильным, если подкласс переопределяет метод setter.

В-третьих, поскольку Spring не поддерживает инъекцию конструктора в абстрактный класс, мы обычно должны позволять конкретным подклассам предоставлять аргументы конструктора . Это означает, что нам нужно полагаться на инъекцию конструктора в конкретные подклассы .

И, наконец, использование инъекции конструктора для требуемых зависимостей и инъекции сеттера для необязательных зависимостей-это хорошее эмпирическое правило . Однако, как мы видим с некоторыми нюансами с абстрактными классами, инъекция конструктора здесь в целом более выгодна .

Итак, на самом деле мы можем сказать, что конкретный подкласс управляет тем, как его абстрактный родитель получает свои зависимости . Пружина будет делать инъекцию до тех пор, пока пружина связывает подкласс.

5. Заключение

В этой статье мы практиковались с использованием @Autowired внутри абстрактного класса и объяснил несколько, но важных ключевых моментов.

Исходный код этого учебника можно найти в проекте Github как обычно.