Framework Spring/Configuration par annotations

Spring offre la possibilité lier les beans via des annotations dans le code et non via le fichier de configuration xml. On peut prendre l'exemple d'une classe MessageDisplayer faisant appel à une autre classe MessageDisplayer2. Cette relation n'a alors pas besoin d'être spécifiquement indiquée dans le fichier de Beans :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	<context:annotation-config />
	<bean class="mainPackage.MessageDisplayer">
	</bean>
</beans>

Classe principale :

package mainPackage;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.support.ClassPathXmlApplicationContext;

@ComponentScan(basePackages = "mainPackage")
public class MainClass
{
	public static void main(String[] args)
	{
		ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("Beans.xml");
		MessageDisplayer messageDisplayer =  classPathXmlApplicationContext.getBean(MessageDisplayer.class);
		messageDisplayer.setMessage("test");
		messageDisplayer.displayMessage();
		classPathXmlApplicationContext.close();
	}
}

Première classe d'affichage :

package mainPackage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;

@Component
@ComponentScan("mainPackage")
public class MessageDisplayer
{
	@Autowired
	MessageDisplayer2 messageDisplayer2;
	
	private String message;

	public String getMessage()
	{
		return message;
	}

	public void setMessage(String message)
	{
		this.message = message;
	}

	public void displayMessage()
	{
		System.out.println("message from MessageDisplayer : " + message);
		messageDisplayer2.setMessage("test2");
		messageDisplayer2.displayMessage();
	}
}


Seconde classe d'affichage, appelée par la première :

package mainPackage;

import org.springframework.stereotype.Component;

@Component
public class MessageDisplayer2
{
	private String message;

	public String getMessage()
	{
		return message;
	}

	public void setMessage(String message)
	{
		this.message = message;
	}

	public void displayMessage()
	{
		System.out.println("message from MessageDisplayer2 : " + message);
	}
}

Affichage du résultat :

mai 09, 2018 5:57:39 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFOS: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2328c243: startup date [Wed May 09 17:57:39 CEST 2018]; root of context hierarchy
mai 09, 2018 5:57:39 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFOS: Loading XML bean definitions from class path resource [Beans.xml]
message from MessageDisplayer : test
message from MessageDisplayer2 : test2
mai 09, 2018 5:57:40 PM org.springframework.context.support.AbstractApplicationContext doClose
INFOS: Closing org.springframework.context.support.ClassPathXmlApplicationContext@2328c243: startup date [Wed May 09 17:57:39 CEST 2018]; root of context hierarchy