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 как обычно.