SlideShare a Scribd company logo
1 of 29
DEPENDENCY INJECTION
INGEGNERIA DEL SOFTWARE
Università degli Studi di Padova
Dipartimento di Matematica
Corso di Laurea in Informatica, A.A. 2015 – 2016
rcardin@math.unipd.it
Ingegneria del software mod. A
DEPENDENCY INJECTION
2Riccardo Cardin
Architetturali
Dependency injection, Model view controller
Ingegneria del software mod. A
INTRODUZIONE E CONTESTO
 Scopo
 Separazione del comportamento di una componente
dalla risoluzione delle sue dipendenze
 Motivazione
 Collegare due componenti in modo esplicito ne
aumenta l’accoppiamento
 Progettazione unit-test difficoltosa
 Riutilizzo scarso della componente
 Scarsa manutenibilità
 Le dipendenze vanno minimizzate!!!
3Riccardo Cardin
Ingegneria del software mod. A
PROBLEMA
 Esempio naive
4Riccardo Cardin
MovieLister nasconde le
proprie dipendenze in un
metodo.
Ingegneria del software mod. A
PROBLEMA
 Utilizzo di classi factory
 Utilizza metodi statici nel recupero di istanze concrete
ad interfacce
 Si può fare di meglio...
5Riccardo Cardin
Ingegneria del software mod. A
STRUTTURA
 Inversion of Control
 Il ciclo di vita degli oggetti è gestito da una entità
esterna (container)
 Tutti i framework moderni implementano IoC
 Dependency Injection con IoC
 Le dipendenze sono “iniettate” dal container
 La componente dichiara solo le sue dipendenze
 Minimizzazione del livello di accoppiamento
 Diversi tipi di injection
 Constructor injection
 Setter injection
6Riccardo Cardin
Ingegneria del software mod. A
STRUTTURA
 Dependency Injection con IoC
 Assembler risolve le dipendenze delle componenti
 Il ciclo di vita degli oggetti è deciso dal container
 Configurazione: meta-linguaggio (XML) o programmatica
 Cambio di movie finder  Cambio di configurazione
7Riccardo Cardin
Ingegneria del software mod. A
SOLUZIONE
 Constructor injection
 Dipendenze dichiarate come parametri del costruttore
 Vantaggi
 Permette di costruire oggetti validi sin dalla loro istanziazione
 Favorisce la costruzione di oggetti immutabili
 Svantaggi
 Telescoping
 A volte è difficile comprendere il significato dei parametri
8Riccardo Cardin
public class MovieLister {
private MovieFinder finder;
public MovieLister(MovieFinder finder) { // Dichiarazioe dip.
this.finder = finder;
} // ...
}
Ingegneria del software mod. A
SOLUZIONE
 Setter injection
 Dipendenze dichiarate come metodi setter
 Vantaggi
 Individuazione precisa delle dipendenze e dei loro nomi
 Lavora meglio con le gerarchie di classi
 Svantaggi
 La componente è costruita per passi
 Non è abilitante all’immutabilità
9Riccardo Cardin
public class MovieLister {
private MovieFinder finder;
public void setFinder(MovieFinder finder) {
this.finder = finder;
} // ...
}
Ingegneria del software mod. A
GOOGLE GUICE
 Lightweight DI framework
 Class injection (@Inject – JSR-330)
 Configurazione Java estendendo AbstractModule
10Riccardo Cardin
public class MovieModule extends AbstractModule {
@Override
protected void configure() {
// Istruisce il container di come risolvere la dipendenza
bind(MovieFinder.class).to(ColonMovieFinder.class);
}
}
public class MovieLister {
// L’annotazione istruisce il container di risolvere
// automaticamente le dipendenze dichiarate
@Inject
public MovieLister(MovieFinder finder) {
this.finder = finder;
} // ...
}
Ingegneria del software mod. A
GOOGLE GUICE
 Lightweight DI framework
 Method (setter) injection
 Field injection
11Riccardo Cardin
public class MovieLister {
// L’annotazione istruisce il container di risolvere
// automaticamente le dipendenze dichiarate
@Inject
public setFinder(MovieFinder finder) {
this.finder = finder;
} // ...
}
public class MovieLister {
// Risolta automaticamente dall’injector. Piu’ conciso ma
// meno verificabile
@Inject MovieFinder finder;
}
Ingegneria del software mod. A
GOOGLE GUICE
 Lightweight DI framework
 Cointainer è una struttura Map<Class<?>, Object>
 Non è possibile avere due oggetti dello stesso tipo
 È possibile utilizzare qualificatori ulteriori per questo caso
 Si integra con AOP, Servlet spec., DAO, ...
 @Named, @Singleton, @SessionScoperd, @RequestScoped...
12Riccardo Cardin
public static void main(String[] args) {
// Guice.createInjector() takes your Modules, and returns a new
// Injector instance. Most applications will call this method
// exactly once, in their main() method.
Injector injector = Guice.createInjector(new MovieModule());
// Now that we've got the injector, we can build objects.
MovieLister lister = injector.getInstance(MovieLister.class);
}
Ingegneria del software mod. A
SPRING
 Lightweight
 Non è intrusivo, gli oggetti sviluppati non dipendono da
classi del framework
 Framework/Container
 La configurazione utilizza XML, o annotazioni, o Java
 Lo sviluppatore può concentrarsi sulla logica di business
 Cointainer è una struttura Map<String, Object>
 Utilizza semplici POJO: Bean
 Supporta sia constructor, che setter injection
 JEE replacement
 MVC, Front controller, DI, AOP, JDBC Template, Security ...
13Riccardo Cardin
“Spring is a «lightweight» inversion of control and aspect oriented
container framework”
Ingegneria del software mod. A
SPRING
 Configurazione XML
 org.springframework.beans.factory.BeanFactory
 Implementazione del pattern factory, costruisce e risolve le
dipendenze
 org.springframework.context.ApplicationContext
 Costruita sulla bean factory, fornisce ulteriori funzionalità
 AOP, transazionalità, ...
14Riccardo Cardin
ApplicationContext ctx =
new ClassPathXmlApplicationContext(
"com/springinaction/springidol/filename.xml");
// ...
MovieLister ml = (MovieLister) ctx.getBean("movieLister");
Ingegneria del software mod. A
SPRING
 Configurazione XML
 Dependency injection attraverso proprietà
 Utilizzo metodi setter e getter
15Riccardo Cardin
<?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="movieLister" class=“MovieLister">
<!-- La classe ha come proprieta’ finder... -->
<property name="finder" ref="movieFinder" />
</bean>
<bean id=“movieFinder" class="ColonMovieFinder">
<property name="file" value="movies.csv“ />
</bean>
</beans>
Ingegneria del software mod. A
SPRING
 Configurazione XML
 Dependency injection attraverso costruttori
 Spring risolve automaticamente la scelta del costruttore
 Oppure factory methods, init,destroy methods...
16Riccardo Cardin
<?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="movieLister" class=“MovieLister">
<constructor-arg ref="movieFinder"/>
</bean >
<bean id=“movieFinder" class="ColonMovieFinder">
<constructor-arg value=“movies.csv"/>
</bean>
</beans>
Ingegneria del software mod. A
SPRING
 Configurazione Java
 @Configuration: dichiara una classe configurazione
 @Bean: dichiara un bean
17Riccardo Cardin
@Configuration
public class MovieConfig {
@Bean
public MovieLister lister(){
return new MovieLister( finder() );
}
@Bean
public MovieFinder finder(){
return new ColonMovieFinder("movies.csv");
}
}
ApplicationContext ctx =
new AnnotationConfigApplicationContext(MovieConfig .class);
bean id
Constructor injection
Ingegneria del software mod. A
SPRING
 Wiring utilizzando annotazioni
 Permette una gestione migliore della configurazione
in progetti grandi
 Introduce una dipendenza da framework esterni
 @Autowired
 @Inject, annotazione JSR-330
 @Resource, annotazione JSR-250
18Riccardo Cardin
<?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/>
<context:component-scan base-package="org.example"/>
[...]
Ingegneria del software mod. A
SPRING
 Wiring utilizzando annotazioni
 @Inject/@Autowired
 Ricerca per tipo il bean della proprietà e lo usa come id
 Si utilizza su costruttori, proprietà, ...
 Il bean non deve essere ambiguo
 Disambiguazione tramite @Named per l’ID
 Autodiscovery
 @Component, @Controller, @Service, ...
19Riccardo Cardin
@Inject
private Instrument instrument;
@Inject
@Named("guitar") // Fornisce nome differente dal tipo
private Instrument instrument2;
Ingegneria del software mod. A
JAVASCRIPT
 Dependency injection in Javascript
 Container è una mappa [string, function]
 Linguaggio non tipizzato staticamente
 Non ha interfacce esplicite
 JS è strutturato a moduli (module pattern)
 Injection di oggetti o interi moduli
 Esistono diverse librerie (API) per la DI
 RequireJS/AMD - http://requirejs.org/
 Inject.js - http://www.injectjs.com/
 AngularJS (framework) - https://angularjs.org/
20Riccardo Cardin
Ingegneria del software mod. A
ANGULARJS
 Javascript framework
 Client-side
 Model-View-Whatever
 MVC per alcuni aspetti (controller)…
 …MVVM per altri (two-way data binding)
 Utilizza HTML come linguaggio di templating
 Non richiede operazioni di DOM refresh
 Controlla attivamente le azioni utente, eventi del browser
 Dependence injection
 Fornisce ottimi strumenti di test
21Riccardo Cardin
Ingegneria del software mod. A
ANGULARJS
 Dependency Injection
 $provide: risolve le dipendenze fra le componenti
 Viene invocato direttamente da Angular al bootstrap
22Riccardo Cardin
// Provide the wiring information in a module
angular.module('myModule', []).
// Teach the injector how to build a 'greeter'
// Notice that greeter itself is dependent on '$window'
factory('greeter', function($window) {
// This is a factory function, and is responsible for
// creating the 'greet' service.
return {
greet: function(text) {
$window.alert(text);
}
};
});
// Request any dependency from the $injector
angular.injector(['myModule', 'ng']).get('greeter');
"Ricetta" di come
costruire greeter
Ritorna il servizio
$provide
Ingegneria del software mod. A
ANGULARJS
 Dependency Injection
23Riccardo Cardin
Ingegneria del software mod. A
ANGULARJS
 Dependency Injection
 Factory methods: costruiscono le componenti
 Utilizzano recipe (ricette)
24Riccardo Cardin
angular.module('myModule', []).
config(['depProvider', function(depProvider){
//...
}]).
factory('serviceId', ['depService', function(depService) {
//...
}]).
directive('directiveName', ['depService', function(depService) {
//...
}]).
filter('filterName', ['depService', function(depService) {
//...
}]).
run(['depService', function(depService) {
//...
}]);
Ingegneria del software mod. A
SCALA
 Cake Pattern
 Utilizzo di una notazione dedicata (self-type
annotation) e dei trait per dichiarazione delle
dipendenze e loro risoluzione
 Utilizzo di contenitori dedicati per risolvere le
dipendenze
 Divisione dei concetti di business dai dettagli tecnici
25Riccardo Cardin
trait FooAble {
def foo() = "I am a foo!"
}
class BarAble { this: FooAble => // self-type annotation
def bar = "I am a bar and " + foo()
}
val barWithFoo = new BarAble with FooAble // mixin
Ingegneria del software mod. A
SCALA
26Riccardo Cardin
// Declares a repository
trait UserRepositoryComponent {
val userRepository: UserRepository
class UserRepository {
def findAll() = Array[User]() // fake implementation
def save(user: User) = "Saving a user..." // fake implementation
}
}
// Declares a service that needs a repository
trait UserServiceComponent { this: UserRepositoryComponent =>
val userService: UserService
class UserService {
def findAll() = userRepository.findAll
def save(user: User) = userRepository.save(user)
}
}
// Configuration object that binds dependencies
object ComponentRegistry extends
UserServiceComponent with UserRepositoryComponent {
// Dependency injection
val userRepository = new UserRepository
val userService = new UserService
}
Ingegneria del software mod. A
CONCLUSIONI
 Vantaggi
 Migliora la fase di testing
 Isolamento delle componenti  Maggior riuso
 Migliora la resilienza del codice
 Manutenzione e correzioni componenti specifiche
 Migliora la flessibilità
 La disponibilità di più componenti simili permette di scegliere
a runtime la migliore
27Riccardo Cardin
Dependency injection means giving an object its own
instance variables. Really. That’s it.
James Shore
Ingegneria del software mod. A
RIFERIMENTI
 Design Patterns, Elements of Reusable Object Oriented Software,
GoF, 1995, Addison-Wesley
 Inversion of Control Containers and the Dependency Injection
pattern http://martinfowler.com/articles/injection.html
 Google Guice – Motivation
https://github.com/google/guice/wiki/Motivation
 Spring vs Guice: The one critical difference that matters
http://gekkio.fi/blog/2011-11-29-spring-vs-guice-the-one-critical-
difference-that-matters.html
 Spring – The IoC Container
http://docs.spring.io/spring/docs/current/spring-framework-
reference/html/beans.html
28Riccardo Cardin
Ingegneria del software mod. A
RIFERIMENTI
 Angular Dependency Injection https://docs.angularjs.org/guide/di
 JavaScript Dependency Injection
http://merrickchristensen.com/articles/javascript-dependency-
injection.html
 Eat that cake! http://rcardin.github.io/design/2014/08/28/eat-that-
cake.html
29Riccardo Cardin

More Related Content

What's hot

Design Pattern Comportamentali
Design Pattern ComportamentaliDesign Pattern Comportamentali
Design Pattern ComportamentaliRiccardo Cardin
 
IntroduzioneAllaGestioneDiUnProgettoSoftwareConUML
IntroduzioneAllaGestioneDiUnProgettoSoftwareConUMLIntroduzioneAllaGestioneDiUnProgettoSoftwareConUML
IntroduzioneAllaGestioneDiUnProgettoSoftwareConUMLmatteo_gentile
 
Il linguaggio UML - Teoria ed esempi pratici sugli use case diagram
Il linguaggio UML - Teoria ed esempi pratici sugli use case diagramIl linguaggio UML - Teoria ed esempi pratici sugli use case diagram
Il linguaggio UML - Teoria ed esempi pratici sugli use case diagramGiuseppe Cramarossa
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented ProgrammingAndrea Bozzoni
 

What's hot (9)

Diagrammi delle Classi
Diagrammi delle ClassiDiagrammi delle Classi
Diagrammi delle Classi
 
Design Pattern Comportamentali
Design Pattern ComportamentaliDesign Pattern Comportamentali
Design Pattern Comportamentali
 
Diagrammi di Attività
Diagrammi di AttivitàDiagrammi di Attività
Diagrammi di Attività
 
Introduzione a UML
Introduzione a UMLIntroduzione a UML
Introduzione a UML
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 
IntroduzioneAllaGestioneDiUnProgettoSoftwareConUML
IntroduzioneAllaGestioneDiUnProgettoSoftwareConUMLIntroduzioneAllaGestioneDiUnProgettoSoftwareConUML
IntroduzioneAllaGestioneDiUnProgettoSoftwareConUML
 
Il linguaggio UML - Teoria ed esempi pratici sugli use case diagram
Il linguaggio UML - Teoria ed esempi pratici sugli use case diagramIl linguaggio UML - Teoria ed esempi pratici sugli use case diagram
Il linguaggio UML - Teoria ed esempi pratici sugli use case diagram
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented Programming
 
Java codestyle & tipstricks
Java codestyle & tipstricksJava codestyle & tipstricks
Java codestyle & tipstricks
 

Viewers also liked

Java Graphics Programming
Java Graphics ProgrammingJava Graphics Programming
Java Graphics ProgrammingRiccardo Cardin
 
SOLID - Principles of Object Oriented Design
SOLID - Principles of Object Oriented DesignSOLID - Principles of Object Oriented Design
SOLID - Principles of Object Oriented DesignRiccardo Cardin
 
Scala For Java Programmers
Scala For Java ProgrammersScala For Java Programmers
Scala For Java ProgrammersEnno Runne
 
Java - Remote method invocation
Java - Remote method invocationJava - Remote method invocation
Java - Remote method invocationRiccardo Cardin
 
Software architecture patterns
Software architecture patternsSoftware architecture patterns
Software architecture patternsRiccardo Cardin
 
Java - Processing input and output
Java - Processing input and outputJava - Processing input and output
Java - Processing input and outputRiccardo Cardin
 
Java- Concurrent programming - Synchronization (part 2)
Java- Concurrent programming - Synchronization (part 2)Java- Concurrent programming - Synchronization (part 2)
Java- Concurrent programming - Synchronization (part 2)Riccardo Cardin
 
Java- Concurrent programming - Synchronization (part 1)
Java- Concurrent programming - Synchronization (part 1)Java- Concurrent programming - Synchronization (part 1)
Java- Concurrent programming - Synchronization (part 1)Riccardo Cardin
 
Java Exception Handling, Assertions and Logging
Java Exception Handling, Assertions and LoggingJava Exception Handling, Assertions and Logging
Java Exception Handling, Assertions and LoggingRiccardo Cardin
 
Java - Concurrent programming - Thread's advanced concepts
Java - Concurrent programming - Thread's advanced conceptsJava - Concurrent programming - Thread's advanced concepts
Java - Concurrent programming - Thread's advanced conceptsRiccardo Cardin
 
A (too) Short Introduction to Scala
A (too) Short Introduction to ScalaA (too) Short Introduction to Scala
A (too) Short Introduction to ScalaRiccardo Cardin
 
Presto updates to 0.178
Presto updates to 0.178Presto updates to 0.178
Presto updates to 0.178Kai Sasaki
 
Java - Generic programming
Java - Generic programmingJava - Generic programming
Java - Generic programmingRiccardo Cardin
 
Scala - the good, the bad and the very ugly
Scala - the good, the bad and the very uglyScala - the good, the bad and the very ugly
Scala - the good, the bad and the very uglyBozhidar Bozhanov
 
Java - Collections framework
Java - Collections frameworkJava - Collections framework
Java - Collections frameworkRiccardo Cardin
 
Java - Concurrent programming - Thread's basics
Java - Concurrent programming - Thread's basicsJava - Concurrent programming - Thread's basics
Java - Concurrent programming - Thread's basicsRiccardo Cardin
 

Viewers also liked (17)

Java Graphics Programming
Java Graphics ProgrammingJava Graphics Programming
Java Graphics Programming
 
SOLID - Principles of Object Oriented Design
SOLID - Principles of Object Oriented DesignSOLID - Principles of Object Oriented Design
SOLID - Principles of Object Oriented Design
 
Scala For Java Programmers
Scala For Java ProgrammersScala For Java Programmers
Scala For Java Programmers
 
Java - Remote method invocation
Java - Remote method invocationJava - Remote method invocation
Java - Remote method invocation
 
Software architecture patterns
Software architecture patternsSoftware architecture patterns
Software architecture patterns
 
Java - Processing input and output
Java - Processing input and outputJava - Processing input and output
Java - Processing input and output
 
Java- Concurrent programming - Synchronization (part 2)
Java- Concurrent programming - Synchronization (part 2)Java- Concurrent programming - Synchronization (part 2)
Java- Concurrent programming - Synchronization (part 2)
 
Java- Concurrent programming - Synchronization (part 1)
Java- Concurrent programming - Synchronization (part 1)Java- Concurrent programming - Synchronization (part 1)
Java- Concurrent programming - Synchronization (part 1)
 
Java Exception Handling, Assertions and Logging
Java Exception Handling, Assertions and LoggingJava Exception Handling, Assertions and Logging
Java Exception Handling, Assertions and Logging
 
Java - Concurrent programming - Thread's advanced concepts
Java - Concurrent programming - Thread's advanced conceptsJava - Concurrent programming - Thread's advanced concepts
Java - Concurrent programming - Thread's advanced concepts
 
A (too) Short Introduction to Scala
A (too) Short Introduction to ScalaA (too) Short Introduction to Scala
A (too) Short Introduction to Scala
 
Presto updates to 0.178
Presto updates to 0.178Presto updates to 0.178
Presto updates to 0.178
 
Java - Generic programming
Java - Generic programmingJava - Generic programming
Java - Generic programming
 
Scala - the good, the bad and the very ugly
Scala - the good, the bad and the very uglyScala - the good, the bad and the very ugly
Scala - the good, the bad and the very ugly
 
Java - Collections framework
Java - Collections frameworkJava - Collections framework
Java - Collections framework
 
Java - Sockets
Java - SocketsJava - Sockets
Java - Sockets
 
Java - Concurrent programming - Thread's basics
Java - Concurrent programming - Thread's basicsJava - Concurrent programming - Thread's basics
Java - Concurrent programming - Thread's basics
 

Similar to Design Pattern Architetturali - Dependency Injection

Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide SitoDavide Sito
 
Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)Giancarlo Valente
 
Docker vs Virtualizzazioni
Docker vs VirtualizzazioniDocker vs Virtualizzazioni
Docker vs VirtualizzazioniGiuliano Latini
 
SPRING - MAVEN - REST API (ITA - Luglio 2017)
SPRING - MAVEN - REST API (ITA - Luglio 2017)SPRING - MAVEN - REST API (ITA - Luglio 2017)
SPRING - MAVEN - REST API (ITA - Luglio 2017)Valerio Radice
 
Sql Injection: attacchi e rimedi
Sql Injection: attacchi e rimediSql Injection: attacchi e rimedi
Sql Injection: attacchi e rimediDavide Micale
 
Tesi Discussione
Tesi DiscussioneTesi Discussione
Tesi DiscussioneYeser Rema
 
Idiomatic Domain Driven Design
Idiomatic Domain Driven DesignIdiomatic Domain Driven Design
Idiomatic Domain Driven DesignAndrea Saltarello
 
Introduzione al java
Introduzione al javaIntroduzione al java
Introduzione al javaGiovanni Pace
 
Acadevmy - Angular Overview
Acadevmy - Angular OverviewAcadevmy - Angular Overview
Acadevmy - Angular OverviewFrancesco Sciuti
 
Presentazione review it_20min
Presentazione review it_20minPresentazione review it_20min
Presentazione review it_20minFabrizio Straccia
 
Dependency injection questa sconosciuta
Dependency injection questa sconosciutaDependency injection questa sconosciuta
Dependency injection questa sconosciutaAndrea Dottor
 
Migliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsMigliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsAndrea Dottor
 
WhyMCA12 - Android Tools e la gestione di progetti complessi
WhyMCA12 - Android Tools e la gestione di progetti complessiWhyMCA12 - Android Tools e la gestione di progetti complessi
WhyMCA12 - Android Tools e la gestione di progetti complessiMarco Gasparetto
 
Sistemi Context-aware: Esercitazione 3
Sistemi Context-aware: Esercitazione 3Sistemi Context-aware: Esercitazione 3
Sistemi Context-aware: Esercitazione 3Marco Loregian
 

Similar to Design Pattern Architetturali - Dependency Injection (20)

Spring Intro
Spring IntroSpring Intro
Spring Intro
 
Spring 2.5
Spring 2.5Spring 2.5
Spring 2.5
 
Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide Sito
 
Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)
 
Docker vs Virtualizzazioni
Docker vs VirtualizzazioniDocker vs Virtualizzazioni
Docker vs Virtualizzazioni
 
SPRING - MAVEN - REST API (ITA - Luglio 2017)
SPRING - MAVEN - REST API (ITA - Luglio 2017)SPRING - MAVEN - REST API (ITA - Luglio 2017)
SPRING - MAVEN - REST API (ITA - Luglio 2017)
 
Spring - Ecosistema
Spring - EcosistemaSpring - Ecosistema
Spring - Ecosistema
 
Sql Injection: attacchi e rimedi
Sql Injection: attacchi e rimediSql Injection: attacchi e rimedi
Sql Injection: attacchi e rimedi
 
Presentazione CERT-CHECK
Presentazione CERT-CHECKPresentazione CERT-CHECK
Presentazione CERT-CHECK
 
Tesi Discussione
Tesi DiscussioneTesi Discussione
Tesi Discussione
 
Idiomatic Domain Driven Design
Idiomatic Domain Driven DesignIdiomatic Domain Driven Design
Idiomatic Domain Driven Design
 
Introduzione al java
Introduzione al javaIntroduzione al java
Introduzione al java
 
Acadevmy - Angular Overview
Acadevmy - Angular OverviewAcadevmy - Angular Overview
Acadevmy - Angular Overview
 
MVC2: non solo tecnologia
MVC2: non solo tecnologiaMVC2: non solo tecnologia
MVC2: non solo tecnologia
 
Presentazione review it_20min
Presentazione review it_20minPresentazione review it_20min
Presentazione review it_20min
 
Dependency injection questa sconosciuta
Dependency injection questa sconosciutaDependency injection questa sconosciuta
Dependency injection questa sconosciuta
 
Migliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsMigliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.js
 
WhyMCA12 - Android Tools e la gestione di progetti complessi
WhyMCA12 - Android Tools e la gestione di progetti complessiWhyMCA12 - Android Tools e la gestione di progetti complessi
WhyMCA12 - Android Tools e la gestione di progetti complessi
 
SCBCD 1. generic ejb
SCBCD 1. generic ejbSCBCD 1. generic ejb
SCBCD 1. generic ejb
 
Sistemi Context-aware: Esercitazione 3
Sistemi Context-aware: Esercitazione 3Sistemi Context-aware: Esercitazione 3
Sistemi Context-aware: Esercitazione 3
 

Design Pattern Architetturali - Dependency Injection

  • 1. DEPENDENCY INJECTION INGEGNERIA DEL SOFTWARE Università degli Studi di Padova Dipartimento di Matematica Corso di Laurea in Informatica, A.A. 2015 – 2016 rcardin@math.unipd.it
  • 2. Ingegneria del software mod. A DEPENDENCY INJECTION 2Riccardo Cardin Architetturali Dependency injection, Model view controller
  • 3. Ingegneria del software mod. A INTRODUZIONE E CONTESTO  Scopo  Separazione del comportamento di una componente dalla risoluzione delle sue dipendenze  Motivazione  Collegare due componenti in modo esplicito ne aumenta l’accoppiamento  Progettazione unit-test difficoltosa  Riutilizzo scarso della componente  Scarsa manutenibilità  Le dipendenze vanno minimizzate!!! 3Riccardo Cardin
  • 4. Ingegneria del software mod. A PROBLEMA  Esempio naive 4Riccardo Cardin MovieLister nasconde le proprie dipendenze in un metodo.
  • 5. Ingegneria del software mod. A PROBLEMA  Utilizzo di classi factory  Utilizza metodi statici nel recupero di istanze concrete ad interfacce  Si può fare di meglio... 5Riccardo Cardin
  • 6. Ingegneria del software mod. A STRUTTURA  Inversion of Control  Il ciclo di vita degli oggetti è gestito da una entità esterna (container)  Tutti i framework moderni implementano IoC  Dependency Injection con IoC  Le dipendenze sono “iniettate” dal container  La componente dichiara solo le sue dipendenze  Minimizzazione del livello di accoppiamento  Diversi tipi di injection  Constructor injection  Setter injection 6Riccardo Cardin
  • 7. Ingegneria del software mod. A STRUTTURA  Dependency Injection con IoC  Assembler risolve le dipendenze delle componenti  Il ciclo di vita degli oggetti è deciso dal container  Configurazione: meta-linguaggio (XML) o programmatica  Cambio di movie finder  Cambio di configurazione 7Riccardo Cardin
  • 8. Ingegneria del software mod. A SOLUZIONE  Constructor injection  Dipendenze dichiarate come parametri del costruttore  Vantaggi  Permette di costruire oggetti validi sin dalla loro istanziazione  Favorisce la costruzione di oggetti immutabili  Svantaggi  Telescoping  A volte è difficile comprendere il significato dei parametri 8Riccardo Cardin public class MovieLister { private MovieFinder finder; public MovieLister(MovieFinder finder) { // Dichiarazioe dip. this.finder = finder; } // ... }
  • 9. Ingegneria del software mod. A SOLUZIONE  Setter injection  Dipendenze dichiarate come metodi setter  Vantaggi  Individuazione precisa delle dipendenze e dei loro nomi  Lavora meglio con le gerarchie di classi  Svantaggi  La componente è costruita per passi  Non è abilitante all’immutabilità 9Riccardo Cardin public class MovieLister { private MovieFinder finder; public void setFinder(MovieFinder finder) { this.finder = finder; } // ... }
  • 10. Ingegneria del software mod. A GOOGLE GUICE  Lightweight DI framework  Class injection (@Inject – JSR-330)  Configurazione Java estendendo AbstractModule 10Riccardo Cardin public class MovieModule extends AbstractModule { @Override protected void configure() { // Istruisce il container di come risolvere la dipendenza bind(MovieFinder.class).to(ColonMovieFinder.class); } } public class MovieLister { // L’annotazione istruisce il container di risolvere // automaticamente le dipendenze dichiarate @Inject public MovieLister(MovieFinder finder) { this.finder = finder; } // ... }
  • 11. Ingegneria del software mod. A GOOGLE GUICE  Lightweight DI framework  Method (setter) injection  Field injection 11Riccardo Cardin public class MovieLister { // L’annotazione istruisce il container di risolvere // automaticamente le dipendenze dichiarate @Inject public setFinder(MovieFinder finder) { this.finder = finder; } // ... } public class MovieLister { // Risolta automaticamente dall’injector. Piu’ conciso ma // meno verificabile @Inject MovieFinder finder; }
  • 12. Ingegneria del software mod. A GOOGLE GUICE  Lightweight DI framework  Cointainer è una struttura Map<Class<?>, Object>  Non è possibile avere due oggetti dello stesso tipo  È possibile utilizzare qualificatori ulteriori per questo caso  Si integra con AOP, Servlet spec., DAO, ...  @Named, @Singleton, @SessionScoperd, @RequestScoped... 12Riccardo Cardin public static void main(String[] args) { // Guice.createInjector() takes your Modules, and returns a new // Injector instance. Most applications will call this method // exactly once, in their main() method. Injector injector = Guice.createInjector(new MovieModule()); // Now that we've got the injector, we can build objects. MovieLister lister = injector.getInstance(MovieLister.class); }
  • 13. Ingegneria del software mod. A SPRING  Lightweight  Non è intrusivo, gli oggetti sviluppati non dipendono da classi del framework  Framework/Container  La configurazione utilizza XML, o annotazioni, o Java  Lo sviluppatore può concentrarsi sulla logica di business  Cointainer è una struttura Map<String, Object>  Utilizza semplici POJO: Bean  Supporta sia constructor, che setter injection  JEE replacement  MVC, Front controller, DI, AOP, JDBC Template, Security ... 13Riccardo Cardin “Spring is a «lightweight» inversion of control and aspect oriented container framework”
  • 14. Ingegneria del software mod. A SPRING  Configurazione XML  org.springframework.beans.factory.BeanFactory  Implementazione del pattern factory, costruisce e risolve le dipendenze  org.springframework.context.ApplicationContext  Costruita sulla bean factory, fornisce ulteriori funzionalità  AOP, transazionalità, ... 14Riccardo Cardin ApplicationContext ctx = new ClassPathXmlApplicationContext( "com/springinaction/springidol/filename.xml"); // ... MovieLister ml = (MovieLister) ctx.getBean("movieLister");
  • 15. Ingegneria del software mod. A SPRING  Configurazione XML  Dependency injection attraverso proprietà  Utilizzo metodi setter e getter 15Riccardo Cardin <?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="movieLister" class=“MovieLister"> <!-- La classe ha come proprieta’ finder... --> <property name="finder" ref="movieFinder" /> </bean> <bean id=“movieFinder" class="ColonMovieFinder"> <property name="file" value="movies.csv“ /> </bean> </beans>
  • 16. Ingegneria del software mod. A SPRING  Configurazione XML  Dependency injection attraverso costruttori  Spring risolve automaticamente la scelta del costruttore  Oppure factory methods, init,destroy methods... 16Riccardo Cardin <?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="movieLister" class=“MovieLister"> <constructor-arg ref="movieFinder"/> </bean > <bean id=“movieFinder" class="ColonMovieFinder"> <constructor-arg value=“movies.csv"/> </bean> </beans>
  • 17. Ingegneria del software mod. A SPRING  Configurazione Java  @Configuration: dichiara una classe configurazione  @Bean: dichiara un bean 17Riccardo Cardin @Configuration public class MovieConfig { @Bean public MovieLister lister(){ return new MovieLister( finder() ); } @Bean public MovieFinder finder(){ return new ColonMovieFinder("movies.csv"); } } ApplicationContext ctx = new AnnotationConfigApplicationContext(MovieConfig .class); bean id Constructor injection
  • 18. Ingegneria del software mod. A SPRING  Wiring utilizzando annotazioni  Permette una gestione migliore della configurazione in progetti grandi  Introduce una dipendenza da framework esterni  @Autowired  @Inject, annotazione JSR-330  @Resource, annotazione JSR-250 18Riccardo Cardin <?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/> <context:component-scan base-package="org.example"/> [...]
  • 19. Ingegneria del software mod. A SPRING  Wiring utilizzando annotazioni  @Inject/@Autowired  Ricerca per tipo il bean della proprietà e lo usa come id  Si utilizza su costruttori, proprietà, ...  Il bean non deve essere ambiguo  Disambiguazione tramite @Named per l’ID  Autodiscovery  @Component, @Controller, @Service, ... 19Riccardo Cardin @Inject private Instrument instrument; @Inject @Named("guitar") // Fornisce nome differente dal tipo private Instrument instrument2;
  • 20. Ingegneria del software mod. A JAVASCRIPT  Dependency injection in Javascript  Container è una mappa [string, function]  Linguaggio non tipizzato staticamente  Non ha interfacce esplicite  JS è strutturato a moduli (module pattern)  Injection di oggetti o interi moduli  Esistono diverse librerie (API) per la DI  RequireJS/AMD - http://requirejs.org/  Inject.js - http://www.injectjs.com/  AngularJS (framework) - https://angularjs.org/ 20Riccardo Cardin
  • 21. Ingegneria del software mod. A ANGULARJS  Javascript framework  Client-side  Model-View-Whatever  MVC per alcuni aspetti (controller)…  …MVVM per altri (two-way data binding)  Utilizza HTML come linguaggio di templating  Non richiede operazioni di DOM refresh  Controlla attivamente le azioni utente, eventi del browser  Dependence injection  Fornisce ottimi strumenti di test 21Riccardo Cardin
  • 22. Ingegneria del software mod. A ANGULARJS  Dependency Injection  $provide: risolve le dipendenze fra le componenti  Viene invocato direttamente da Angular al bootstrap 22Riccardo Cardin // Provide the wiring information in a module angular.module('myModule', []). // Teach the injector how to build a 'greeter' // Notice that greeter itself is dependent on '$window' factory('greeter', function($window) { // This is a factory function, and is responsible for // creating the 'greet' service. return { greet: function(text) { $window.alert(text); } }; }); // Request any dependency from the $injector angular.injector(['myModule', 'ng']).get('greeter'); "Ricetta" di come costruire greeter Ritorna il servizio $provide
  • 23. Ingegneria del software mod. A ANGULARJS  Dependency Injection 23Riccardo Cardin
  • 24. Ingegneria del software mod. A ANGULARJS  Dependency Injection  Factory methods: costruiscono le componenti  Utilizzano recipe (ricette) 24Riccardo Cardin angular.module('myModule', []). config(['depProvider', function(depProvider){ //... }]). factory('serviceId', ['depService', function(depService) { //... }]). directive('directiveName', ['depService', function(depService) { //... }]). filter('filterName', ['depService', function(depService) { //... }]). run(['depService', function(depService) { //... }]);
  • 25. Ingegneria del software mod. A SCALA  Cake Pattern  Utilizzo di una notazione dedicata (self-type annotation) e dei trait per dichiarazione delle dipendenze e loro risoluzione  Utilizzo di contenitori dedicati per risolvere le dipendenze  Divisione dei concetti di business dai dettagli tecnici 25Riccardo Cardin trait FooAble { def foo() = "I am a foo!" } class BarAble { this: FooAble => // self-type annotation def bar = "I am a bar and " + foo() } val barWithFoo = new BarAble with FooAble // mixin
  • 26. Ingegneria del software mod. A SCALA 26Riccardo Cardin // Declares a repository trait UserRepositoryComponent { val userRepository: UserRepository class UserRepository { def findAll() = Array[User]() // fake implementation def save(user: User) = "Saving a user..." // fake implementation } } // Declares a service that needs a repository trait UserServiceComponent { this: UserRepositoryComponent => val userService: UserService class UserService { def findAll() = userRepository.findAll def save(user: User) = userRepository.save(user) } } // Configuration object that binds dependencies object ComponentRegistry extends UserServiceComponent with UserRepositoryComponent { // Dependency injection val userRepository = new UserRepository val userService = new UserService }
  • 27. Ingegneria del software mod. A CONCLUSIONI  Vantaggi  Migliora la fase di testing  Isolamento delle componenti  Maggior riuso  Migliora la resilienza del codice  Manutenzione e correzioni componenti specifiche  Migliora la flessibilità  La disponibilità di più componenti simili permette di scegliere a runtime la migliore 27Riccardo Cardin Dependency injection means giving an object its own instance variables. Really. That’s it. James Shore
  • 28. Ingegneria del software mod. A RIFERIMENTI  Design Patterns, Elements of Reusable Object Oriented Software, GoF, 1995, Addison-Wesley  Inversion of Control Containers and the Dependency Injection pattern http://martinfowler.com/articles/injection.html  Google Guice – Motivation https://github.com/google/guice/wiki/Motivation  Spring vs Guice: The one critical difference that matters http://gekkio.fi/blog/2011-11-29-spring-vs-guice-the-one-critical- difference-that-matters.html  Spring – The IoC Container http://docs.spring.io/spring/docs/current/spring-framework- reference/html/beans.html 28Riccardo Cardin
  • 29. Ingegneria del software mod. A RIFERIMENTI  Angular Dependency Injection https://docs.angularjs.org/guide/di  JavaScript Dependency Injection http://merrickchristensen.com/articles/javascript-dependency- injection.html  Eat that cake! http://rcardin.github.io/design/2014/08/28/eat-that- cake.html 29Riccardo Cardin