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: