Table Of ContentINTRODUZIONE
Un po’ di storia …
Java beans EJB 1.0 EJB 3.0
• Riusabilità e • Aggiunge ai • Implementazione
composizionalità beans componenti semplificata
• Troppo semplici server-side • Deployment
Transazionalità? • Servizi accedibili semplificato
DEPENDENCY INJECTION E Sicurezza? da remoto (annotazioni)
• Tecnologia molto
MVC: SPRING E ANGULARJS complessa
INGEGNERIA DEL SOFTWARE 1996 1998 2006
Università degli Studi di Padova
Dipartimento di Matematica
Corso di Laurea in Informatica, A.A. 2013 – 2014
2
[email protected] Ingegneria del software mod. B Riccardo Cardin
INTRODUZIONE INTRODUZIONE
Spring Spring
“Spring is a lightweight inversion of control and aspect oriented
Lightweight
container framework”
Non è intrusivo, gli oggetti sviluppati non dipendono da classi
del framework
Framework opensource creato per ridurre la
complessità dello sviluppo di applicazioni enterprise
Framework/Container
Gestisce il ciclo di vita e la configurazione degli oggetti
Non è limitato alla componente server dell’applicazione. La configurazione utilizza XML o annotazioni.
Lo sviluppatore può concentrarsi sulla logica di business
Utilizza componenti semplici (bean)
IoC e DI
Permette di ridurre l’accoppiamento 3 Il container si fa carico di “iniettare” le dipendenze degli oggetti 4
a runtime
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
SPRING: CONCETTI SPRING: CONCETTI
Plan Old Java Object (POJO) Dependency Injection pattern
" We wondered why people were so against using regular objects in their Separa il comportamento di una componente dalla
systems and concluded that it was because simple objects lacked a fancy
risoluzione delle sue dipendenze
n ame. So we gave them one, and it's caught on very nicely."
Inversion of Control (principio di Hollywood) Minimizza il livello di accoppiamento
Il ciclo di vita degli oggetti è gestito da una entità
esterna (container) La componente dichiara unicamente le sue
dipendenze
Dependency Injection
Le dipendenze di un oggetto vengono “iniettate” Un framework DI risolve a runtime le dipendenze
nell’istanza automaticamente e a runtime dichiarate
Utilizzo costruttori e metodi setter 5 Utilizzo costruttori e metodi setter dei POJO 6
Perdita dell’incapsulamento
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
DEPENDENCY INJECTION DEPENDENCY INJECTION
Poor initialization Classic inizialization
Utilizzo del design pattern factory
… migliorando un po’ …
7 8
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
DEPENDENCY INJECTION SPRING: ARCHITETTURA
Spring injection Architettura del framework
Costruzione e risoluzione delle dipendenze
...e si vuole cambiare
l’implementazione di B...
9 10
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
SPRING: ARCHITETTURA SPRING: COMPONENTI
Core container Configurazione XML
Implementa l’IoC attraverso la BeanFactory org.springframework.beans.factory.BeanFactory
Wiring bean Implementazione del pattern factory, costruisce e risolve le
dipendenze
Application context org.springframework.context.ApplicationContext
Fornisce servizi come i18n, JNDI, EJB integration Costruita sulla bean factory, fornisce ulteriori funzionalità
AOP, transazionalità, ...
Modulo JDBC e DAO
Gestione degli accessi al datasource ApplicationContext ctx =
new ClassPathXmlApplicationContext(
Evita la gestione delle connessioni
"com/springinaction/springidol/filename.xml");
[…]
Modulo MVC
11 MyBean bean = (MyBean) ctx.getBean(“beanid”); 12
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 Configurazione XML
Dependency injection attraverso proprietà Dependency injection attraverso costruttori
Utilizzo metodi setter e getter
<?xml version="1.0" encoding="UTF-8"?>
<!DOCT YPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
<?xml version="1.0" encoding="UTF-8"?>
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
</beans>
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<be an id="A" class="nomeClasseA" >
</beans>
<bean id="A" class="nomeClasseA" > <constructor-arg value="15"/>
<constructor-arg ref="B"/>
<property name="nome1" ref="B"/>
</bean >
<property name="nome2" value="una stringa"/>
<property name="nome3" value="37"/>
<bean id="B" class="nomeClasseB" />
</bean >
</beans>
<bean id="B" class="nomeClasseB" /> DI attraverso factory methods, init e destroy
</beans> 13 14
methods...
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
SPRING: COMPONENTI SPRING: COMPONENTI
Wiring utilizzando annotazioni Wiring utilizzando annotazioni
Permette una gestione migliore della configurazione @Inject/@Autowired
in progetti grandi Ricerca per tipo il bean della proprietà
Introduce una dipendenza da framework esterni Si utilizza su costruttori, proprietà, ...
@Autowired Il bean non deve essere ambiguo
@Inject, annotazione JSR-330 Disambiguazione tramite @Named per l’ID
@Resource, annotazione JSR-250 @Inject
private Instrument instrument;
<?xml version="1.0" encoding="UTF-8"?>
<!DO CTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" @Inject
"http://www.springframework.org/dtd/spring-beans-2.0.dtd"> @Named("guitar")
private Instrument instrument2;
</be ans>
< context:annotation-config/> Autodiscovery
<context:component-scan base-package="org.example"/>
15 16
[...] @Component, @Controller, @Service, ...
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
SPRING SPRING: MVC
Esempio Componente per lo sviluppo di applicazione web
Interfacce e dependency injection
Model
Layer della logica di business del sistema
View
Layer di visualizzazione/presentazione dati
Utilizza la tecnologia JSP e Tag library
Control
Layer che gestisce/controlla flussi e comunicazioni
Dispatcher delle richieste (Front controller)
Controller che implementano la logica applicativa
Integrazione con Spring IoC container
17 Utilizzo del DI pattern 18
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
FRONT CONTROLLER PATTERN FRONT CONTROLLER PATTERN
Architettura Il controller è l’unico punto di accesso
Gestisce le richieste in tutti gli aspetti
19 20
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
SPRING: MVC SPRING: MVC
Architettura e componenti org.springframework.web.servlet.DispatcherServlet
Front controller del framework Spring
Da configurare nel file web.xml
<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
<s ervlet-mapping> preclude alcun formato
<servlet-name>disp</servlet-name>
<url-pattern>/</url-pattern> nella risposta, ma gestisce
</servlet-mapping> anche i contenuti statici.
Configurata via XML (Web Application Context)
21 22
<servlet-name>-servlet.xml
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
SPRING: MVC SPRING: MVC
Handler mappings Controller e annotazioni
Associa la servlet (gli URL) con i controller Racchiudono la logica dell’applicazione web
BeanNameUrlHandlerMapping DefaultAnnotationHandlerMapping
<be ans> Mapping delle richieste utilizzando @RequestMapping
<bean id="beanNameUrlMapping"
class="org.spr ingframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> Sfrutta l’autowiring e l’autodiscovering dei bean
<bean name="/listEmployee.htm"
class="controllers.ListEmployeeController"> POJO, più semplice da verificare (i.e. Mockito)
….
</bean>
http://localhost:8080/ExampleSpring/list <beans>
SimpleUrlHandlerMapping Employee.htm <bean id="defaultHandlerMapping"
cl ass="org.springframework.web.portlet.mvc.annotation.
<bean id ="handlerMapping" DefaultAnnotationHandlerMapping" />
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings"> <mv c:annotation-driven/>
<value> <context:component-scanbase-
/ex/view*.htm=helpController package="com.habuma.spitter.mvc"/>
/**/help.htm=helpController
</value> 23 [...] 24
</property> </bean>
</bean>
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
SPRING: MVC SPRING: MVC
Controller e annotazioni @RequestParam
Dichiarazione del Controller Permette il recupero dei parametri da una richiesta
@Controller
public ClassHomeController { @RequestMapping(value="/spittles",method=GET)
pub lic String listSpittlesForSpitter(
private SpitterService spitterService; @RequestParam("spitter") String username, Model model) {
Injection dell’applicazion logic
@Inject Spitterspitter=spitterService.getSpitter(username);
public HomeController(SpitterServicespitterService) { model.addAttribute(spitter);
this.spitterService = spitterService; model.addAttribute(
} spitterService.getSpittlesForSpitter(username));
Dichiarazione URL gestiti return"spittles/list";
@RequestMapping({"/","/home"}) }
public String showHomePage(Map<String,Object> model) {
org.springframework.ui.Model
model.put("spittles",spitterService.getRecentSpittles(
DEFAULT_SPITTLES_PER_PAGE)); Mappa di stringhe – oggetti
return "home"; Modello ritornato alla view
} Convention over configuration (CoC)
} 25 Da utilizzare con Controller annotati 26
Scelta della prossima view
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
SPRING: MVC SPRING: MVC
Componente view Componente view InternalResourceViewResolver
Scelte da un risolutore (resolver) secondo il
[...]
ModelAndView <bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
XmlViewResolver Usa un file di configurazione xml per la </bean>
risoluzione delle view [...]
XmlViewResolver
ResourceBundleViewResolver Usa un resource bundle (una <bean class="org.springframework.web.servlet.view.XmlViewResolver">
serie di file con estensione .properties) per risolvere le view <property name="location">
<value>/WEB-INF/spring-views.xml</value>
</property>
UrlBasedViewResolver Esegue una risoluzione diretta del </bean>
nome simbolico della view in una URL
<beans xmlns=“…”>
<bean id="WelcomePage“
class="org.springframework.web.servlet.view.JstlView">
InternalResourceViewResolver Il nome logico viene <property name="url" value="/WEB-INF/pages/WelcomePage.jsp" />
utilizzato direttamente come nome della view. 27 </bean> 28
</beans>
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
SPRING: PERSISTENZA TEMPLATE METHOD
Fornisce supporto uniforme verso lo strato di Struttura
persistenza Definisce le operazione astratte
primitive. Definisce lo scheletro
dell’algoritmo
JDBC, ORM, …
Versione particolare del template method pattern
Nessun metodo astratto
Le firme dei metodi hanno come parametri interfacce che
vengono risolte a runtime
PreparedStatementCreator
CallableStatementCreator
RowCallbackHandler Implementa le operazioni primitive
RowMapper fornendo i passi concreti
all’algoritmo
... 29 30
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
SPRING: PERSISTENZA SPRING: PERSISTENZA
Supporto JDBC Supporto JDBC
org.springframework.jdbc.core.JdbcTemplate Accesso al JDBC layer in I/O
Recupero primitivo
Gestione trasparente delle connessioni
int countOfActorsNamedJoe =
Incapsulamento API JDBC (query, ResultSet, … ) this.jdbcTemplate.queryForInt("select count(0) from
Cattura le eccezioni JDBC e le trasforma in eccezioni più t_actors where first_name = ?", new Object[]{"Joe"});
comunicative
Recupero oggetti
public class ActorRowMapper implements RowMapper {
Permette di costruire DAO utilizzando IoC public Object mapRow(ResultSet rs, int rowNum)
throws SQLException {
Actor actor = new Actor();
public class JdbcCorporateEventDao implements CorporateEventDao {
actor.setFirstName(rs.getString("first_name"));
actor.setSurname(rs.getString("surname"));
private JdbcTemplate jdbcTemplate;
return actor;
public void setDataSource(DataSource dataSource) {
}
this.jdbcTemplate = new JdbcTemplate(dataSource);
...
}
Actor actor = (Actor) this.jdbcTemplate.queryForObject(
} 31 "select first_name, surname from t_actor where id = ?", 32
new Object[]{new Long(1212)}, new ActorRowMapper() );
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
STRUMENTI ORM SPRING: PERSISTENZA
Definizione Hibernate
Mappa una tabella su un oggetto
Framework in grado di mappare proprietà di un
oggetto con colonne di un DB Studenti public class Studente {
private Integer id;
Persistenza garantita attraverso gli oggetti ID: NUMBER private String firstName;
Offrono specifici linguaggi di interrogazione private String lastName;
private Set courses;
Garantiscono sofisticate funzionalità FIRST_NAME: ...
VARCHAR H8 public String getFirstName()
Lazy loading { return firstName; }
Eager fetching LAST_NAME: public void setFirstName(String firstName)
{
Caching VARCHAR this.firstName = firstName;
Cascading … }
...
…
JPA, Java Persistence API 33 34
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
SPRING: PERSISTENZA SPRING: PERSISTENZA
Hibernate Hibernate
H8 Session Factory è il gestore delle connessioni fra org.springframework.orm.hibernate3.HibernateTemplate
oggetti Java e il database Fornisce l'accesso alla sessione di H8
Necessità di datasource … inietiamolo con Spring! Assicura che la session stessa sia appropriatamente aperta e
chiusa
<beans> Fornisce le funzionalità standard di accesso ai dati
<bean id="myDataSource"
class="org.apache.commons.dbcp.BasicDataSource" > public Col lection loadAziende(final String category)
<property name="driverClassName" value="org.gjt.mm.mysql.Driver"/> throws DataAcces sException {
</bean> HibernateTemplate ht = new HibernateTemplate(this.sessionFactory);
<bean id="mySessionFactory" return (Collecti on) ht.execute(new HibernateCallback() {
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> publ ic Object doInHibernate(Session session) throws HibernateException {
<property name="dataSource" ref="myDataSource"/> Query query = session.createQuery("from spring-samples.Aziende aziende");
<property name="mappingResources"> return query. list();
<list> } });
<value>hibernate.hbm.xml</value> }
</list>
</property>
... 35 L’implementazione dell’interfaccia HibernateCallback 36
</beans> permette l’interfacciamento Spring – H8
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
SPRING: PERSISTENZA SPRING
Hibernate Ci sarebbero ancora molti aspetti da trattare …
È possibile configurare HibernateTemplate
direttamente con una session factory Gestione delle transazioni
Non occorre più implementare HiberateCallback Aspect Oriented Programming (AOP)
<bean id="hibernateTemplate“ Remoting
class="org.springframework.orm.hibernate3.HibernateTemplate">
Spring Roo
<property name="sessionFactory">
<ref bean="sessionFactory"/> Spring Social
</property>
</bean> Spring Web Service
Spring.io
public void updateStudent(Student student) {
hibernateTemplate.update(student); ...
}
public List findStudentsByLastName(String lastName) {
return hibernateTemplate.find("from Student student " + 37 … ma non c’è più tempo!!! 38
"where student.lastName = ?", lastName);
}
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
ANGULARJS ANGULARJS «whatever works
for you»
Javascript framework Model – View – Whatever
Client-side
view controller - modelview model
Model-View-Whatever
MVC per alcuni aspetti (controller)… Templates w) Services
…MVVM per altri (two-way data binding) peVie
coel Controllers
sd
Utilizza HTML come linguaggio di templating $o
Views M Model
Non richiede operazioni di DOM refresh (
Controlla attivamente le azioni utente, eventi del browser
Realizza le viste Espone i metodi Modello dati
Dependence injection
utilizzando le dell’application logic e e servizi di
proiezioni del realizza il two-way data business
39 40
Fornisce ottimi strumenti di test modello binding logic
Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B Riccardo Cardin
Description:MVC: SPRING E ANGULARJS. INGEGNERIA DEL SOFTWARE. Università degli
Studi di .. http://docs.angularjs.org/guide/databinding. ○ AngularJS controller.