Spring jednoduše 1. díl

Spring je obrovský ekosystém pokrývající rozsáhlou oblast programování. Základní funkcionalitou frameworku je Inversion of Control, což jednoduše řečeno znamená, že objekty, které potřebují další objekty, si tyto objekty nevytváří pomocí klíčového slova new sami, ale přenechávají tuto činnost Springu (Spring kontejneru). Ten je pak zodpovědný za vytváření objektů (za celý životní cyklus objektu od vzniku po zánik). Důvod pro tuto činnost je ten, že díky Springu nejsou komponenty těsně se sebou svázány (a je např. jednodušší vyměnit jednu implementaci za druhou).

Zde je struktura jednoduchého Maven projektu, používajícího Spring.

spring01
│   .classpath
│   .project
│   pom.xml
│
├───.settings
│       org.eclipse.core.resources.prefs
│       org.eclipse.jdt.core.prefs
│       org.eclipse.m2e.core.prefs
│
└───src
    ├───main
    │   └───java
    │       └───cz
    │           └───vitfo
    │               └───spring01
    │                       Main.java
    │                       MyClass.java
    │
    ├───resources
    │       beans.xml
    │
    └───test

Pokud odmažu soubory a složky, které nejsou důležité, vypadá projekt následovně.

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

Skládá se z souboru pom.xml, který slouží Mavenu a jsou v něm definovány závislosti na knihovách na Springu.

&<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>spring01</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

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

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.2.3.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.2.3.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>4.2.3.RELEASE</version>
		</dependency>
	</dependencies>
</project>e

Druhým nezbytným souborem je beans.xml (na názvu nezáleží, ale je zvykem ho pojmenovávat beans.xml). Tento soubor slouží jako konfigurace Springu (Spring kontejneru) a je v něm definováno, jak a jaké objekty má Spring vytvářet. V tomto příkladu je definována jediná beana s názvem (id) ‚myClass‘, která bude instancí třídy cz.vitfo.spring01.MyClass.

<?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 id="myClass" class="cz.vitfo.spring01.MyClass">
       <property name="message" value="Hello World!"/>
   </bean>

</beans>

Nakonec zde ještě máme třídu MyClass

package cz.vitfo.spring01;

public class MyClass {

	private String message;

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
}

a třídu s metodou main, která slouží jako vstupní bod programu.

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

package cz.vitfo.spring01;

public class Main 
{
    public static void main(String[] args) {
    	// beans.xml musí být na class path
		ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
		
		MyClass mc = (MyClass) context.getBean("myClass");
		
		System.out.println(mc.getMessage());
	}
}

Pokud program spustíte (run ve třídě s metodou main), dostanete následující výpis do konzole.

Čvc 01, 2016 3:48:51 ODP. org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1f17ae12: startup date [Fri Jul 01 15:48:51 CEST 2016]; root of context hierarchy
Čvc 01, 2016 3:48:51 ODP. org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [beans.xml]
Hello World!
Picked up JAVA_TOOL_OPTIONS: -Djava.vendor="Sun Microsystems Inc."

Pro nás nejdůležitější je řádek obsahující ‚Hello World!‘. Došlo ke spuštění programu a výpisu proměnné message Springem vytvořeného objektu mc.

Pokud jste dostali následující chybový výpis

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [beans.xml]; nested exception is java.io.FileNotFoundException: class path resource [beans.xml] cannot be opened because it does not exist

ujistěte se, že soubor beans.xml skutečně existuje, a že je umístěn na classpath (např. v package src/resources).

V případě této chyby

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'myClass' is defined

se ujistěte, že v beans.xml máte nadefinovánu beanu s id myClass a nedopustili jste se nějakého překlepu.

Napsat komentář