Sei sulla pagina 1di 12

SOMMARIO

SPRING FRAMEWORK (2.5 3.0)


INGEGNERIA DEL SOFTWARE

Introduzione

Concetti base

Architettura

MVC framework

Persistenza: JDBC e ORM

Universit degli Studi di Padova


Facolt di Scienze MM. FF. NN.

Corso di Laurea in Informatica, A.A. 2011 2012

rcardin@math.unipd.it

SOMMARIO

Ingegneria del software mod. B

Riccardo Cardin

INTRODUZIONE

Introduzione

Concetti base

Java beans

EJB 1.0

EJB 3.0

Architettura

MVC framework

Riusabilit e
composizionalit
Troppo semplici
Transazionalit?
Sicurezza?

Aggiunge ai
beans componenti
server-side
Servizi accedibili
da remoto
Tecnologia molto
complessa

Implementazione
semplificata
Deployment
semplificato
(annotazioni)

Persistenza: JDBC e ORM

Un po di storia

1996

Ingegneria del software mod. B

Riccardo Cardin

1998

2006

Ingegneria del software mod. B

Riccardo Cardin

INTRODUZIONE

INTRODUZIONE

Spring

Spring is a lightweight inversion of control and aspect oriented


container framework

Non limitato alla componente server

Utilizza componenti semplici (bean)

Lightweight

Framework opensource creato per ridurre la


complessit dello sviluppo di applicazioni enterprise

Spring

Framework/Container

Permette di ridurre laccoppiamento

Ingegneria del software mod. B

Riccardo Cardin

SOMMARIO

Introduzione

Concetti base

Architettura

MVC framework

Persistenza: JDBC e ORM

Il container si fa carico di iniettare le dipendenze degli oggetti


a runtime

Ingegneria del software mod. B

Riccardo Cardin

SPRING: CONCETTI

Plan Old Java Object (POJO)


"We wondered why people were so against using regular objects in their
systems and concluded that it was because simple objects lacked a fancy
name. So we gave them one, and it's caught on very nicely."

Inversion of Control

Riccardo Cardin

Il ciclo di vita degli oggetti gestito da una entit


esterna (container)

Dependency Injection

Ingegneria del software mod. B

Gestisce il ciclo di vita e la configurazione degli oggetti


dellapplicazione. La configurazione utilizza XML o annotazioni.

IoC e DI

Non intrusivo, gli oggetti sviluppati non dipendono da classi


del framework

Le dipendenze di un oggetto vengono iniettate


nellistanza automaticamente e a runtime

Utilizzo costruttori e metodi setter

Ingegneria del software mod. B

Riccardo Cardin

SPRING: CONCETTI

DEPENDENCY INJECTION

Dependency Injection pattern

Separa il comportamento di una componente dalla


risoluzione delle sue dipendenze

Minimizza il livello di accoppiamento

La componente dichiara unicamente le sue


dipendenze

Un framework DI risolve a runtime le dipendenze


dichiarate

Ingegneria del software mod. B

migliorando un po

Riccardo Cardin

DEPENDENCY INJECTION

10

Ingegneria del software mod. B

Utilizzo del design pattern factory

Spring injection

Costruzione e risoluzione delle dipendenze

11

Ingegneria del software mod. B

Riccardo Cardin

DEPENDENCY INJECTION

Classic inizialization

Poor initialization

Riccardo Cardin

12

Ingegneria del software mod. B

Riccardo Cardin

SOMMARIO

Introduzione

Concetti base

Architettura

MVC framework

Persistenza: JDBC e ORM

SPRING: ARCHITETTURA

Architettura del framework

13

Ingegneria del software mod. B

Riccardo Cardin

SPRING: ARCHITETTURA

org.springframework.beans.factory.BeanFactory

Wiring bean

Modulo JDBC e DAO


Gestione degli accessi al datasource
Evita la gestione delle connessioni

Modulo MVC

Implementazione del pattern factory, costruisce e risolve le


dipendenze

org.springframework.context. ApplicationContext

Fornisce servizi come i18n, JNDI, EJB integration

Riccardo Cardin

Configurazione XML

Application context

Implementa lIoC attraverso la BeanFactory

Ingegneria del software mod. B

SPRING: COMPONENTI

Core container

14

Costruita sulla bean factory, fornisce ulteriori funzionalit


AOP, transazionalit, ...

ApplicationContext ctx =
newClassPathXmlApplicationContext(
"com/springinaction/springidol/filename.xml");
[]
15

MyBean bean = (MyBean) ctx.getBean(beanid);

16

Separa la logica di controllo da quella di business

Ingegneria del software mod. B

Riccardo Cardin

Ingegneria del software mod. B

Riccardo Cardin

SPRING: COMPONENTI

SPRING: COMPONENTI

Configurazione XML

Dependency injection attraverso propriet

Utilizzo metodi setter e getter

<constructor-arg value="15"/>
<constructor-arg ref="B"/>
</bean >

<property name="nome1" ref bean="B"/>


<property name="nome2" value="una stringa"/>
<property name="nome3" value="37"/>
</bean >

<bean id="B" class="nomeClasseB" />


</beans>

<bean id="B" class="nomeClasseB" />


</beans>

17

Riccardo Cardin

SPRING: COMPONENTI

Dependency injection attraverso costruttori

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
</beans>
<bean id="A" class="nomeClasseA" >

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
</beans>
<bean id="A" class="nomeClasseA" >

Ingegneria del software mod. B

Configurazione XML

DI attraverso factory methods, init e destroy


methods...

Ingegneria del software mod. B

18

Riccardo Cardin

SPRING: COMPONENTI

Wiring utilizzando annotazioni

Permette una gestione migliore della configurazione


in progetti grandi
Introduce una dipendenza da framework esterni

Wiring utilizzando annotazioni

Ricerca un bean con ID uguale al nome della propriet


Si utilizza su costruttori, propriet, ...
LID non deve essere ambiguo (utilizzo @Named)

@Autowired
@Inject, annotazione JSR-330
@Resource, annotazione JSR-250

@Inject
private Instrument instrument;

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
</beans>
<context:annotation-config/>
[...]
</beans>
Ingegneria del software mod. B

@Inject

@Inject
@Named("guitar")
private Instrument instrument2;

19

Riccardo Cardin

Autodiscovery

@Component, @Controller, @Service, ...

Ingegneria del software mod. B

20

Riccardo Cardin

SPRING

SOMMARIO

Esempio

Introduzione

Concetti base

Architettura

MVC framework

Persistenza: JDBC e ORM

Interfacce e dependency injection

21

Ingegneria del software mod. B

Riccardo Cardin

SPRING: MVC

Model

View

Riccardo Cardin

Architettura

Layer della logica di business del sistema


Layer di visualizzazione/presentazione dati
Utilizza la tecnologia JSP e Tag library

Control

Ingegneria del software mod. B

FRONT CONTROLLER PATTERN

Componente per lo sviluppo di applicazione web

22

Layer che gestisce/controlla flussi e comunicazioni


Dispatcher delle richieste (Front controller)
Controller che implementano la logica applicativa

Integrazione con Spring IoC container

Utilizzo del DI pattern

Ingegneria del software mod. B

23

Riccardo Cardin

24

Ingegneria del software mod. B

Riccardo Cardin

FRONT CONTROLLER PATTERN

SPRING: MVC

Il controller lunico punto di accesso

Architettura e componenti

Gestisce le richieste in tutti gli aspetti

25

Ingegneria del software mod. B

Riccardo Cardin

SPRING: MVC

Front controller del framework Spring


Da configurare nel file web.xml

Configurata via XML (Web Application Context)

<servlet-name>-servlet.xml

Ingegneria del software mod. B

Riccardo Cardin

Handler mappings
Associa la servlet (gli URL) con i controller
BeanNameUrlHandlerMapping
<beans>
<bean id="beanNameUrlMapping"
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<bean name="/listEmployee.htm"
class="controllers.ListEmployeeController">
.
</bean>

<servlet>
<servlet-name>disp</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
Default servlet, non
<servlet-mapping>
preclude alcun formato
<servlet-name>disp</servlet-name>
nella risposta, ma gestisce
<url-pattern>/</url-pattern>
</servlet-mapping>
anche i contenuti statici.

Ingegneria del software mod. B

SPRING: MVC

org.springframework.web.servlet.DispatcherServlet

26

27

Riccardo Cardin

SimpleUrlHandlerMapping

<bean id ="handlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
/ex/view*.htm=helpController
/**/help.htm=helpController
</value>
</property>
</bean>
Ingegneria del software mod. B

28

Riccardo Cardin

SPRING: MVC

SPRING: MVC

Controller

Racchiudono la logica dellapplicazione web

Controller e annotazioni

necessario estendere uno dei controller


sempre possibile utilizzare linjection

AbstractController (richieste senza parametri)

AbstractCommandController (richiesti con parametri)


SimpleFormController

<mvc:annotation-driven/>
<context:component-scanbasepackage="com.habuma.spitter.mvc"/>
[...]
</bean>

29

Riccardo Cardin

Ingegneria del software mod. B

30

Riccardo Cardin

SPRING: MVC

Controller e annotazioni
@Controller
public classHomeController {

Sfrutta lautowiring e lautodiscovering dei bean


POJO, pi semplice da verificare (i.e. Mockito)

class="org.springframework.web.portlet.mvc.annotation.
DefaultAnnotationHandlerMapping" />

SPRING: MVC

Mapping delle richieste utilizzando @RequestMapping

<beans>
<bean id="defaultHandlerMapping"

public class ListEmployeeController extends AbstractController {


private EmployeeInfoControl service ; // injection
@Override
protected ModelAndView handleRequestInternal(
HttpServletRequest arg0, HttpServletResponse arg1)
throws Exception {
//talk to service layer here ..
// for example: service.method()
}
Ingegneria del software mod. B

DefaultAnnotationHandlerMapping

org.springframework.web.portlet.ModelAndView

Dichiarazione del Controller

private SpitterService spitterService;

Injection dellapplicazion logic

@Inject
public HomeController(SpitterServicespitterService) {
this.spitterService = spitterService;
}

Oggetto di comunicazione fra controller e view

Sfrutta tre parametri


viewTarget (tipo String): nome simbolico con cui si
identifica la pagina JSP corrispondente
objectName (tipo String): nome simbolico con cui si
etichetta loggetto da passare alla JSP
objectValue (tipo Object): Oggetto da passare alla JSP

Dichiarazione URL gestiti

@RequestMapping({"/","/home"})
public String showHomePage(Map<String,Object> model) {

model.put("spittles",spitterService.getRecentSpittles(
DEFAULT_SPITTLES_PER_PAGE));
return"home";
Modello ritornato alla

view

}
}

Scelta della prossima view

Ingegneria del software mod. B

31

Riccardo Cardin

32

Ingegneria del software mod. B

Riccardo Cardin

SPRING: MVC

SPRING: MVC

Classi command

Oggetti di comunicazione fra view e controller

private CourseService courseService;


public DisplayCourseController() {
setCommandClass(DisplayCourseCommand.class);
}
[]

Spitterspitter=spitterService.getSpitter(username);
model.addAttribute(spitter);
model.addAttribute(
spitterService.getSpittlesForSpitter(username));
return"spittles/list";
}

public class DisplayCourseCommand {

public DisplayCourseCommand() {}
private Integer id;
public void setId(Integer id) {
this.id = id;
}
public Integer getId() { return id; }

Mappa di stringhe oggetti


Convention over configuration (CoC)
Da utilizzare con Controller annotati

33

Riccardo Cardin

SPRING: MVC

Scelte da un risolutore (resolver) secondo il


ModelAndView

XmlViewResolver Usa un file di configurazione xml per la


risoluzione delle view

InternalResourceViewResolver

<bean class="org.springframework.web.servlet.view.XmlViewResolver">
<property name="location">
<value>/WEB-INF/spring-views.xml</value>
</property>
</bean>

UrlBasedViewResolver Esegue una risoluzione diretta del

Ingegneria del software mod. B

Componente view

XmlViewResolver

ResourceBundleViewResolver Usa un resource bundle (una


serie di file con estensione .properties) per risolvere le view

InternalResourceViewResolver Il nome logico viene


utilizzato direttamente come nome della view.

Riccardo Cardin

[...]
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
[...]

nome simbolico della view in una URL

Ingegneria del software mod. B

34

SPRING: MVC

Componente view

org.springframework.ui.Model

}
Ingegneria del software mod. B

Permette il recupero dei parametri da una richiesta

@RequestMapping(value="/spittles",method=GET)
public String listSpittlesForSpitter(
@RequestParam("spitter") String username, Model model) {

public class DisplayCourseController


extends AbstractCommandController {

@RequestParam

35

Riccardo Cardin

<beans xmlns=>
<bean id="WelcomePage
class="org.springframework.web.servlet.view.JstlView">
<property name="url" value="/WEB-INF/pages/WelcomePage.jsp" />
</bean>
</beans>
Ingegneria del software mod. B

36

Riccardo Cardin

SOMMARIO

Introduzione

Concetti base

SPRING: PERSISTENZA

Fornisce supporto uniforme verso lo strato di


persistenza

Architettura

JDBC, ORM,
Versione particolare del template method pattern

MVC framework

Persistenza: JDBC e ORM

Nessun metodo astratto


Le firme dei metodi hanno come parametri interfacce che
vengono risolte a runtime

37

Ingegneria del software mod. B

Riccardo Cardin

TEMPLATE METHOD

PreparedStatementCreator
CallableStatementCreator
RowCallbackHandler
RowMapper
...

Ingegneria del software mod. B

38

Riccardo Cardin

SPRING: PERSISTENZA

Struttura

Definisce le operazione astratte


primitive. Definisce lo scheletro
dellalgoritmo

Supporto JDBC

org.springframework.jdbc.core.JdbcTemplate
Gestione trasparente delle connessioni
Incapsulamento API JDBC (query, ResultSet, )
Cattura le eccezioni JDBC e le trasforma in eccezioni pi
comunicative

Permette di costruire DAO utilizzando IoC

public class JdbcCorporateEventDao implements CorporateEventDao {

Implementa le operazioni primitive


fornendo i passi concreti
allalgoritmo

Ingegneria del software mod. B

private JdbcTemplate jdbcTemplate;


public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
39

Riccardo Cardin

Ingegneria del software mod. B

40

Riccardo Cardin

SPRING: PERSISTENZA

STRUMENTI ORM

Supporto JDBC

Recupero primitivo
int countOfActorsNamedJoe =
this.jdbcTemplate.queryForInt("select count(0) from
t_actors where first_name = ?", new Object[]{"Joe"});

Recupero oggetti
public class ActorRowMapper implements RowMapper {
public Object mapRow(ResultSet rs, int rowNum)
throws SQLException {
Actor actor = new Actor();
actor.setFirstName(rs.getString("first_name"));
actor.setSurname(rs.getString("surname"));
return actor;
}
...
Actor actor = (Actor) this.jdbcTemplate.queryForObject(
"select first_name, surname from t_actor where id = ?",
new Object[]{new Long(1212)}, new ActorRowMapper() );

Ingegneria del software mod. B

Lazy loading
Eager fetching
Caching
Cascading

41

Riccardo Cardin

ID: NUMBER

LAST_NAME:
VARCHAR

H8

Ingegneria del software mod. B

42

Riccardo Cardin

Hibernate

public class Studente {


private Integer id;
private String firstName;
private String lastName;
private Set courses;
...
public String getFirstName()
{ return firstName; }
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
...

H8 Session Factory il gestore delle connessioni fra


oggetti Java e il database

43

Ingegneria del software mod. B

JPA, Java Persistence API

SPRING: PERSISTENZA

Mappa una tabella su un oggetto

FIRST_NAME:
VARCHAR

Studenti

Persistenza garantita attraverso gli oggetti

Offrono specifici linguaggi di interrogazione


Garantiscono sofisticate funzionalit

Hibernate

Framework in grado di mappare propriet di un


oggetto con colonne di un DB

SPRING: PERSISTENZA

Definizione

Accesso al JDBC layer in I/O

Riccardo Cardin

Necessit di datasource inietiamolo con Spring!

<beans>
<bean id="myDataSource"
class="org.apache.commons.dbcp.BasicDataSource" >
<property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
</bean>
<bean id="mySessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="mappingResources">
<list>
<value>hibernate.hbm.xml</value>
</list>
</property>
...
</beans>
Ingegneria del software mod. B

44

Riccardo Cardin

SPRING: PERSISTENZA

SPRING: PERSISTENZA

Hibernate

org.springframework.orm.hibernate3.HibernateTemplate

Fornisce l'accesso alla sessione di H8


Assicura che la session stessa sia appropriatamente aperta e
chiusa
Fornisce le funzionalit standard di accesso ai dati

Limplementazione dellinterfaccia HibernateCallback permette


linterfacciamento Spring H8

Ingegneria del software mod. B

public void updateStudent(Student student) {


hibernateTemplate.update(student);
}
public List findStudentsByLastName(String lastName) {
return hibernateTemplate.find("from Student student " +
"where student.lastName = ?", lastName);
}

45

Riccardo Cardin

Ingegneria del software mod. B

46

Riccardo Cardin

RIFERIMENTI

Ci sarebbero ancora molti aspetti da trattare

Non occorre pi implementare HiberateCallback

<bean id="hibernateTemplate
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>

SPRING

possibile configurare HibernateTemplate


direttamente con una session factory

public Collection loadAziende(final String category)


throws DataAccessException {
HibernateTemplate ht = new HibernateTemplate(this.sessionFactory);
return (Collection) ht.execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Query query = session.createQuery("from spring-samples.Aziende aziende");
return query.list();
} });
}

Hibernate

Gestione delle transazioni


Aspect Oriented Programming (AOP)
Remoting
Spring 3.x
Spring Roo
Spring Social
Spring Web Service

Spring Source, pagina ufficiale del progetto


http://www.springsource.org/
Spring in Action (3 edition), Manning
Publications
Spring tutorial
http://www.roseindia.net/spring/index.shtml

ma non c pi tempo!!!
47

Ingegneria del software mod. B

Riccardo Cardin

48

Ingegneria del software mod. B

Riccardo Cardin