user1414745
user1414745

Reputation: 1317

Spring 3 Dependency Injection and interfaces

here is some code from a post here that would explain my question:

Interface:

package org.better.place

public interface SuperDuperInterface{
    public void saveWorld();
}

Implementation:

package org.better.place

import org.springframework.stereotype

public class SuperDuperClass implements SuperDuperInterface{
     public void saveWorld(){
          System.out.println("Done");
     }
}

Client:

package org.better.place

import org.springframework.beans.factory.annotation.Autowire;

public class SuperDuperService{

       private SuperDuperInterface superDuper;

       public void doIt(){
           superDuper.saveWorld();
       }

       public void setSuperDuper(SuperDuperInterface superDuper) {
         this.superDuper = superDuper;
       }
}

My question is - how can I configure the beans in the spring config? I don't want to use @Autowired and other annotations.

I guess it will be something like this:

<bean id="superService" class="org.better.place.SuperDuperService">
  <property name="superDuper" ref="superWorker"
</bean>

<bean id="superWorker" class=?????? parent=???????? >
</bean>

Upvotes: 0

Views: 3563

Answers (2)

zagyi
zagyi

Reputation: 17518

You will have to instantiate the implementing class, of course:

<bean id="superWorker" class="org.better.place.SuperDuperClass"/>

You would only need the parent attribute if you wanted to create multiple beans with common properties that you don't want to repeatedly declare, so you move it to an abstract parent bean definition that the concrete bean definitions can reference.
Assuming the SuperDuperClass has some properties:

<bean id="superWorkerPrototype" abstract="true" 
      class="org.better.place.SuperDuperClass">
    <property name="prop1" value="value1"/>
    <property name="prop2" value="value2"/>
</bean>

<bean id="superWorker1" parent="superWorkerPrototype"
      class="org.better.place.SuperDuperClass">
    <property name="prop3" value="foo"/>
</bean>

<bean id="superWorker2" parent="superWorkerPrototype"
      class="org.better.place.SuperDuperClass">
    <property name="prop3" value="bar"/>
</bean>

Which would result in both instances having the same values for prop1 and prop2, but different ones for prop3.

Upvotes: 1

sanbhat
sanbhat

Reputation: 17622

You can just give the implementation class's fully qualified name, and its not required to give parent attribute. Spring will automatically find if it can assign an instance of SuperDuperClass to the superDuper field of SuperDuperService

<bean id="superWorker" class="org.better.place.SuperDuperClass" >
</bean>

Upvotes: 0

Related Questions