Passiamo ora a descrivere la configurazione dello IoC Container. Analizzando il file possiamo notare alcune differenza nella parte di proxing dei bean che definiscono gli oggetti target.
Nelle precedenti lezioni su Spring AOP abbiamo visto che per poter applicare degli advice su di un oggetto (il target object) questo andava wrappato attraverso un proxy; è infatti in questo modo che Spring AOP può intercettare i metodi invocati sul target object.
Per semplificare questo aspetto Spring 2.x permette di effettuare l'auto-proxing degli oggetti target utilizzando il tag aop:Aspectj-autoproxy
, semplificando notevolmente la configurazione delli IoC Contanier.
Un altro cambiamento introdotto dall'utilizzo di @AspectJ è l'aggiunta di un apposito schema aop
al file XML, come è possibile notare nell'esempio.
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<!-- Abilita funzionalità di auto-proxy -->
<aop:Aspectj-autoproxy proxy-target-class="true"/>
<!-- Definizione LogAspect -->
<bean class="it.html.spring.aop.Aspectj.LogAspect" />
<!-- Definizionei de bean visti in precedenza -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver" />
<property name="url" value="jdbc:derby://localhost:1527/library;create=true" />
<property name="username" value="app" />
<property name="password" value="app" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="bookDao" class="it.html.spring.book.BookSimpleJdbcDaoSupportNamedValue">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
</beans>
Lanciamo il test
Non resta infine che scrivere una classe per testare quanto prodotto.
public class BookClient {
public static void main(String[] args) {
BeanFactory ctx = new XmlBeanFactory(new ClassPathResource("beans.xml"));
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
// Delete
bookDao.delete("1234567890123");
bookDao.delete("1234567890321");
// Insert Promessi Sposi
Book book = new Book();
book.setIsbn("1234567890123");
book.setAuthor("Manzoni");
book.setTitle("I Promessi Sposi");
bookDao.insert(book);
// Insert Il Barone Rampante
book = new Book();
book.setIsbn("1234567890321");
book.setAuthor("Italo Calvino");
book.setTitle("Il Barone Rampante");
bookDao.insert(book);
// Find Promessi Sposi
book = bookDao.findByISBN("1234567890123");
// Update Promessi Sposi
book.setAuthor("Alessandro Manzoni");
bookDao.update(book);
// Book Count
bookDao.bookCount();
// Find all books
bookDao.findAllBooks();
}
}
Per effettuare delle prove è possibile scaricare l'esempio completo.