IoC Dependency Injection /Martin Fowler / Java Inversion of Control IoC Dependency Injection Service Locator Java J2EE open source J2EE J2EE web PicoContainer Spring Java Java OO.NET service component JAR DLL web service RPC socket
class MovieLister... public Movie[] moviesdirectedby(string arg) { List allmovies = finder.findall(); for (Iterator it = allmovies.iterator(); it.hasnext();) { Movie movie = (Movie) it.next(); if (!movie.getdirector().equals(arg)) it.remove(); return (Movie[]) allmovies.toarray(new Movie[allMovies.size()]); moviesdirectedby finder finder finder MovieLister finder moviesdirectedby finder findall finder public interface MovieFinder { List findall(); MovieFinder MovieLister class MovieLister... private MovieFinder finder; public MovieLister() { finder = new ColonDelimitedMovieFinder("movies1.txt");
movie1.txt SQL XML web service MovieFinder moviesdirectedby MovieFinder 1 MovieLister MovieFinder MovieLister MovieFinder Patterns of Enterprise Application Architecture plugin MovieFinder MovieLister MovieFinder MovieLister Inversion of Control
UI MovieLister MovieFinder MovieFinder IoC Dependency Injection Dependency Injection Service Locator Dependency Injection Service Locator Dependency Injection MovieFinder MovieLister 2 Constructor Injection Setter Injection Interface Injection IoC type 1 IoC type 2 type 3 IoC
PicoContainer ThoughtWorks PicoContainer PicoContainer MovieFinder MovieLister MovieLister class MovieLister... public MovieLister(MovieFinder finder) { this.finder = finder; MovieFinder PicoContainer class ColonMovieFinder... public ColonMovieFinder(String filename) { this.filename = filename; PicoContainer MovieFinder private MutablePicoContainer configurecontainer() { MutablePicoContainer pico = new DefaultPicoContainer(); Parameter[] finderparams = {new ConstantParameter("movies1.txt"); pico.registercomponentimplementation(moviefinder.class, ColonMovieFinder.class, finderparams); pico.registercomponentimplementation(movielister.class); return pico; MovieLister PicoContainer NanoContainer XML NanoContainer XML PicoContainer public void testwithpico() { MutablePicoContainer pico = configurecontainer(); MovieLister lister = (MovieLister) pico.getcomponentinstance(movielister.class); Movie[] movies = lister.moviesdirectedby("sergio Leone");
assertequals("once Upon a Time in the West", movies[0].gettitle()); PicoContainer Spring Java web JDBC PicoContainer MovieLister MovieFinder class MovieLister... private MovieFinder finder; public void setfinder(moviefinder finder) { this.finder = finder; MovieFinder String class ColonMovieFinder... public void setfilename(string filename) { this.filename = filename; Spring XML XML <beans> <bean id="movielister" class="spring.movielister"> <property name="finder"> <ref local="moviefinder"/> </property> </bean> <bean id="moviefinder" class="spring.colonmoviefinder"> <property name="filename"> <value>movies1.txt</value> </property> </bean> </beans> public void testwithspring() throws Exception { ApplicationContext ctx = new
FileSystemXmlApplicationContext("spring.xml"); MovieLister lister = (MovieLister) ctx.getbean("movielister"); Movie[] movies = lister.moviesdirectedby("sergio Leone"); assertequals("once Upon a Time in the West", movies[0].gettitle()); Avalon MovieFinder public interface InjectFinder { void injectfinder(moviefinder finder); MovieFinder MovieFinder MovieLister class MovieLister implements InjectFinder... public void injectfinder(moviefinder finder) { this.finder = finder; MovieFinder public interface InjectFilename { void injectfilename (String filename); class ColonMovieFinder implements MovieFinder, InjectFilename... public void injectfilename(string filename) { this.filename = filename; MovieLister lister class IfaceTester... private MovieLister lister; private void configurelister() { ColonMovieFinder finder = new ColonMovieFinder(); finder.injectfilename("movies1.txt"); lister = new MovieLister(); lister.injectfinder(finder);
class IfaceTester... public void testiface() { configurelister(); Movie[] movies = lister.moviesdirectedby("sergio Leone"); assertequals("once Upon a Time in the West", movies[0].gettitle()); Service Locator MovieLister MovieFinder MovieLister MovieFinder Dependency Injection Service Locator Service Locator MovieFinder MovieLister 3 ServiceLocator Singleton MovieLister ServiceLocator MovieFinder class MovieLister... MovieFinder finder = ServiceLocator.movieFinder(); class ServiceLocator...
public static MovieFinder moviefinder() { return soleinstance.moviefinder; private static ServiceLocator soleinstance; private MovieFinder moviefinder; class Tester... private void configure() { ServiceLocator.load(new ServiceLocator(new ColonMovieFinder("movies1.txt"))); class ServiceLocator... public static void load(servicelocator arg) { soleinstance = arg; public ServiceLocator(MovieFinder moviefinder) { this.moviefinder = moviefinder; class Tester... public void testsimple() { configure(); MovieLister lister = new MovieLister(); Movie[] movies = lister.moviesdirectedby("sergio Leone"); assertequals("once Upon a Time in the West", movies[0].gettitle()); ServiceLocator ServiceLocator ServiceLocator ServiceLocator ServiceLocator Singleton Singleton
MovieLister ServiceLocator MovieLister ServiceLocator MovieLister ServiceLocator MovieLister MovieFinder public interface MovieFinderLocator { public MovieFinder moviefinder(); MovieFinder MovieFinderLocator locator = ServiceLocator.locator(); MovieFinder finder = locator.moviefinder(); public static ServiceLocator locator() { return soleinstance; public MovieFinder moviefinder() { return moviefinder; private static ServiceLocator soleinstance; private MovieFinder moviefinder; ServiceLocator ServiceLocator ServiceLocator map ServiceLocator class ServiceLocator... private static ServiceLocator soleinstance; public static void load(servicelocator arg) { soleinstance = arg; private Map services = new HashMap(); public static Object getservice(string key){ return soleinstance.services.get(key); public void loadservice (String key, Object service) {
services.put(key, service); class Tester... private void configure() { ServiceLocator locator = new ServiceLocator(); locator.loadservice("moviefinder", new ColonMovieFinder("movies1.txt")); ServiceLocator.load(locator); class MovieLister... MovieFinder finder = (MovieFinder) ServiceLocator.getService("MovieFinder"); Dependency Injection Service Locator Avalon Avalon Berin Loritsch Avalon public class MyMovieLister implements MovieLister, Serviceable { private MovieFinder finder; public void service( ServiceManager manager ) { throws ServiceException finder = (MovieFinder)manager.lookup("finder"); service ServiceManager MyMovieLister ServiceManager MyMovieLister ServiceManager MovieFinder Dependency Injection Service
Locator Service Locator Dependency Injection Service Locator Dependency Injection Service Locator Service Locator Service Locator Dependency Injection Dependency Injection Service Locator IDE MovieLister Dependency Injection MovieLister API Dependency Injection Dependency Injection Dependency Injection Dependency Injection Service Locator
Dependency Injection EJB - plugin Test Driven Development TDD Service Locator Kent Beck Smalltalk Best Practice Patterns Constructor Method Constructor Parameter Method initfoo Factory Method Factory Method
Dependecy Injection XML XML XML builder Java
Service Locator Dependency Injection Dependency Injection Service Locator aspect oriented PicoContainer http://www.picocontainer.org Spring http://www.springframework.org Dependency Injection Service Locator Service Locator Dependency Injection Dependency Injection Service Locator Dependency Injection Rod Johnson Paul Hammant Joe Walnes Aslak Hellesoy Jon Tirsen Bill Caputo
Berin Loritsch Hamilton Verissimo de Oliveira Avalon