BeanNameAware- und BeanFactoryAware-Schnittstellen im Frühjahr

1. Übersicht

In diesem kurzen Tutorial konzentrieren wir uns auf die Schnittstellen BeanNameAware und BeanFactoryAware im Spring Framework .

Wir werden jede Schnittstelle separat mit den Vor- und Nachteilen ihrer Verwendung beschreiben.

2. Bewusste Schnittstelle

Sowohl BeanNameAware als auch BeanFactoryAware gehören zur org.springframework.beans.factory.Aware- Root-Marker-Schnittstelle. Dies verwendet die Setter-Injektion, um ein Objekt während des Starts des Anwendungskontexts abzurufen.

Die Aware- Oberfläche ist eine Mischung aus Rückruf-, Listener- und Beobachter-Entwurfsmustern . Es zeigt an, dass die Bean berechtigt ist, vom Spring-Container über die Rückrufmethoden benachrichtigt zu werden.

3. BeanNameAware

BeanNameAware macht das Objekt auf den im Container definierten Bean-Namen aufmerksam .

Schauen wir uns ein Beispiel an:

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

Die Eigenschaft beanName repräsentiert die im Spring-Container registrierte Bean-ID. In unserer Implementierung zeigen wir einfach den Bean-Namen an.

Als Nächstes registrieren wir eine Bean dieses Typs in einer Spring-Konfigurationsklasse:

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

Hier haben wir unserer MyBeanName- Klasse mit der Zeile @Bean (name = "myCustomBeanName") explizit einen Namen zugewiesen .

Jetzt können wir den Anwendungskontext starten und die Bean daraus abrufen:

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

Wie erwartet druckt die setBeanName- Methode "myCustomBeanName" aus .

Wenn wir den Code name = "..." aus der @ Bean- Annotation entfernen , weist der Container der Bean in diesem Fall den Methodennamen getMyBeanName () zu. Die Ausgabe lautet also "getMyBeanName" .

4. BeanFactoryAware

BeanFactoryAware wird verwendet, um das BeanFactory- Objekt zu injizieren . Auf diese Weise erhalten wir Zugriff auf die BeanFactory , die das Objekt erstellt hat.

Hier ist ein Beispiel für eine MyBeanFactory- Klasse:

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")); } }

Mit Hilfe der setBeanFactory () -Methode weisen wir der beanFactory-Eigenschaft die BeanFactory- Referenz aus dem IoC-Container zu .

Danach können wir es direkt wie in der Funktion getMyBeanName () verwenden.

Initialisieren wir die MyBeanFactory und rufen die Methode getMyBeanName () auf :

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

Da wir die MyBeanName- Klasse bereits im vorherigen Beispiel instanziiert haben, ruft Spring hier die vorhandene Instanz auf.

Die Zeile beanFactory.isSingleton ("myCustomBeanName") überprüft dies.

5. Wann verwenden?

Der typische Anwendungsfall für BeanNameAware könnte darin bestehen, den Bean-Namen für Protokollierungs- oder Verdrahtungszwecke abzurufen . Für die BeanFactoryAware könnte es die Möglichkeit sein, eine Spring Bean aus Legacy-Code zu verwenden.

In den meisten Fällen sollten wir die Verwendung einer der Aware- Schnittstellen vermeiden , es sei denn, wir benötigen sie. Durch die Implementierung dieser Schnittstellen wird der Code an das Spring-Framework gekoppelt.

6. Fazit

In diesem Artikel haben wir die Schnittstellen BeanNameAware und BeanFactoryAware sowie deren praktische Anwendung kennengelernt .

Wie üblich ist der vollständige Code für diesen Artikel auf GitHub verfügbar.