BeanNameAware en BeanFactoryAware-interfaces in het voorjaar

1. Overzicht

In deze korte tutorial, we gaan ons concentreren op de BeanNameAware en BeanFactoryAware interfaces, in het Spring Framework.

We beschrijven elke interface afzonderlijk met de voor- en nadelen van hun gebruik.

2. Bewust Koppel

Beide BeanNameAware en BeanFactoryAware behoren tot de org.springframework.beans.factory.Aware root marker-interface. Dit gebruikt setter-injectie om een ​​object op te halen tijdens het opstarten van de toepassingscontext.

De Bewust interface is een mix van ontwerppatronen voor terugbellen, luisteraars en waarnemers. Het geeft aan dat de boon in aanmerking komt voor een melding door de Spring-container via de callback-methoden.

3. BeanNameAware

BeanNameAware maakt het object op de hoogte van de boonnaam die in de container is gedefinieerd.

Laten we een voorbeeld bekijken:

openbare klasse MyBeanName implementeert BeanNameAware {@Override public void setBeanName (String beanName) {System.out.println (beanName); }}

De beanName eigenschap vertegenwoordigt de bean-id die is geregistreerd in de Spring-container. Bij onze implementatie geven we eenvoudig de boonnaam weer.

Laten we vervolgens een bean van dit type registreren in een Spring-configuratieklasse:

@Configuratie openbare klasse Config {@Bean (name = "myCustomBeanName") openbare MyBeanName getMyBeanName () {retourneer nieuwe MyBeanName (); }}

Hier hebben we expliciet een naam toegewezen aan onze MyBeanName klasse met de @Bean (naam = "MyCustomBeanName") lijn.

Nu kunnen we de toepassingscontext starten en de boon eruit halen:

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

Zoals we verwachten, is de setBeanName methode wordt afgedrukt "MyCustomBeanName".

Als we het naam = "..." code van de @Boon annotatie die de container, in dit geval, toewijst getMyBeanName () methode naam in de boon. Dus de output zal zijn "GetMyBeanName".

4. BeanFactoryAware

BeanFactoryAware wordt gebruikt om de BeanFactory voorwerp. Op deze manier krijgen we toegang tot het BeanFactory die het object heeft gemaakt.

Hier is een voorbeeld van een MyBeanFactory klasse:

openbare klasse MyBeanFactory implementeert BeanFactoryAware {privé BeanFactory beanFactory; @Override public void setBeanFactory (BeanFactory beanFactory) gooit BeansException {this.beanFactory = beanFactory; } openbare ongeldige getMyBeanName () {MyBeanName myBeanName = beanFactory.getBean (MyBeanName.class); System.out.println (beanFactory.isSingleton ("myCustomBeanName")); }}

Met behulp van de setBeanFactory () methode, wijzen we de BeanFactory verwijzing van de IoC-container naar de beanFactory eigendom.

Daarna kunnen we het direct gebruiken zoals in het getMyBeanName () functie.

Laten we het MyBeanFactory en bel de getMyBeanName () methode:

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

Zoals we al hebben geïnstantieerd, is het MyBeanName class in het vorige voorbeeld, zal Spring hier de bestaande instantie aanroepen.

De beanFactory.isSingleton ("myCustomBeanName") line verifieert dat.

5. Wanneer te gebruiken?

De typische use case voor BeanNameAware kan de bean-naam ophalen voor logging- of bedradingsdoeleinden. Voor de BeanFactoryAware het kan de mogelijkheid zijn om een ​​spring bean uit legacy-code te gebruiken.

In de meeste gevallen moeten we het gebruik van een van de Bewust interfaces, tenzij we ze nodig hebben. Door deze interfaces te implementeren, wordt de code aan het Spring-framework gekoppeld.

6. Conclusie

In dit artikel hebben we geleerd over de BeanNameAware en BeanFactoryAware interfaces en hoe u deze in de praktijk kunt gebruiken.

Zoals gewoonlijk is de volledige code voor dit artikel beschikbaar op GitHub.