Что такое «осведомлен»?Когда я должен включить в свое имя класса? - PullRequest
18 голосов
/ 31 мая 2011

Иногда я нахожу некоторые имена классов, включая Aware , например ApplicationContextAware и MessageSourceAware (весна).Имеет ли это Aware особые значения или это известное правило?

Ответы [ 4 ]

15 голосов
/ 31 мая 2011

Это не классы, а интерфейсы.Название - это просто соглашение о Spring, означающее, что некоторый специальный объект платформы будет внедрен в этот класс, если он управляется инфраструктурой.

Непосредственно из документов ApplicationContextAware :

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

В этом случае компонент, реализующий этот интерфейс, получитссылка на ApplicationContext, управляющий приложением.

5 голосов
/ 31 мая 2011

Добавление прилагательных, таких как «в курсе», до конца является схемой именования, часто используемой для интерфейсов Java.Затем это может быть реализовано классами, и в результате получается код, который более свободно читается для людей, например

class Broker implements ApplicationContextAware { /* ... */ }

, где довольно легко увидеть, что этот класс является посредником для чего-либо, и онзнает, как обращаться с контекстами приложения.Кроме того, суффикс «Aware» не имеет особого значения с точки зрения Java (компилятор).

2 голосов
/ 31 мая 2011

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

Я бы воспринял это просто как попытку найти общее имя для интерфейса, который предлагает такую ​​функциональность, не обязательно строгое соглашение с конкретным техническим значением.

1 голос
/ 16 мая 2016

Концепция осведомленных интерфейсов:

Если мне нужна ссылка на объекты классов пружин, таких как XmlBeanFactory, ApplicationContext ... В 2 или более классах есть 3 возможных способа.

  1. создание 2 BeanFactories в двух классах.
  2. создание в одном классе и совместное использование со всеми необходимыми классами.

В 1-м случае мы без необходимости создаем 2 BeanFactories. Во втором случае классы тесно связаны друг с другом.

  1. Если наш класс реализует интерфейс BeanFactoryAware и переопределяет договорный метод с именем public BeanFactory setBeanFactory(BeanFactory factory), тогда IOC container видит этот специальный интерфейс и вызывает метод setBeanFactory, устанавливая BeanFactory ссылку на него.

В случае 3. выше двух проблем не существует.

...