Интерфейсите на BeanNameAware и BeanFactoryAware през пролетта

1. Общ преглед

В този бърз урок ще се съсредоточим върху интерфейсите BeanNameAware и BeanFactoryAware в Spring Framework .

Ще опишем всеки интерфейс поотделно с плюсовете и минусите на тяхното използване.

2. Осъзнат интерфейс

Както BeanNameAware, така и BeanFactoryAware принадлежат към интерфейса на коренния маркер org.springframework.beans.factory.Aware . Това използва инжектор на сетер, за да получи обект по време на стартиране на контекста на приложението.

Интерфейсът Aware е комбинация от модели на обратен разговор, слушател и наблюдател . Това показва, че бобът отговаря на условията да бъде уведомен от контейнера Spring чрез методите за обратно извикване.

3. BeanNameAware

BeanNameAware уведомява обекта за името на боб, дефинирано в контейнера .

Нека да разгледаме един пример:

public class MyBeanName implements BeanNameAware { @Override public void setBeanName(String beanName) { System.out.println(beanName); } }

В beanName Имотът представлява боб идентификатор регистрирано в съда пролет. В нашата реализация ние просто показваме името на боб.

След това нека регистрираме боб от този тип в Spring конфигурационен клас:

@Configuration public class Config { @Bean(name = "myCustomBeanName") public MyBeanName getMyBeanName() { return new MyBeanName(); } }

Тук изрично сме присвоили име на нашия клас MyBeanName с реда @Bean (name = “myCustomBeanName”) .

Сега можем да стартираме контекста на приложението и да получим bean от него:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class); MyBeanName myBeanName = context.getBean(MyBeanName.class);

Както очакваме, методът setBeanName отпечатва “myCustomBeanName” .

Ако премахнем кода name = “...” от анотацията @Bean, контейнерът в този случай присвоява име на метода getMyBeanName () в боб. Така че изходът ще бъде “getMyBeanName” .

4. BeanFactoryAware

BeanFactoryAware се използва за инжектиране на обекта BeanFactory . По този начин получаваме достъп до BeanFactory, който е създал обекта.

Ето пример за клас MyBeanFactory :

public class MyBeanFactory implements BeanFactoryAware { private BeanFactory beanFactory; @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } public void getMyBeanName() { MyBeanName myBeanName = beanFactory.getBean(MyBeanName.class); System.out.println(beanFactory.isSingleton("myCustomBeanName")); } }

С помощта на метода setBeanFactory () присвояваме референцията BeanFactory от IoC контейнера на свойството beanFactory .

След това можем да го използваме директно като във функцията getMyBeanName () .

Нека инициализираме MyBeanFactory и извикаме метода getMyBeanName () :

MyBeanFactory myBeanFactory = context.getBean(MyBeanFactory.class); myBeanFactory.getMyBeanName();

Тъй като вече създадохме инстанция на класа MyBeanName в предишния пример, Spring ще извика съществуващия екземпляр тук.

Редът beanFactory.isSingleton (“myCustomBeanName”) потвърждава това.

5. Кога да се използва?

Типичният случай на употреба за BeanNameAware може да бъде придобиването на името на боб за целите на регистриране или свързване. За BeanFactoryAware това може да бъде възможността да се използва пролетен боб от стария код.

В повечето случаи трябва да избягваме използването на някой от интерфейсите на Aware , освен ако не се нуждаем от тях. Внедряването на тези интерфейси ще свърже кода с рамката Spring.

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

В това описание научихме за интерфейсите BeanNameAware и BeanFactoryAware и как да ги използваме на практика.

Както обикновено, пълният код за тази статия е достъпен в GitHub.