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.