Overview of Dependency Injection in SpringRichard PaulKiwiplan NZ Ltd27 Mar 2009What is Dependency InjectionDependency Injection is a form of Inversion of Control.Also known as the Hollywood principle,"Don't call us, we'll call you!" MyService is given instances of ItemDAO and LabelDAO. MyService isn't responsible for looking up DAOs. Benefits of Dependency InjectionEnsures configuration and usages of services are separate. Can switch implementations by simply changing the configuration. Enhances testability as mock dependencies can be injected Dependencies are easily identified No need to read the source code to see what dependencies your code talks to.Constructor vs Setter Injection// Constructorpublic class MyService implement Service { private ItemDAO itemDAO; private LabelDAO labelDAO; public MyService(ItemDAO itemDAO, LabelDAO labelDAO) { this.itemDAO = itemDAO; this.labelDAO = labelDAO; }}// Setter public class MyService implement Service { private ItemDAO itemDAO; private LabelDAO labelDAO; public setItemDAO(ItemDAO itemDAO) { this.itemDAO = itemDAO; } public setLabelDAO(LabelDAO labelDAO) { this.labelDAO = labelDAO; }}Constructor vs Setter InjectionBoth constructor and setter injection provide:Loose couplingSeparation of configuration and usageEnhanced testability Constructor injection has a slight advantage (IMO) as it is upfront about what collaborators it requires. More details at:http://misko.hevery.com/2009/02/19/constructor-injection-vs-setter-injection/Dependency Injection in SpringThere are multiple ways of setting up the dependency configuration in spring.XMLAnnotationsJavaConfig... It is possible to mix and match definition styles. XMLGive myService access to labelDAO . <bean id="labelDAO" class="com.example.dao.MyLabelDAO"/> <!-- Constructor Injection --><bean id="myService1" class="com.example.service.MyServiceImpl"> <constructor-arg ref="labelDAO"/></bean> <!-- Setter Injection --><bean id="myService2" class="com.example.service.MyServiceImpl"> <property name="labelDAO" ref="labelDAO"/></bean>XML - Multiple FilesThe XML configuration can be split amoung multiple files. With each file containing configuration for different areas.applicationContext.xmlcontrollers.xmldao.xml...Annotations - ExampleYou can by-pass some of the XML configuration by using Spring's annotation support. @Service public class MyServiceImpl implement MyService { private ItemDAO itemDAO; private LabelDAO labelDAO; @Autowired public MyService(ItemDAO itemDAO, LabelDAO labelDAO) { this.itemDAO = itemDAO; this.labelDAO = labelDAO; }} @Repository public class MyItemDAO implements ItemDAO { // ... }Annotations - ListingThere are many available annotation for wiring: @Autowired@Required@Qualifier("xxx")@PostConstruct/@PreDestroy@Resource - JSR-250 @Component@Service@Respository@Controllerhttp://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config
Add New Comment