Konfigurovat třídy tak, aby je Spring mohl použít pro dependency injection je možné též pomocí anotací.
@Component
Obecná anotace, ze které ostatní anotace dědí.
@Service
Speciální typ @Component. Tato anotace je určena pro třídu, která představuje službu (service)
@Repository
Speciální typ @Component. Tato anotace je určena pro třídu, která zprostředkovává přístup k datům.
@Controller
Speciální typ @Component. Tato anotace je používána v Spring-MVC
Pokud si nejste jistí, vždy můžete použít anotaci @Component.
V následujícím příkladu ukáži použití anotací. Zde je struktura projektu.
C:.
│ pom.xml
│
├───src
│ ├───main
│ │ └───java
│ │ └───cz
│ │ └───vitfo
│ │ └───spring02
│ │ │ Class01.java
│ │ │ Class03.java
│ │ │ Main.java
│ │ │
│ │ └───class02
│ │ Class02.java
│ │
│ ├───resources
beans.xml
Soubor pom.xml zůstává stejný. Dále máme tři třídy s názvy Class01, Class02 a Class03, z toho Class02 je v podbalíčku s názvem class02.
beans.xml
<?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-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="cz.vitfo.spring02" />
</beans>
Class01.java
import org.springframework.stereotype.Component;
@Component
public class Class01 {
public void sayHello() {
System.out.println("Hello from " + this.getClass().getSimpleName() + " class");
}
}
Class02.java
import org.springframework.stereotype.Component;
@Component
public class Class02 {
public void doSomething() {
System.out.println("Metoda v " + this.getClass().getSimpleName());
}
}
Class03.java
import org.springframework.stereotype.Component;
@Component
public class Class03 {
public String getText() {
return "Text z metody v " + this.getClass().getSimpleName();
}
}
Main.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cz.vitfo.spring02.class02.Class02;
public class Main
{
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Class01 cl01 = context.getBean(Class01.class);
Class02 cl02 = context.getBean(Class02.class);
Class03 cl03 = context.getBean(Class03.class);
cl01.sayHello();
cl02.doSomething();
System.out.println(cl03.getText());
}
}
Výsledek
Hello from Class01 class
Metoda v Class02
Text z metody v Class03
Spring projde package určený v konfiguračním souboru (beans.xml) a zaregistruje si všechny oanotované třídy (@Component). Jinak řečeno, component-scan říká Springu, aby prohledal všechny třídy v daném package (i v podbalíčcích jak je vidět u Class02) a zjistil, zda některá z nich neobsahuje anotaci @Component, @Service, @Repository či @Controller. Pokud takovou třídu najde, zaregistruje si ji (a pak může vytvářet na požádání její instance). Není tedy třeba pro každou třídu uvádět konfiguraci do souboru beans.xml.
Pokud byste anotaci neuvedli a třídu se snažili ze Spring kontextu získat, dostanete org.springframework.beans.factory.NoSuchBeanDefinitionException
.
Zdroje: