Spring jednoduše 3. díl

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

spring03

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:

Napsat komentář