2013-07-02 9 views
8

Amici sotto è il mio codice, sto cercando di eseguire la dipendenza Injection with SpringSpring sta scegliendo un'implementazione dell'interfaccia tra molte, da sola?

Ho un'interfaccia, due implementazioni di classe di tale interfaccia.

Un bean.xml e una classe di metodo principale.

interfaccia IWriter.java

package DI; 
    public interface IWriter { 
    public void writer(String s); 
} 

Classe Writer.java

 package DI; 

    import org.springframework.stereotype.Service; 

    @Service 
    public class Writer implements IWriter { 
     public void writer (String s){ 
      System.out.println(s); 
     } 
    } 

Classe NiceWriter.java

package DI; 

import org.springframework.stereotype.Service; 

@Service 
public class NiceWriter implements IWriter { 
    public void writer (String s){ 
     System.out.println("The string is " + s); 
    } 
} 

Un'altra classe

package DI; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.stereotype.Service; 

@Service 
public class MySpringBeanWithDependency { 

    @Autowired 
    private IWriter writer; 

    public void run() { 
     String s = "This is my test"; 
     writer.writer(s); 
    } 
} 

Main.java

package DI; 

import org.springframework.beans.factory.BeanFactory; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

import DI.MySpringBeanWithDependency; 

public class Main { 
    public static void main(String[] args) { 
     ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 
     BeanFactory factory = context; 
     MySpringBeanWithDependency test = (MySpringBeanWithDependency) factory.getBean("mySpringBeanWithDependency"); 
     test.run(); 
    } 
} 

bean.xml

  <?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:aop="http://www.springframework.org/schema/aop" 
      xmlns:context="http://www.springframework.org/schema/context" 
      xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 

     <context:component-scan base-package="DI" /> 

     </beans> 

Quando si esegue il contenitore Codice molla fornisce l'uscita del metodo della classe Writer.java. Non ho specificato da nessuna parte quale implementazione scegliere. In che modo Spring raccoglie l'implementazione di Writer.java ??

+0

Prima di postare domanda, codice shuld essere ben formattato –

risposta

4

cambia il codice come segue.

Classe Writer.java

package DI; 

    import org.springframework.stereotype.Service; 

    @Service("writer") 
    public class Writer implements IWriter { 
    public void writer (String s){ 
     System.out.println(s); 
    } 
    } 

Classe NiceWriter.java

package DI; 

    import org.springframework.stereotype.Service; 

    @Service("niceWriter") 
    public class NiceWriter implements IWriter { 
    public void writer (String s){ 
    System.out.println("The string is " + s); 
    } 
    } 

Un'altra classe

 package DI; 

     import org.springframework.beans.factory.annotation.Autowired; 
     import org.springframework.beans.factory.annotation.Qualifier; 
     import org.springframework.stereotype.Service; 

     @Service 
     public class MySpringBeanWithDependency { 

    @Autowired 
    @Qualifier("writer")//if you need to autowire Writer service 
    private IWriter writer; 

    @Autowired 
    @Qualifier("niceWriter")//if you need to autowire NiceWriter service 
    private IWriter niceWriter 


     public void run() { 
     String s = "This is my test"; 
     writer.writer(s); 
     } 
    } 
+3

codice formato prima di presentare per una migliore leggibiltà e la comprensione –

+0

terrò in mente per quanto riguarda la formattazione del codice. Comunque grazie per la risposta. – user2472968

10

Quando c'è più di un'implementazione di interfaccia e si utilizza @Autowired in quel caso, si associa a qualsiasi classe. ma se si vuole autowire specifica implementazione quindi è possibile utilizzare

@Qualifier("<implementing class name>") 

@Qualifier documentation

alcune cose che è necessario conoscere la primavera è

  • Tutti i fagioli di primavera sono gestiti - che "vive" dentro un contenitore, chiamato "contesto dell'applicazione".
  • Ogni applicazione ha un punto di ingresso per quel contesto. Inoltre, c'è un posto in cui il contesto dell'applicazione è bootstrap e tutti i bean - autowired. Nelle applicazioni web questo può essere un ascoltatore di avvio.

L'autowiring avviene posizionando un'istanza di un bean nel campo desiderato in un'istanza di un altro bean. Entrambe le classi dovrebbero essere bean, vale a dire che dovrebbero essere definite per vivere nel contesto dell'applicazione.

1

provare questo.

Class Writer.java 

    package DI; 

    import org.springframework.stereotype.Service; 

    @Service("writer") 
    public class Writer implements IWriter { 
    public void writer (String s){ 
     System.out.println(s); 
    } 
    } 

Classe NiceWriter.java

package DI; 

    import org.springframework.stereotype.Service; 

    @Service("niceWriter") 
    public class NiceWriter implements IWriter { 
    public void writer (String s){ 
    System.out.println("The string is " + s); 
    } 
    } 

Un'altra classe

 package DI; 

     import org.springframework.beans.factory.annotation.Autowired; 
     import org.springframework.beans.factory.annotation.Qualifier; 
     import org.springframework.stereotype.Service; 

     @Service 
     public class MySpringBeanWithDependency { 

    @Autowired 
    private IWriter writer; 

    @Autowired 
    private IWriter niceWriter 


     public void run() { 
     String s = "This is my test"; 
     writer.writer(s); 
     } 
    } 
Problemi correlati