SPRING - MAVEN - REST API (ITA - Luglio 2017)Valerio Radice
Introduzione al framework Java Spring e Maven per realizzare API REST.
Breve introduzione all'uso di Maven per configurare un progetto SpringBoot e realizzare un server REST.
Disponibile il codice dimostrativo su github (link nelle slide, attenzione alle branch).
Valerio Radice (valix85)
Luglio 2017
Lo Spring Framework viene ancora una volta incontro agli sviluppatori Java semplificandone la vita, questa volta vedremo come implementare facilmente uno strato servizi stateless da rendere disponibile remotamente nei diversi formati fruibili dalle diverse tecnologie client RIA, introducendo i concetti di Exporter e Proxy di Spring Remoting. Tutto questo tramite pura configurazione, via XML o annotation a seconda dei gusti, e con un esempio specifico in Flex con Spring BlazeDS Integration.
SPRING - MAVEN - REST API (ITA - Luglio 2017)Valerio Radice
Introduzione al framework Java Spring e Maven per realizzare API REST.
Breve introduzione all'uso di Maven per configurare un progetto SpringBoot e realizzare un server REST.
Disponibile il codice dimostrativo su github (link nelle slide, attenzione alle branch).
Valerio Radice (valix85)
Luglio 2017
Lo Spring Framework viene ancora una volta incontro agli sviluppatori Java semplificandone la vita, questa volta vedremo come implementare facilmente uno strato servizi stateless da rendere disponibile remotamente nei diversi formati fruibili dalle diverse tecnologie client RIA, introducendo i concetti di Exporter e Proxy di Spring Remoting. Tutto questo tramite pura configurazione, via XML o annotation a seconda dei gusti, e con un esempio specifico in Flex con Spring BlazeDS Integration.
Allo User Group Italiano su Liferay di Bologna: Overview del futuro prossimo su Liferay.
OSGi (Open Service Gateway Initiative) è una specifica che permette di costruire applicazioni modulari a componenti (i Bundle) e che introduce una programmazione Service Oriented, permettendo una separazione tra interfaccia ed implementazione molto più rigorosa di quella nativa Java. Esistono diverse implementazioni (container) di OSGi, conformi alle specifiche.
A very introductive presentation about how Model-View-Controller pattern (MVC) and Dependence Injection (DI) are implemented in some popular frameworks, such as Spring and Angular JS.
The presentation is took from the Software Engineering course I run in the bachelor-level informatics curriculum at the University of Padova.
L’articolo intende comunicare le informazioni base che riguardano gli hooks favorendo l’aspetto reale, in altre parole, far capire a cosa servono tramite l’esposizione e realizzazione di un caso di studio quanto più possibile vicino al reale. Sarà quindi presentato un caso d’integrazione che farà uso degli hooks, toccando i vari aspetti di personalizzazione. L’articolo sarà suddiviso in più episodi per evitare una “sbrodolata” d’informazione e rendere più efficace l’assimilazione di quanto esposto.
Una panoramica delle caratteristiche e delle possibilità che hanno reso Angular uno dei framework più importanti sulla scena frontend.
N.B. Le slides sono aggiornate sino ad Angular 6.
Presentazione di Massimiliano Dessì al Javaday 2009 a Roma, dal titolo "Real Spring AOP, recipes for your everyday job. ", gli esempi sono tratti dal libro Spring 2.5 Aspect Oriented Programming edito dalla packt publishing a febbraio 2009
Liferay 7: Come realizzare un client SOAP con Apache CXF in OSGi StyleAntonio Musarra
Non sapete come realizzare un client SOAP in OSGi Style su Liferay 7?La risposta è il framework Apache CXF installato a bundle e poi OSGi Service Pattern.
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015Codemotion
Codemotion Rome 2015 - Costruiamo con Spring Boot una applicazione Java EE con transazioni multiple JDBC-JMS utilizzando H2 e HornetQ (embedded in memory), il supporto di autoconfiguration JAX-RS (Jersey), le annotazioni JSR 250 per i lifecycle hooks, e le annotazioni JSR 330 utilizzabili per AS proprietari e per la portabilità in container di dependency injection come Spring. Per finire distribuiremo su Undertow embedded HTTTP server, su un AS standalone (Apache TomEE) e come PAAS su Cloud Foundry.
Presentazione sull'evoluzione di Struts, primo framework web MVC in ambito Java e sul merger con WebWork, effettuata durante la (prima!) tappa di Torino della prima edizione di JavaDay '06.
Non solo Django: MVC orientato agli oggetti con Plone e Zope ToolkitMaurizio Delmonte
Direzioni fondamentali per entrare rapidamente nella comprensione di Plone e del suo mondo, e costruire il vostro sistema di gestione contenuti in capo a pochi giorni.
Nel corso di quest’articolo vedremo come sia possibile sfruttare il Service Builder (Liferay Inc., 2014) per creare dei servizi da esporre all’esterno non direttamente collegati all’entità gestiste dallo specifico plugin.
Quello che vogliamo ottenere è quindi un servizio personalizzato chiamato Custom Users Service disponibile pubblicamente e che sfrutti i servizi core del portale. In questo particolare scenario vogliamo fare in modo che il servizio Custom Users Service, esponga un metodo che ritorni al consumer del servizio, la lista di utenti taggati con un determinato tag (Liferay Inc., 2014).
Allo User Group Italiano su Liferay di Bologna: Overview del futuro prossimo su Liferay.
OSGi (Open Service Gateway Initiative) è una specifica che permette di costruire applicazioni modulari a componenti (i Bundle) e che introduce una programmazione Service Oriented, permettendo una separazione tra interfaccia ed implementazione molto più rigorosa di quella nativa Java. Esistono diverse implementazioni (container) di OSGi, conformi alle specifiche.
A very introductive presentation about how Model-View-Controller pattern (MVC) and Dependence Injection (DI) are implemented in some popular frameworks, such as Spring and Angular JS.
The presentation is took from the Software Engineering course I run in the bachelor-level informatics curriculum at the University of Padova.
L’articolo intende comunicare le informazioni base che riguardano gli hooks favorendo l’aspetto reale, in altre parole, far capire a cosa servono tramite l’esposizione e realizzazione di un caso di studio quanto più possibile vicino al reale. Sarà quindi presentato un caso d’integrazione che farà uso degli hooks, toccando i vari aspetti di personalizzazione. L’articolo sarà suddiviso in più episodi per evitare una “sbrodolata” d’informazione e rendere più efficace l’assimilazione di quanto esposto.
Una panoramica delle caratteristiche e delle possibilità che hanno reso Angular uno dei framework più importanti sulla scena frontend.
N.B. Le slides sono aggiornate sino ad Angular 6.
Presentazione di Massimiliano Dessì al Javaday 2009 a Roma, dal titolo "Real Spring AOP, recipes for your everyday job. ", gli esempi sono tratti dal libro Spring 2.5 Aspect Oriented Programming edito dalla packt publishing a febbraio 2009
Liferay 7: Come realizzare un client SOAP con Apache CXF in OSGi StyleAntonio Musarra
Non sapete come realizzare un client SOAP in OSGi Style su Liferay 7?La risposta è il framework Apache CXF installato a bundle e poi OSGi Service Pattern.
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015Codemotion
Codemotion Rome 2015 - Costruiamo con Spring Boot una applicazione Java EE con transazioni multiple JDBC-JMS utilizzando H2 e HornetQ (embedded in memory), il supporto di autoconfiguration JAX-RS (Jersey), le annotazioni JSR 250 per i lifecycle hooks, e le annotazioni JSR 330 utilizzabili per AS proprietari e per la portabilità in container di dependency injection come Spring. Per finire distribuiremo su Undertow embedded HTTTP server, su un AS standalone (Apache TomEE) e come PAAS su Cloud Foundry.
Presentazione sull'evoluzione di Struts, primo framework web MVC in ambito Java e sul merger con WebWork, effettuata durante la (prima!) tappa di Torino della prima edizione di JavaDay '06.
Non solo Django: MVC orientato agli oggetti con Plone e Zope ToolkitMaurizio Delmonte
Direzioni fondamentali per entrare rapidamente nella comprensione di Plone e del suo mondo, e costruire il vostro sistema di gestione contenuti in capo a pochi giorni.
Nel corso di quest’articolo vedremo come sia possibile sfruttare il Service Builder (Liferay Inc., 2014) per creare dei servizi da esporre all’esterno non direttamente collegati all’entità gestiste dallo specifico plugin.
Quello che vogliamo ottenere è quindi un servizio personalizzato chiamato Custom Users Service disponibile pubblicamente e che sfrutti i servizi core del portale. In questo particolare scenario vogliamo fare in modo che il servizio Custom Users Service, esponga un metodo che ritorni al consumer del servizio, la lista di utenti taggati con un determinato tag (Liferay Inc., 2014).
AreaMVC: un'architettura software basata sulla semplicitàGiulio Destri
Come usare il pattern MVC per creare una architettura semplice e flessibile con cui ottenere software manutenibile e facilmente adattabile a nuove esigenze. Usabile in .NET e Java.
Quando, come e perché utilizzare PowerMock. Vengono analizzati i legami tra design delle applicazioni e strumenti di test. Sono presenti esempi di codice semplice ma verosimile con i rispettivi test.
In tutti i progetti, indipendentemente dallo strumento e dalla dimensione dello stesso, un fattore fondamentale è l'organizzazione e la gestione del processo di realizzazione ed il mantenimento successivo.
In questa sessione ci focalizzeremo su come approcciare la gestione di un progetto basato su Drupal, partendo dalla fase di analisi e definizione delle specifiche iniziali, per poi passare alla gestione delle attività e la loro consequenzialità nella fase di sviluppo.
Verranno illustrati alcuni degli strumenti che possono essere utilizzati e come questi possono aiutare nel raggiungere l'obiettivo nei tempi e modalità previste.
Drupal Day 2011 - Organizza il tuo lavoroDrupalDay
Talk di Marco Vito Moscaritolo | Drupal Day Roma 2011
"In tutti i progetti, indipendentemente dallo strumento e dalla dimensione dello stesso, un fattore fondamentale è l'organizzazione e la gestione del processo di realizzazione ed il mantenimento successivo.
In questa sessione ci focalizzeremo su come approcciare la gestione di un progetto basato su Drupal, partendo dalla fase di analisi e definizione delle specifiche iniziali, per poi passare alla gestione delle attività e la loro consequenzialità nella fase di sviluppo.
Verranno illustrati alcuni degli strumenti che possono essere utilizzati e come questi possono aiutare nel raggiungere l'obiettivo nei tempi e modalità previste."
Durante la mia lunga e intima amicizia con Lotus Holmes, non lo avevo mai inteso parlare del package “com.ibm.notes.java.ui” prima del rilascio della versione 8.5.
Presente inizialmente come "undocumented feature", il mistero fu svelato grazie all'aiuto degli Irregolari di Eclipse Street.
Da quel giorno fu possibile creare plug-ins per il client Notes in grado, ad esempio, di interagire con i documenti selezionati in una vista, evitando di replicare lo stesso agente su ciascun database per tutte quelle sempreverdi necessità di front-end (modifica di campi, aggiunta di autori e lettori, e così via) o di esportare dati dal documento o dalla vista attivi a fogli di calcolo o documenti Lotus Symphony.
Un'ulteriore prova, se mai ce ne fosse stato bisogno, che l'unica risposta possibile per tutte quelle domande relative al miglior software per la collaborazione e il group working, orientato all'integrazione con strumenti di desktop office è una e una soltanto: «Elementare: Notes!».
Caso risolto.
Il Corso Unified Modeling Language - UML di K-Tech (http://www.k-tech.it) ha come obiettivo quello di offrire ai partecipanti gli strumenti per sapere leggere e usare lo Unified Modeling Language, sia nella comunicazione all’interno del team di sviluppo, sia all’esterno con gli stakeholder coinvolti.
La forza dell'UML è che i vari ruoli coinvolti nella creazione di un sistema (sviluppatori, DBA, manager, analisti), utilizzando le notazioni grafiche e i diagrammi di un solo linguaggio, riescono a comunicare facilmente fra loro.
Il corso Unified Modeling Language (UML) si compone di diciotto moduli:
1. Overview
2. Introduzione all’UML
3. Modellazione Strutturale
4. Relazioni
5. Diagrammi
6. Class Diagram
7. Object Diagram
8. Component Diagram
9. Package Diagram
10. Deployment Diagram
11. Composite Structure Diagram
12. Activity Diagram
13. Use Case Diagram
14. Statechart Diagram
15. Timing Diagram
16. Sequence Diagram
17. Communication Diagram
18. Interaction Overview Diagram
Leggi il programma completo:
http://www.k-tech.it/formazione/catalogo/corso_unified_modeling_language_uml
Generazione di diagrammi ArchiMate da modelli ontologici di EA e meta modello...Matteo Busanelli
Come usare modelli ontologici di Enterprise Architecture per le banche integrati fra loro dal Framework ABI Lab per generare in maniera automatica viste ArchiMate.
Plugin Archi AOI.
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...Massimiliano Dessì
Turning Maven into a High Scalable, Resource Efficient, Cloud Ready Microservice
Embracing Microservice Architecture in a new project is something that most of developers want!
But how about the old and gold projects that are not designed and planned for it?
What about refactoring a real legacy piece of software that is stable and used by almost all Java developers out there?
Come to this talk to see how we transformed Maven builds in a Cloud Ready Microservice.
Some covered topics are:
-Live objects extracted from Maven Mojos and shared between different classloaders
-Cloud Native features, Configuration and in memory plugins
-Turn any Maven build into incremental ones
-Concurrent use of the same Maven compiler
-Turn into reusable Maven internal objects to decrease memory footprint and increase speed
-How fits in Drools and jBPM ecosystem
-Trade offs
1. Spring @Aspect
e @Controller
Come utilizzare Spring
AOP e Spring MVC per
scrivere migliori webapp
con meno codice e meno
XML.
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
2. Author
Java Architect 2008
Co-fondatore e consigliere
JugSardegna Onlus 2003
Fondatore e coordinatore:
SpringFramework Italian User Group 2006
Jetspeed Italian User Group 2003
Groovy Italian User Group 2007
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
3. AOP
L' Aspect Oriented Programming supporta l'Object Oriented
Programming nella fase di implementazione, nei punti in cui
mostra dei punti di debolezza.
L'AOP è complementare all' OOP nella fase implementativa.
L' AOP deve essere utilizzato con
giudizio e cognizione di causa.
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
4. Limiti OOP
Code scattering, quando una funzionalità è implementata in
moduli diversi.
Si presenta in due forme:
- Blocchi di codice duplicato (es. identica implementazione di una
interfaccia in classi diverse)
- Blocchi di codice complementari della stessa funzionalità,
posti in differenti moduli.
(es in una ACL, un modulo esegue l'autenticazione e un altro
l'autorizzazione)
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
5. Limiti OOP
Code tangling, un modulo ha troppi compiti contemporanei.
public ModelAndView list(HttpServletRequest req, HttpServletResponse res)
throws Exception {
log(req); //logging
if(req.isUserInRole("admin")){ // authorization
List users ;
try { //exception handling
String username = req.getRemoteUser();
users =cache.get(Integer.valueOf(conf.getValue("numberOfUsers")),
username); //cache with authorization
} catch (Exception e) {
users = usersManager.getUsers();
}
return new ModelAndView("usersTemplate", "users", users);
}else{
return new ModelAndView("notAllowed");
}
}
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
6. Conseguenze
-Evoluzione difficile, il codice è legato a diverse funzionalità
-Cattiva qualità, quale era la funzione del metodo ?
-Codice non riusabile, è adatto solo a questo scenario
-Tracciabilità, chi fa cosa ?
-Improduttività, dove è il punto dove intervenire ?
Eppure è scritto con un linguaggio Object Oriented...
L'implementazione è il vero problema, non il linguaggio.
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
7. Origine del problema
Le classi si ritrovano a dover implementare funzionalità trasversali.
Il problema non è più una classe che deve avere un solo
compito/scopo/responsabilità/funzionalità, ma come quel compito
viene richiamato per essere utilizzato.
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
8. AOP Solution
L' AOP fornisce i costrutti e gli strumenti per modularizzare
queste funzionalità che attraversano trasversalmente
l'applicazione (crosscutting concerns).
L' AOP permette quindi di centralizzare realmente il codice
duplicato consentendo di applicarlo secondo regole
prestabilite nei punti desiderati, durante il flusso di
esecuzione.
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
9. AOP elements
Aspect: Corrisponde alla classe nell' OOP, contiene la
funzionalità trasversale (crosscutting concern).
Joinpoint: Punto di esecuzione del codice
(es l'invocazione di un costruttore, esecuzione di un metodo o
la gestione di una Exception)
Advice: L'azione da compiere nel joinpoint.
Pointcut: Contiene l'espressione che permette di individuare il
joinpoint al quale vogliamo applicare l'advice
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
10. AOP elements
Introduction: Permette l'aggiunta di interfacce e relativa
implementazione a runtime, a oggetti già definiti.
Target: Classe su cui agisce l'aspect con l'advice
Weaving: L'azione con cui vengono legati gli “attori” AOP e le
classi target.
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
11. AOP diagram
Come opera l' AOP
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
12. Spring AOP
Per permettere un utilizzo semplificato dell' AOP, Spring utilizza
come Joinpoint l'esecuzione dei metodi.
Questo significa che possiamo agire:
prima, dopo, attorno ad un metodo, alla sollevazione di una
eccezione, dopo l'esecuzione qualsiasi sia l' esito (finally),
utilizziamo normali classi Java con annotazioni oppure con XML.
Chi lavora nell' ombra per permetterci questa semplicità ?
java.lang.reflect.Proxy oppure CGLIB
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
13. Spring AOP: take it easy
Dobbiamo solo preoccuparci di
decidere:
-Cosa centralizzare/modularizzare ?
-Quando deve entrare in azione ?
Cosa posso ottenere:
-Supporto al Domain Driven Design
-Meno codice
-Codice gestibile e manutenibile
-Meno scuse per usare realmente l'
OOP, non per spostare contenitori...
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
14. Spring AOP - Concorrenza
@Aspect() @Order(0) Prima parte:
public class ConcurrentAspect {
private final ReadWriteLock lock = -Mi creo dei lock rientranti in
new ReentrantReadWriteLock(); lettura e scrittura
private final Lock rLock = lock.readLock();
private final Lock wLock = lock.writeLock();
-Annoto la classe con
@Pointcut("execution (* isAvailable(..))")
private void isAvailable() {}
@Aspect
@Pointcut("execution (* retainItem(..))") -Definisco con
private void retainItem() {}
l'annotazione
@Pointcut("execution (* release(..))") @Pointcut le espressioni
private void release() {}
che mi indicano quando l'
@Pointcut("release() || retainItem()") Aspect deve intervenire.
private void releaseOrRetain() {}
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
15. Spring AOP - Concorrenza
@Before("isAvailable()")
Seconda parte:
public void setReadLock() {
rLock.lock(); Definisco riutilizzando i nomi
}
dei metodi sui quali ho
@After("isAvailable()") annotato i @Pointcut la logica
public void releaseReadLock() {
rLock.unlock();
da eseguire con i lock
}
Con le annotazioni seguenti
@Before("releaseOrRetain()")
public void setWriteLock() { dichiaro quando voglio sia
wLock.lock(); eseguita
}
@After("releaseOrRetain()") @Before
public void releaseWriteLock() { @After
wLock.unlock();
}
@AfterReturning
} @Around
@AfterThrowing
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
16. Spring AOP – Advice Type
Gli advice non solo ci permettono di eseguire logica
nei punti definti dai pointcut, ma anche di ottenere
@Before
informazioni sulla esecuzione (classe target, metodo
@After chiamato, argomenti passati, valore restituito)
Con alcuni tipi di advice (around) anche di avere il
@AfterReturning controllo sul flusso di esecuzione.
La classe chiamante naturalmente non sa nulla di
@Around quello che avviene, vede sempre una semplice
classe ....
@AfterThrowing
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
17. Spring AOP – Pointcut
• execution Nei pointcut precedenti abbiamo visto come espressione
• within per definire il punto di applicazione fosse l' esecuzione di
• this un metodo con un determinato nome.
• target Abbiamo a disposizione anche altri designatori di
pointcut per avere il massimo controllo.
• args
• @target
• @args
• @within
• @annotation
● bean
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
18. Spring AOP – JMX
@ManagedResource("freshfruitstore:type=TimeExecutionManagedAspect")
@Aspect() @Order(2)
public class TimeExecutionManagedAspect {
@ManagedAttribute Oltre a poter intervenire nel
public long getAverageCallTime() {
return (this.callCount > 0 flusso di escuzione, posso
? this.accumulatedCallTime / this.callCount : 0);
}
anche gestire gli Aspect
@ManagedOperation
public void resetCounters() { stessi con JMX,
this.callCount = 0;
}
this.accumulatedCallTime = 0;
esponendo come attributi o
@ManagedAttribute operazioni, i normali
public long getAverageCallTime() {
return (this.callCount > 0 ? metodi dell' Aspect che è
this.accumulatedCallTime / this.callCount : 0);
}
sempre una classe java.
...
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
19. Spring AOP – JMX
...
@Around("within(it.mypackage.service.*Impl)") Posso quindi con JMX
public Object invoke(ProceedingJoinPoint joinPoint)
throws Throwable {
cambiare il
if (this.isTimeExecutionEnabled) {
StopWatch sw = new StopWatch(joinPoint.toString()); comportamento
sw.start("invoke");
try { dell' Aspect a runtime
return joinPoint.proceed();
} finally {
sw.stop();
synchronized (this) {
this.accumulatedCallTime += sw.getTotalTimeMillis();
}
logger.info(sw.prettyPrint());
}
} else {
return joinPoint.proceed();
}
}
...
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
20. ...
Spring AOP – Introductions
Una introduction mi permette di decorare un
oggetto a runtime, aggiungendogli interfacce e
relativa implementazione.
Questo permette sia di evitare la duplicazione
di una implementazione, sia di simulare l'
ereditarietà multipla che java non ha.
@Aspect
public class ParallelepipedIntroduction {
@DeclareParents(value = "org.springaop.chapter.four.introduction.Box",
defaultImpl = Titanium.class)
public Matter matter;
@DeclareParents(value = "org.springaop.chapter.four.introduction.Box",
defaultImpl = Cube.class)
public GeometricForm geometricForm;
}
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
21. ...
Spring AOP – @Aspect
Le annotazioni viste finora compresa la sintassi dei pointcut sono fornite da
AspectJ
import org.aspectj.lang.annotation.*
ma sono assolutamente dentro il “contesto” di Spring e su dei bean di
Spring.
Vediamo ora invece cosa possiamo utilizzare di Spring (IoC) fuori dal
“contesto” di Spring tramite AspectJ.
Dovremo scendere a qualche compromesso...
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
22. DDD
Aggregates Domain-Driven Design è un modo
Entities
di pensare le applicazioni.
Modules Factories Suggerendo di concentrare
l'attenzione sul dominio del
Services
Repositories problema, invitando a ragionare ad
Value Objects oggetti e non in base a contenitori
di dati da movimentare...
Application Layer Infrastructure Layer
UI Layer
Domain Layer
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
23. DDD
Nelle entità è concentrata
public interface Customer extends NamedEntity {
la logica di business, non
public Address getAddress();
public ContactInformation getContact(); nei servizi che eseguono
public void modifyContactInformation(ContactInformation contact);
“procedure”...
public void modifyAddress(Address address);
public Boolean saveCustomer();
In questo modo i nostri
public Boolean createOrder(); oggetti hanno dati e
public Boolean saveOrder();
comportamenti, come
public Order getOrder();
public List<Order> getOrders(); dovrebbe essere nelle
}
classi ad oggetti
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
24. SpringAOP +DDD +AspectJ
@Configurable(dependencyCheck = true, autowire=Autowire.BY_TYPE)
public class CustomerImpl implements Customer, Serializable {
@Autowired
public void setCustomerRepository(@Qualifier("customerRepository") CustomerRepository customerRepo) {
this.customerRepository = customerRepository;
}
@Autowired
public void setOrderRepository(@Qualifier("orderRepository") OrderRepository orderRepo) {
this.orderRepository = orderRepo;
}
public Boolean createOrder() {
Boolean result = false;
if (order == null) {
order = new OrderImpl.Builder(Constants.ID_NEW, new Date(), id
.toString()).build();
result = true;
}
return result;
}
public Boolean saveCustomer() {
return customerRepository.saveCustomer(this);
}
...
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
25. SpringAOP +AspectJ
Con @Configurable abbiamo dichiarando che alla classe verranno iniettate
delle dipendenze benchè non sia uno spring bean.
L' applicationContext di Spring conosce la classe semplicemente come un
bean prototype.
Per avere questa funzionalità abbiamo necessità di comunicare alla jvm il jar
di spring da usare per il Load Time Weaving:
-javaagent:<path>spring-agent.jar
oppure configurare tomcat in questo modo per farlo al nostro posto:
<Loader
loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"
useSystemClassLoaderAsParent="false"/>
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
26. Spring AOP +AspectJ Weaver
Utilizzare l'AspectJ Weaver comporta un approccio diverso rispetto alla
semplicità di SpringAOP vista sinora.
Annotare delle classi come @Aspect e farli creare da Spring, significa
rimanere comunque dentro l' IoC Container, così come definire pointcut su
esecuzioni di metodi da parte di bean di Spring.
Con il LTW stiamo dicendo a Spring di operare fuori dal suo “contesto”, per
iniettare le dipendenze su oggetti non creati dall' IoC.
Per utilizzare il LTW definiamo su un file per AspectJ le classi su cui deve
operare e quali Aspect deve creare, Aspects che non sono bean creati da
Spring...
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
28. Spring AOP +AspectJ Weaver
Una volta che abbiamo le dipendenze in una entità del dominio,
sia con l'iniezione delle dipendenze con il LTW, o tramite passaggio delle
dipendenze come argomenti del costruttore ad opera di una factory,
vediamo il risultato sulla UI.
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
29. DDD UI
@Controller("customerController")
public class CustomerController {
@RequestMapping("/customer.create.page")
public ModelAndView create(HttpServletRequest req) {
return new ModelAndView("customer/create", "result", UiUtils.getCustomer(req).createOrder());
}
@RequestMapping("/customer.order.page")
public ModelAndView order(HttpServletRequest req) {
return new ModelAndView("customer/order", "order", UiUtils.getOrder(req));
}
@RequestMapping("/customer.items.page")
public ModelAndView items(HttpServletRequest req) {
return new ModelAndView("customer/items", "items", UiUtils.getOrder(req).getOrderItems());
}
...
}
I controller risultanti saranno completamente stateless e senza dipendenze, e
con una semplice chiamata sulla entità.
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
30. DDD UI
Handler Interceptor che pone nella HttpServletRequest l'entità customer
utilizzata dal Customer Controller
public class CustomerInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws
Exception {
req.setAttribute(Constants.CUSTOMER, customerFactory.getCurrentCustomer());
return true;
}
@Autowired
private CustomerFactory customerFactory;
}
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
39. Spring MVC Portlet
Portlet
Deja vu ? Handler Mapping
2
1 3
Controller
Dispatcher Portlet ModelAndView
4
5
ViewResolver
6
ViewRenderer
Servlet
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
40. Spring riutilizza gli stessi concetti della parte MVC Servlet,
traslando dove serve le richieste Portlet (action o render) in Servlet,
permettendo il riuso dei controller.
Spring fornisce una NativeWebRequest che maschera il tipo di
richiesta, questo approccio ci permette di scrivere controller che
virtualmente possono non sapere dentro cosa stanno girando.
In pratica, i problemi li può creare il portal server...
Nonostante i problemi con il portal server, è comunque possibile
riutilizzare la gran parte del codice scritto per una webapp normale.
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
42. Se abbiamo
disegnato bene la
nostra webapp
con SpringMVC,
non è troppo
complesso
portarlo su
SpringMVC Portlet
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
43. Spring AOP Book
Maggiori
informazioni
a febbraio su :
http://www.packtpub.com
Un enorme grazie a Stefano Sanna per il
supporto durante la scrittura del libro. Se è
stato terminato è grazie al suo contributo
che non è mai mancato.
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
44. Domande ?
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009
45. Grazie per l'attenzione !
Massimiliano Dessì
desmax74 at yahoo.it
http://jroller.com/desmax
http://www.linkedin.com/in/desmax74
http://wiki.java.net/bin/view/People/MassimilianoDessi
http://www.jugsardegna.org/vqwiki/jsp/Wiki?MassimilianoDessi
Spring Framework Italian User Group
http://it.groups.yahoo.com/group/SpringFramework-it
Massimiliano Dessì - desmax74@yahoo.it
Milano - 30/01/2009