Framework Spring/Configuration par annotations
Apparence
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