INTRODUZIONE 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: