| ||||||||||||||||||||||
Resin 3.1 Documentation Examples Changes Quercus Database Amber EJB SOA/ESB IoC JMS Servlet JMX Hessian Security JAXB IoC Basic Resource Injection Periodic Task JNDI appconfig |
The Dependency Injection pattern simplifies application code, and increases configuration flexibility by deferring component configuration and assembly to the container. Resin calls setters on the configured objects to assemble the resource dependencies. Files in this tutorial
Dependency InjectionDependency injection is a term used to describe a separation between the implementation of an object and the construction of an object it depends on, and the ability for a container like Resin to resolve the dependency. Since the container instantiates and assembles the dependencies, the code is simpler and the configuration is more flexible. It's easy to substitute test implementations as the dependent resources, for example. The MovieFinder example for this tutorial comes from Martin Fowler's Dependency Injection article. More details on Resin's configuration is available at the bean-style configuration page. Configuration as Assembly LineThe Dependency Injector pattern could also be called the Assembly pattern because it resembles an assembly line making cars.
Some important points:
Because the Assembler is independent of the code, a project could change the Assembler from Spring to Resin with no code changes. So using the Assembler/Dependency Injection pattern reduces dependencies on the framework. Only the configuration changes when changing Assemblers, not the code. While testing, the test case or the harness plays the Assembler
role, simplifying the test suite and ensuring that the code under test
is the production code. A test can create a test implementation of
the Part, e.g. In some cases, the application code can provide its own
Code for the Dependency Injection patternThe only code specific to the setter-based injection pattern is the addition of a setter method for the dependent resource. In many application, that setter will already be written, so no additional code would be required. Either an interface or a class can be used for the dependent resource, depending on the application's architecture. This example uses both: the MovieListener uses a dependent MovieFinder interface, and the MovieServlet uses the dependent MovieListener class. public class MovieListener { private MovieFinder _finder; public void setMovieFinder(MovieFinder finder) { _finder = finder; } ... } Configuration<resource jndi-name="movie-finder" type="example.MovieFinderImpl"> <init> <movie director="Jackson" title="Fellowship of the Ring"/> <movie director="Jackson" title="The Two Towers"/> <movie director="Lucas" title="Star Wars"/> <movie director="Gilliam" title="Brazil"/> </init> </resource> <resource jndi-name="movie-lister" type="example.MovieLister"> <init> <movie-finder>\${jndi("movie-finder")}</movie-finder> </init> </resource> JMX as a RegistryResin can use JMX as the registry instead of JNDI. In this example, only the configuration needs to be changed. JMX uses the mbean-name instead of the jndi-name, and the jndi uses the "mbean:" schema. <resource mbean-name="example:type=MovieFinder" mbean-interface="example.MovieFinder" type="example.MovieFinderImpl"> <init> <movie director="Jackson" title="Fellowship of the Ring"/> <movie director="Jackson" title="The Two Towers"/> <movie director="Lucas" title="Star Wars"/> </init> </resource> <resource jndi-name="movie-lister" type="example.MovieLister"> <init> <movie-finder>\${jndi("mbean:example:type=MovieFinder")}</movie-finder> </init> </resource> Using JMX as the registry has some restrictions over JNDI. JMX requires an interface class. So the servlet's <movie-lister> setting can't be stored in JMX. JMX also can't support object references. All JMX getters and method values are value objects, never references. This limits the kinds of structures you can use easily with JMX. Dependency Injection for ServletsThe Dependency Injection pattern is just as useful for servlet configuration as it is for resources. This example makes the MovieLister a parameter of the servlet. The resin-web.xml will configure the servlet with the appropriate MovieLister The advantages of using dependency injection for the servlet are the same as for the resource:
<servlet servlet-name="movies" type="example.MovieServlet"> <init> <movie-lister>\${jndi("movie-lister")}</movie-lister> </init> </resource> CompatibilityFor compatibility, Servlets will generally add an
See also
|