Načtení csv souboru pomocí FlatFileItemReader ve Spring Batch

Tento příspěvek volně navazuje na článek Spring Batch 3. díl, ve kterém byla ukázána práce s chunk a definovanými objekty reader, processor, writer. V dnešním příspěvku se seznámíme s tím, jak načítat data z .csv souboru pomocí FlatFileItemReaderu. FlatFileItemReader je ItemReader, který čte řádky ze vstupu. Vstup je určen elementem <property name="resource" value="classpath:reportCS.csv"/>. V tomto případě se bude číst ze souboru reportCS.csv, který se nachází na classpath.

Prostý databázový soubor (též plochý databázový soubor, anglicky flat file database) je jednoduchá databáze (většinou tabulka) uložená v textovém souboru ve formě prostého textu. Takový soubor může mít příponu například .txt, .ini, .conf, ale i .dbf apod. Zdroj: cs.wikipedia.org

Zde je ukázka FlatFileItemReaderu.

<bean id="csvFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader">
	<property name="resource" value="classpath:reportCS.csv"/>
	<property name="encoding" value="UTF-8"/>
	<property name="linesToSkip" value="1"/>
	<property name="lineMapper">
		<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
			<property name="lineTokenizer">
				<bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
					<property name="names" value="Name,Surname,Location,Job,Earning"/>
				</bean>
			</property>
			<property name="fieldSetMapper">
				<bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
					<property name="prototypeBeanName" value="employee"></property>
				</bean>
			</property>
		</bean>
	</property>
</bean>

resource: zdroj dat pro čtení
encoding: kódování zdrojového souboru
linesToSkip: nastaví počet řádků souboru, které se mají přeskočit před začátkem čtení
lineMapper: nastaví line mapper, mapování načteného řádku

Číst dálNačtení csv souboru pomocí FlatFileItemReader ve Spring Batch

Spring Batch 3. díl

V minulém díle jsme si vytvořili job, který obsahoval několik kroků (Step). Každému kroku byl přiřazen jeden tasklet, který implementoval celou funkcionalitu. Dost často ale krok v jobu bude načítat data, zpracovávat je a nakonec zapisovat. Pro tento případ je tady chunk. V rámci chunku je možné definovat reader, processor a writer.

<chunk reader="myReader" writer="myWriter" processor="myProcessor">

V následujícím příkladu si ukážeme job, který se bude skládat z jediného kroku, během kterého zavoláme náš reader, poté data vrácená z readeru zpracujeme ve vlastním processoru a nakonec data zapíšem writerem.

context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/batch"
	xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-3.0.xsd">
	
	<beans:bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
		<beans:property name="transactionManager" ref="transactionManager" />
	</beans:bean>
	
	<beans:bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
		<beans:property name="jobRepository" ref="jobRepository" />
	</beans:bean>
	
	<beans:bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />
</beans:beans>

job.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/batch"
	xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
						http://www.springframework.org/schema/batch
						http://www.springframework.org/schema/batch/spring-batch-3.0.xsd">
	<beans:import resource="context.xml" />
	
	<beans:bean id="myReader" class="cz.vitfo.MyReader"/>
	<beans:bean id="myProcessor" class="cz.vitfo.MyProcessor"/>
	<beans:bean id="myWriter" class="cz.vitfo.MyWriter"/>
	
	<job id="myJob">
		<step id="myStep">
			<tasklet>
				<chunk reader="myReader" writer="myWriter" processor="myProcessor" commit-interval="4"/>
			</tasklet>
		</step>
	</job>
</beans:beans>

Třída MyInput představuje objekty, které budou načítány (vraceny) readerem.

Číst dálSpring Batch 3. díl

Rozsah singleton a prototype ve Springu

Spring vytváří beany (instance) a je zodpovědný za jejich životní cyklus. To ale platí pouze v případě, že bean je ve scope singleton. V zásadě můžeme rozdělit beany podle scope na dvě skupiny: singleton a prototype. Singleton znamená, že daná beana (instance) se v kontextu (v aplikaci) vyskytuje pouze v jedné jediné instanci. Pokaždé, když zavoláme metodu getBean(), dostaneme referenci na tu jedinou existující instanci. Pokud je ale scope beany prototype, při každém volání getBean() dostaneme novou instanci.
Nastavení scope se prování při definici dané beany.

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

   <bean class="cz.vitfo.spring.MyClass01" 
   		init-method="myInit" 
   		destroy-method="myDestroy"
   		scope="singleton">
   </bean>
   <bean class="cz.vitfo.spring.MyClass02" 
   		init-method="myInit" 
   		destroy-method="myDestroy"
   		scope="prototype">
   </bean>
</beans>

Každé beaně jsem nastavil init a destroy metodu (tomuto tématu jsem se věnoval v tomto příspěvku) a scope (rozsah).

Číst dálRozsah singleton a prototype ve Springu

Spring Batch 2. díl

V předchozím díle jsme se věnovali představení frameworku String Batch, vysvětlení základních pojmů a ukázali jsme si jednoduchý projekt. V tomto díle vytvoříme další projekt.

Job je posloupnost jednotlivých kroků (Step). Krok pak obsahuje úkol (Tasklet), který popisuje (implementuje) co se má dělat. Task v sobě ještě může obsahovat další kousek (Chunk), ale tomu se budemě věnovat někdy příště.

Vaříme čaj se Spring Batch.
V následujícím příkladu si ukážeme job, který se bude skládat s pěti kroků (Tasklet). Budeme připravovat čaj.

  1. naplníme konvici vodou
  2. zapneme konvici
  3. dáme do konvice čaj
  4. počkáme tři minuty
  5. hotový čaj naservírujeme

Struktura projektu

│   pom.xml
│
└───src
    ├───main
    │   └───java
    │       └───cz
    │           └───vitfo
    │               │   ExecuteJob.java
    │               │
    │               └───tasklets
    │                       FillKettleWithWater.java
    │                       PutTeaToWater.java
    │                       ServeTea.java
    │                       TurnOnKettle.java
    │                       WaitThreeMinutes.java
    │
    └───resources
            context.xml
            job.xml


Všimněte si, že ve složce resources máme dva xml. Spring umožňuje rozdělit konfiguraci do více souborů. Jednou z možností je potom pro vytvoření kontextu předat list konfiguračních souboru (ukázáno v tomto příspěvku) a nebo importovat jeden konfigurační soubor do druhého pomocí elementu <import> jak je ukázáno v tomto příkladu (řádek osm v souboru job.xml).

Číst dálSpring Batch 2. díl

Spring Batch 1. díl

Spring Batch je open source framework pro dávkové zpracování (batch processing). Dávkové zpracování znamená vykonání série programů bez účasti uživatele. Většinou se jedná o akce, které se vykonávají pravidelně v určitý čas jako například vygenerování statistik ke konci měsíce, zjištění změn za poslední týden (např. nové příspěvky za toto období), zpracování výkazů ke konci dne, týdne, měsíce, …

Základní pojmy ve Spring Batch

  • JobLauncher: Vstupní místo, kde se spouští job.
  • Job: Definuje co se má provést (definuje dávku). Každý job může obsahovat několik kroků (Step).
  • Step: Část jobu, jeden z kroků při provádění (jeden z kroků dávky). Step obsahuje atribut next, který udává, jaký další step se má vykonat po tom aktuálním. Step obsahuje Tasklet.
  • Tasklet: Je částí kroku a definuje, co se má provést (reference na třídu implementující rozhraní org.springframework.batch.core.step.tasklet.Tasklet) a nebo může ještě obsahovat Chunk.
  • Chunk: Nejmenší část, ve které se určuje co se má načíst (Reader), jak to zpracovat (Processor) a co má být výstupem (Writer).

Jak vypadá typický job

  • načtení dat (z databáze, ze souboru, …)
  • zpracování dat (výpočty, validace, filtrování, …)
  • zápis dat (do databáze, do různých typů souborů – pdf, doc, txt, …)

Jednoduchý projekt

V následujícím jednoduchém projektu vytvoříme a spustíme job, který bude obsahovat jediný Step (a ten jediný Tasklet), který pouze vypíše text.

Zde je struktura projektu. Jedná se Maven projekt.

│   pom.xml
│
└───src
    ├───main
    │   └───java
    │       └───cz
    │           └───vitfo
    │                   ExecuteJob.java
    │                   MyTasklet.java
    │
    └───resources
            context.xml

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>cz.vito</groupId>
	<artifactId>springbatch</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>springbatch</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<spring.framework.version>3.2.1.RELEASE</spring.framework.version>
		<spring.batch.version>3.0.2.RELEASE</spring.batch.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.batch</groupId>
			<artifactId>spring-batch-core</artifactId>
			<version>${spring.batch.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.batch</groupId>
			<artifactId>spring-batch-infrastructure</artifactId>
			<version>${spring.batch.version}</version>
		</dependency>
	</dependencies>
</project>

Do pom.xml stačí přidat pouze dvě závislosti a to na org.springframework.batch a spring-batch-infrastructure.

context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/batch"
	xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
						http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
						http://www.springframework.org/schema/batch 
						http://www.springframework.org/schema/batch/spring-batch-3.0.xsd">
		
	<!-- Beans definition -->	
	<beans:bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
		<beans:property name="transactionManager" ref="transactionManager" />
	</beans:bean>
	
	<beans:bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
		<beans:property name="jobRepository" ref="jobRepository" />
	</beans:bean>
	
	<beans:bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />
	
	<beans:bean id="myTasklet" class=" cz.vitfo.MyTasklet" />
	
	
	<!-- Job definition -->
	<job id="myJob">
		<step id="myStep">
			<tasklet ref="myTasklet"></tasklet>
		</step>
	</job>
</beans:beans>

Job launcher potřebuje mít definovánu job repository, do které si ukládá údaje o jobech. Job repository potřebuje mít definován transaction manager. Job má definován Step a ten Tasklet. Tasklet odkazuje na třídu implementující rozhraní Tasklet.

MyTasklet.java

package cz.vitfo;

import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;

public class MyTasklet implements Tasklet {

	public RepeatStatus execute(StepContribution arg0, ChunkContext arg1) throws Exception {
		System.out.println("Code in " + this.getClass().getSimpleName() + " is executed.");
		return null;
	}
}

Třída, která implementuje rozhraní Tasklet. Jediným jejím úkolem je vypsat text.

ExecuteJob.java

package cz.vitfo;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ExecuteJob {

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("context.xml");
		
		JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
		Job job = (Job) context.getBean("myJob");
		
		try {
			JobExecution execution = jobLauncher.run(job, new JobParameters());
			System.out.println("Exit Status: " + execution.getStatus());
			System.out.println("Start: " + execution.getStartTime());
			System.out.println("End: " + execution.getEndTime());
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (context != null) {
				context = null;
			}
		}
		System.out.println("Done");
	}
}

Nejdříve načteme kontext. Poté z něj získáme JobLauncher a Job. Tento Job spustíme pomocí JobLauncher a vypíšeme status jobu po spuštění.

Výsledek

Code in MyTasklet is executed.
Exit Status: COMPLETED
Start: Tue Nov 01 17:26:15 CET 2016
End: Tue Nov 01 17:26:15 CET 2016
Done

Spring a konfigurace ve více souborech

Spring umožňuje mít více konfiguračních xml souborů a je také jedno, jak se budou tyto soubory nazývat. Pokud máme jediný konfigurační soubor s názvem např. beans.xml, načtení provedem následovně:

public static void main(String[] args) {
   	ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    ...
}

Pokud máme několik konfiguračních souborů, např. s názvy context01.xml, context02.xml a context03.xml, vytvoříme pole řetězců, které bude obsahovat názvy těchto souborů a to předáme jako parametr:

public static void main(String[] args) {
    String[] springConfig = {"context01.xml", "context02.xml", "context03.xml"};
		ApplicationContext context = new ClassPathXmlApplicationContext(springConfig);
    ...
}

Spring: metody init a destroy

Spring za nás vytváří instance tříd a dává nám je k dispozici na požádání. Tím požádáním může být například volání metody getBean(). To, jak se má instance vytvořit, si Spring přečte v konfiguračním souboru. Spring tedy potřebuje konfigurační soubor (beans.xml) k tomu, aby věděl, jaké a jak má instance (beany) vytvářet. Spring nejen instance (beany) vytváří ale řídí celý jejich životní cyklus od vytvoření až po zničení. Spring umožňuje nadefinovat metody, které se mají zavolat při inicializaci instance nebo při jejím ukončení. Jak bylo uvedeno výše, Spring vytváří instance na základě konfigurace. To zda a jaké metody se v určitých fázích životního cyklu instance mají zavolat, je tedy třeba uvést v konfiguraci dané beany.

Struktura projektu

│   pom.xml
│
└───src
    ├───main
    │   └───java
    │       └───cz
    │           └───vitfo
    │               └───spring
    │                       Main.java
    │                       MyClass.java
    │
    └───resources
            beans.xml

MyClass.java

public class MyClass {
	
	private String message;

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
	
	public void myInit() {
		System.out.println("Zavolána metoda init().");
	}
	
	public void myDestroy() {
		System.out.println("Zavolána metoda destroy().");
	}
}

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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean 	class="cz.vitfo.spring.MyClass" 
   			init-method="myInit" 
   			destroy-method="myDestroy">
   			<property name="message" value="Hello"></property>
   </bean>

</beans>

Main.java

import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
    	ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    	
    	MyClass mc = context.getBean(MyClass.class);
    	
    	System.out.println(mc.getMessage());
    	
    	// Context funguje jako úložiště všech Springem vytvořených bean (instancí).
    	((ConfigurableApplicationContext) context).close();
    }
}

Výsledek

Zavolána metoda init().
Hello
Zavolána metoda destroy().

Popis
V konfigurační souboru jsme pro beanu MyClass definovali metody, které se mají zavolat při inicializaci (init-method=“myInit“) a před zničením (destroy-method=“myDestroy“). Tyto metody jsou ve třídě MyClass a pouze při svém zavolání vypíší text, jak je vidět v konzoli.

Spring jednoduše 4. díl

Spring dokáže také vytvořit instanci anotované třídy a přiřadit ji do proměnné datového typu rozhraní. Více v následujícím príkladu. Máme rozhraní MyService a dvě třídy, které toto rozhraní implementují: MyOracleServiceImpl a MyMicrosoftServiceImpl. Podle toho, která třídu bude mít anotaci, ta se použije.

│   pom.xml
│
├───src
│   ├───main
│   │   └───java
│   │       └───cz
│   │           └───vitfo
│   │               └───spring02
│   │                   │   Main.java
│   │                   │   MyService.java
│   │                   │
│   │                   └───impl
│   │                           MyMicrosoftServiceImpl.java
│   │                           MyOracleServiceImpl.java
│   │
│   ├───resources
            beans.xml

Soubory pom.xml a beans.xml zůstávají stejné jako v předchozím příkladu.

MyService.java

public interface MyService {

	public String getServiceName();
}

MyOracleServiceImpl.java

import org.springframework.stereotype.Service;

import cz.vitfo.spring02.MyService;

@Service
public class MyOracleServiceImpl implements MyService {

	public String getServiceName() {
		return "ORACLE";
	}
}

MyMicrosoftServiceImpl.java

import cz.vitfo.spring02.MyService;

public class MyMicrosoftServiceImpl implements MyService {

	public String getServiceName() {
		return "MICROSOFT";
	}
}

Main.java

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main 
{
    public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
		
		MyService ms = context.getBean(MyService.class);
		
		System.out.println(ms.getServiceName());
	}
}

Pokud aplikaci spustíme, vypíše se řetězec ORACLE. Sice existují dvě implementace, ale pouze MyOracleServiceImpl má anotaci @Service. Proto se použije a přiřadí do proměnné MyService ms. V případě, že bychom anotovali třídu MyMicrosoftServiceImpl, vypsal by se řetězec MICROSOFT. Pozor, není možné mít anotace na obou třídách. V tom případě by došlo k výjimce.

Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
  No qualifying bean of type [cz.vitfo.spring02.MyService] is defined: expected single matching bean but found 2: myOracleServiceImpl,myMicrosoftServiceImpl

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:

Spring jednoduše 2. díl

V předchozím dílu jsme pro získání instance použili metodu context.getBean(„myClass“).

MyClass mc1 = (MyClass) context.getBean("myClass");

Získá instanci na základě id, které je definováno v souboru beans.xml. Metoda getBean(String name) vrací Object, takže je nutné přetypování. Existují ale i další možnosti.

MyClass mc2 = context.getBean(MyClass.class, "myClass");

Tato metoda je stejná jako předchozí, jen vrací instanci třídy zadané jako parametr a tím pádem není nutné provádět přetypování jako v předchozím případě.

MyClass mc3 = context.getBean(MyClass.class);

Získá instanci dané třídy. V tomto případě stačí mít v beans.xml pouze následující definici (bez id).

   <bean class="cz.vitfo.spring01.MyClass">
       <property name="message" value="Hello World!"/>
   </bean>

Vysvětlení pojmů

Kontejner je komponenta, která v sobě obsahuje jinou komponentu a poskytuje jí nějakou službu.

Spring kontejner je kontejner, který zodpovídá za všechny beany (instance), které vytváří, a které poskytuje aplikaci. Je také zodpovědný, že beany (instance) budou k dispozici ve správný čas na správném místě. Aby toto mohl provádět, potřebuje konfiguraci. V našem případě to konfigurace v souboru beans.xml, ale Spring umožňuje i jiné formy konfigurace.

Bean je třída, která obsahuje proměnné, gettery a settery. Je to forma POJO (Plain Old Java Object).