В чем преимущество интерфейсов Spring * Aware по сравнению с внедрением необходимых объектов? - PullRequest
0 голосов
/ 16 января 2020

Spring имеет различные *Aware -интерфейсы, например. ApplicationContextAware, которые добавляют установщик к исполнителю. Имеет ли использование этих интерфейсов какие-либо преимущества по сравнению с простым запросом зависимости через обычные средства DI (например, внедрение в конструктор).

Другими словами, когда я должен предпочесть

@Service
class MyService implements ApplicationContextAware {
    private ApplicationContext applicationContext;

    void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

, а не

@Service
class MyService implements ApplicationContextAware {
    private ApplicationContext applicationContext;

    public MyService(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }
}

или

@Service
class MyService implements ApplicationContextAware {
    @Autowired
    private ApplicationContext applicationContext;
}

?

1 Ответ

1 голос
/ 16 января 2020

Все 3 примера имеют одинаковый эффект. Есть только некоторые нюансы, и, в конце концов, это вопрос стиля.

В первом примере - Spring сканирует компоненты, реализующие определенные интерфейсы маркеров, ApplicationContextAware является одним из них, и выполняет метод интерфейса с фактическим экземпляром applicationContext, предоставленным в параметре во время выполнения DI.

Второй пример работает только в Spring 4.3 и выше. Когда у вашего компонента есть единственный конструктор, который определяет его зависимости, тогда внедрение зависимостей через конструктор предполагается даже без аннотаций.

Третий - это просто простое внедрение с помощью аннотации @Autowired.

Нет простого ответа, какой путь лучше. Документация для интерфейса ApplicationContextAware даже предполагает, что вам может быть лучше с другими способами, если вам нужен applicationContext только для поиска бина (например, когда вам нужно использовать метод внедрения метода).

Подводя итог: выбор между 1-е, 2-е и 3-е - это просто выбор между различными вариантами IoC / DI, а также, если пропустить необязательную аннотацию @Autowired или нет.

PS
ваши 2-й и 3-й примеры не нужно реализовывать ApplicationContextAware интерфейс вообще. Фактически компилятор будет жаловаться, что вы не предоставляете установщик для ApplicationContect объекта.

...