Rick has posted 25 posts at DZone. You can read more from them at their website. View Full User Profile

Spring Dependency Injection - An Introductory Tutorial

11.11.2008
| 187457 views |
  • submit to reddit


Configuring objects

In addition to injecting dependencies, Spring allows you to configure objects with primitive and basic types. Let's say that the SoapAtmTransport sometimes has to work in areas where the connection is not so great, so you decide to add a retries property to the SoapAtmTransport as follows:

SoapAtmTransport with retries

public class SoapAtmTransport implements ATMTransport {
        
        private int retries=3;

        public SoapAtmTransport() {
        }

        public SoapAtmTransport(int retries) {
                this.retries = retries;
        }

        public void setRetries(int retries) {
                this.retries = retries;
        }

        public void communicateWithBank(byte[] datapacket) {
                System.out.printf("SOAP Transport retries %d: %s \n", retries, new String(datapacket));
        }

}

Notice that you can pass the retries to the constructor or call the setter method with the number or retries as follows:

Injecting the number of retries with the setter method

        <bean id="soapTransport" class="com.arcmind.springquickstart.SoapAtmTransport">
                <property name="retries" value="5"/>
        </bean>


Injecting the number of retires with a constructor arg

        <bean id="soapTransport" class="com.arcmind.springquickstart.SoapAtmTransport">
                <constructor-arg value="6"/>
        </bean>

 

       
Figure 6 illustrates configuring retries using setter method injection. 

 


Figure 7 illustrates configuring retries using constructor arguments. 


 
Since this type of configuration is so common, Spring has a shortcut to simplify property value injection as follows:

Using p namespace in an applicationContext.xml file

<?xml version="1.0" encoding="UTF-8"?>
<beans 
        xmlns="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:p="http://www.springframework.org/schema/p" 
        xsi:schemaLocation="
                http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

        
        <bean id="soapTransport" class="com.arcmind.springquickstart.SoapAtmTransport" p:retries="7"/>
        
        <bean id="atm" class="com.arcmind.springquickstart.AutomatedTellerMachineImpl">
                <constructor-arg index="0" ref="soapTransport" />
        </bean>

</beans>

Notice the use of p:retries="7" is much less verbose than the previous example that used the property tag to set the value. If you are using the Spring IDE plugin for Eclipse, you will get code completion for the p:property-name-syntax. Figure 8 illustrates configuring retries using the shortcut notation added in Spring 2.x. 

 


Spring allows you to configure all primitive types (int, byte, long, etc.), as well as wrapper objects (Integer, Byte, Long, etc.), and many basic types (String, URL, Class, File, etc.).



About the author

Rick Hightower is CTO of Mammatus and is an expert on Java and Cloud Computing. Rick is invovled in Java CDI advocacy and Java EE. CDI Implementations - Resin Candi - Seam Weld - Apache OpenWebBeans

Published at DZone with permission of its author, Rick Hightower.

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)

Comments

Murphree Mukada replied on Thu, 2008/11/27 - 7:48am

Brilliant! Concise and clear. Thanks a million Rick.

Rick Hightower replied on Sun, 2008/11/30 - 6:33pm in response to: George Jiang

The Spring AOP article has been written and is waiting to be copy edited.

Viraf Karai replied on Sat, 2009/02/21 - 3:14pm

Well written, but it might still be a tad difficult for newcomers to Spring to grasp fully.

I'm not in the anti-XML camp, so I don't feel very comfortable with this new trend towards using annotations willy-nilly. In fact I feel that it diminishes the ability to view the big picture. I do like the new 'context' and 'p' namespaces. Some of the annotations like @Required and @Transactional have been well-thought out by the SpringSource folks and I commend them for that.

Just one final note and it's not meant to be a sales pitch - IntelliJ IDEA 8.x has brilliant Spring support and provides really good code completion as well as linking Java interfaces with Spring bean definitions. I've been using it for about 8 months now and am continually amazed at it's capabilities.

Looking forward to your future articles - especially AOP - a great passion of mine.

Rick Reumann replied on Tue, 2009/09/01 - 2:54pm

I'm really curious though, how often do people have that many different implementations at application startup time? I've been using Spring and Guice for a while now and often when I've completed my app I look back and wonder "ok, what did I really gain here having my concrete implemenations defined in an xml or single Java file?"

 I don't care much about using Mock objects in Testing either, but if I did, I could definitely see the advantage of DI there. 

 Of course I like containers doing some DI for me, like the EJB3 DI stuff etc, but in your typical CRUD app I simply find that I've added one more layer of abstraction that isn't needed. In the early days I was also always a purist and coded everything to an Interface - but in real life, how often, for example, are you swapping out Service class or DAO implemnations? 

 I feel like a heretic and wondering if I'm alone :)

 

Pradeep Kumar replied on Wed, 2012/09/19 - 12:59pm

Very nice, no words thanks much..!!

But please add spring MVC 3.0 also.

Krishna Pokala replied on Tue, 2012/10/02 - 9:08am

Superb intro to DI. Thanks Rick

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.