Tu znajdują się dowiązania do prezentacji: PDF   ODP
Niniejsza strona opisuje scenariusze do ćwiczeń podczas prezentacji ze Spring Framework
Żeby rozpocząć ćwiczenia pobierz plik z workbenchem do eclipse'a z /home/tmp/td209515/spring-workspace.tar.gz, rozpakuj i uruchom Eclipse'a z rozpakowanym katalogiem jako workspace.

Ćwiczenie - Beany
Projekt: Beany1
Napisz implementacje interfejsów np.:
public class IntegerWriterImpl implements IntegerWriterIntf { private int val; public void setVal(int v) { this.val = v; } public int square() { return val * val; } public void writeInt() { System.out.println(val); } public void writeSquare() { System.out.println(square()); } }
public class SumOfSquaresWriterImpl implements SumOfSquaresWriter { public IntegerWriterIntf a, b; public void setA(IntegerWriterIntf a) { this.a = a; } public void setB(IntegerWriterIntf b) { this.b = b; } public void sumOfSquares() { System.out.println(a.square() + b.square()); } }
Stwórz konfigurację beanów w pliku beans.xml, na przykład tak: beans.xml
Stwórz jakiś kod używający Beanów w klasie Main:
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String args[]) { ApplicationContext context = new ClassPathXmlApplicationContext( new String[] {"beans.xml"}); IntegerWriterIntf int1 = (IntegerWriterIntf) context.getBean("intwriter1"); int1.writeInt(); int1.writeSquare(); SumOfSquaresWriter sint1 = (SumOfSquaresWriter) context.getBean("sumwriter1"); sint1.sumOfSquares(); } }

Ćwiczenie - AOP
Projekt: BeanyAOP
Stwórz aspekt z advice'm drukującym coś na ekranie przy wywołaniu metod beanów z poprzedniego zadania. Można to zrobić tak:
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; @Aspect public class SomeAspect { @Pointcut("execution(* *.write*(..))") public void writingMethods() {} @Before("writingMethods()") public void doLog() { System.out.println("Pisanie"); } }
Zmodyfikuj plik beans.xml dodając aspekt jako bean i włącz konfigurację dla AOP.Potrzebne też będzie dodanie odpowiedniej przestrzeni nazw dla <aop:xxx> Przykład gotowego pliku beans.xml jest tutaj.
Uruchom program. Zobacz, że konsola wyświetla metodę zdefiniowaną w aspekcie

Ćwiczenie - DAO/Hibernate
Projekt: Hibernate1
Mamy klasę Osoba, i interfejs OsobaDao. Trzeba więc zaimplementować OsobaDao by uzyskać dostęp do danych.
Ustalmy parametry połączenia ze źródłem danych w beans.xml. Dodamy też istniejące mapowanie dla Hibernate'a dla klasy Osoba do konfiguracji. Powstanie bean "mySessionFactory", który użyjemy do łączenia się z bazą danych. beans.xml
Mając sessionFactory dodajemy metodę setSessionFactory do beana implementującego DAO, który będzie tworzył obiekt o interfejsie HibernateTemplate dokładnie tak:
private HibernateTemplate ht; public void setSessionFactory(SessionFactory sf) { ht = new HibernateTemplate(sf); }
Implementujemy metody interfejsu OsobaDao korzystając z HibernateTemplate. Jest to bardzo łatwe:
public Osoba findOsobaByName(String imie) { List l = ht.findByNamedParam("from Osoba o where o.imie = :imie", "imie", imie); if (l.size() == 0) return null; else return (Osoba) l.get(0); } public void saveOsoba(Osoba o) { ht.save(o); }
Cała klasa implementująca OsobaDao wygląda więc tak:
import java.util.List; import org.hibernate.SessionFactory; import org.springframework.orm.hibernate3.HibernateTemplate; public class OsobaDaoImpl implements OsobaDao { private HibernateTemplate ht; public void setSessionFactory(SessionFactory sf) { ht = new HibernateTemplate(sf); } public Osoba findOsobaByName(String imie) { List l = ht.findByNamedParam("from Osoba o where o.imie = :imie", "imie", imie); if (l.size() == 0) return null; else return (Osoba) l.get(0); } public void saveOsoba(Osoba o) { ht.save(o); } }
Teraz modyfikujemy Maina żeby coś się działo:) :
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String args[]) { ApplicationContext context = new ClassPathXmlApplicationContext( new String[] {"beans.xml"}); OsobaDao dao = (OsobaDao) context.getBean("osobaDao"); Osoba o = (Osoba) context.getBean("osoba"); Osoba o2 = dao.findOsobaByName(o.getImie()); if (o2 != null) System.out.println(o2.getNazwisko()); dao.saveOsoba(o); } }

Ćwiczenie - testy integracyjne
Projekt: HibernateTests
Naszym zadaniem jest teraz napisanie testów do klasy DAO stworzonej w poprzednim ćwiczeniu. Jest to łatwe, bo nawet nie będziemy musieli zmieniać beans.xml wykorzystując siłę auto-wiringu oferowanego przez Springa
Tworzymy klasę HibernateTest. Dodajemy pole OsobaDao i tworzymy setter. Ponieważ w beans.xml jest zdefiniowana tylko jeden bean typu OsobaDao to automatycznie zostanie on wstrzyknięty podczas testowania
import org.springframework.test.AbstractDependencyInjectionSpringContextTests; public class HibernateTest extends AbstractDependencyInjectionSpringContextTests { private OsobaDao osobaDao; public void setOsobaDao(OsobaDao osoba) { osobaDao = osoba; }
Teraz piszemy jakąś metodę testującą. Np:
public void testLoadImie() { Osoba o = osobaDao.findOsobaByName("Tomek"); assertNotNull(o); }
Obowiązkowo do testu trzeba dodać położenie pliku z konfiguracją do beanów. My użyjemy naszego beans.xml, jednak można dla testów stworzyć zupełnie inną konfigurację!
protected String[] getConfigLocations() { return new String[] { "classpath:/beans.xml" }; } }
Mając już całość możemy uruchomić test w Eclipsie.