Что такое "Aware"? Когда следует включать в мое имя класса?
Иногда я нахожу некоторые имена классов, включая "Aware", такие как ApplicationContextAware "и" MessageSourceAware "(spring). Имеет ли это" Aware "какие-либо особые значения или это известное правило?
Ответы
Ответ 1
Это не классы, это интерфейсы. Имя - это просто соглашение о Spring, означающее, что какой-то специальный объект рамки будет введен в этот класс, если он управляется каркасом.
Непосредственно из документов ApplicationContextAware:
Интерфейс, который будет реализован любым объектом, который хочет быть уведомленным о ApplicationContext, в котором он работает.
В этом случае bean, который реализует этот интерфейс, получит ссылку на ApplicationContext, управляющий приложением.
Ответ 2
Добавление прилагательных типа "осведомленный" в конец - это схема именования, часто используемая для интерфейсов Java. Затем это может быть реализовано классами, и в результате получается код, который более свободно читается для людей, например
class Broker implements ApplicationContextAware { /* ... */ }
где довольно легко увидеть, что этот класс является брокером для чего-то, и он знает, как справляться с контекстами приложений. Кроме того, суффикс "Aware" не имеет особого значения с точки зрения Java (компилятора).
Ответ 3
Интерфейсы, которые вы цитируете, представляют собой Spring -специальное соглашение, позволяющее объектам взаимодействовать с контейнером инъекции зависимостей, который их создал. Внедряя интерфейс, класс сигнализирует, что он хочет получить определенную информацию из контейнера и в то же время предоставляет способ передачи этой информации.
Я бы увидел это просто как попытку найти общее имя для интерфейса, предлагающего такую функциональность, не обязательно сильное соглашение с определенным техническим смыслом.
Ответ 4
Концепция осведомленных интерфейсов:
Если мне нужна ссылка на объекты классов spring, таких как XmlBeanFactory
, ApplicationContext
... В 2 или более классах существует 3 возможных способа.
- создание 2
BeanFactories
в двух классах.
- создание на одном классе и совместное использование всех необходимых классов.
В первом случае нам не нужно создавать 2 BeanFactories.
Во втором случае классы тесно связаны друг с другом.
- Если наш класс реализует интерфейс
BeanFactoryAware
и переопределяет контрактный метод под названием public BeanFactory setBeanFactory(BeanFactory factory)
, тогда IOC container
см. этот специальный интерфейс и вызывает метод setBeanFactory
, установив ссылку BeanFactory
на это.
В 3. случае выше двух проблем не существует.