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);
    ...
}

Nejpoužívanější klávesové zkratky v Idea IDE

Vývojové prostředí Idea IDE používám již rok, a tak jsem se rozhodl sepsat mnou nejpoužívanější zkratky. Tento příspěvek by mohl pomoci všem, kteří s tímto vývojovým prostředím začínají. Zkratek existuje samozřejmě mnohem více, ale tyto používám nejčastěji.

Zkratky pro práci v souboru

Ctrl + / Za(Od)komentování řádku(ů)
Ctrl + Y Odstranit řádek
Ctrl + Z Vrátit změny
Ctrl + Shift+ Z Znovu provést změny
Ctrl + Alt + V Přiřazení výrazu do proměnné
Shift + Alt Více násobný kurzor
Ctrl + F Vyhledat v souboru
Ctrl + R Vyhledat a nahradit v souboru
Shift + F6 Přejmenuj (proměnnou, soubor)
Ctrl + mezerník Kontextová nápověda při psaní (když se neukáže automaticky)

Zkratky pro práci na projektu

Ctrl + Alt + <- Posun na pozici kurzoru dozadu (na předchozí pozici)
Ctrl + Alt + -> Posun na pozici kurzoru dopředu
Ctrl + N Najdi třídu podle jména
Ctrl + Shift + N Najdi soubor podle jména
Ctrl + Shift + F Najdi text v adresáři/modulu/projektu
Ctrl + Shift + R Nahraď text v adresáři/modulu/projektu
Alt + F7 Najdi kde se používá označený datový typ/proměnná

 

Omezení počtu znaků při vyhledávání pomocí grep

V jednom z předchozích příspěvků jsem se věnoval základnímu vyhledávání pomocí příkazu grep. Tento příkaz hledá zadaný vzor a pokud jej najde, výsledek vypíše na standardní výstup. Problém může nastat v případě, že nalezený řádek je velmi dlouhý (např. xml soubor na jediném řádku v logu). To se dá vyřešit kombinací příkazu grep s příkazem cut.

grep pattern nazev_souboru | cut -c -80
grep pattern nazev_souboru | cut -c 1-80

Tyto dvě posloupnosti příkazů dávají stejný výsledek. Vrátí první až osmdesátý znak z každé řádky nalezené grepem.

grep pattern nazev_souboru | cut -c 40-100

Vrátí čtyřicátý až stý znak z každého řádku nalezeného grepem.


Zdroj: stackoverflow.com/…characters-one-line

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.

Proč nepoužívat double pro přesné výpočty

Čísla s desetinnou čárkou jsou v počítači reprezentována podle standardu IEEE 754. Tato reprezentace ale není přesná což může vést k následujícím situacím.

double x = 0.5;
double y = 0.4;
double z = x - y;

System.out.println("Hodnota z: \t" + z);

Výsledek

Hodnota z: 0.09999999999999998

Další příklad

double mixer = 1099.00;
double mixerPoSleve = mixer * 0.9;
double trouba = 5999.00;
double troubaPoSleve = trouba * 0.9;
double celkovaCena = troubaPoSleve + mixerPoSleve;

System.out.println("mixér po slevě: \t" + mixerPoSleve);
System.out.println("trouba po slevě: \t" + troubaPoSleve);
System.out.println("celková cena: \t\t" + celkovaCena);

Výsledek

mixér po slevě: 989.1
trouba po slevě: 5399.1
celková cena: 6388.200000000001

Řešením je použít datový typ BigDecimal. Zde je s použitím BigDecimal upraven první příklad.

BigDecimal x = new BigDecimal("0.5");
BigDecimal y = new BigDecimal("0.4");
BigDecimal z = x.subtract(y);

System.out.println("Hodnota z: \t" + z);

Výsledek

Hodnota z: 0.1