2013-07-02 10 views
8

Znajomi poniżej to mój kod, próbuję uruchomić zależność Injection ze sprężynąSpring wybiera własną implementację interfejsu z wielu źródeł?

Mam interfejs, dwie klasy implementacje tego interfejsu.

Jedna klasa bean.xml i jedna główna metoda.

Interfejs IWriter.java

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

Klasa Writer.java

 package DI; 

    import org.springframework.stereotype.Service; 

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

Klasa 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); 
    } 
} 

Inna klasa

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> 

Kiedy biegnę pojemnik kod Wiosna daje wyjście metody klasy Writer.java. Nigdzie nie określiłem, którą implementację wybrać. W jaki sposób Spring podejmuje decyzję o wdrożeniu Writer.java ??

+0

Przed wysłaniem pytanie, kod shuld być dobrze sformatowane –

Odpowiedz

4

zmienić kod w następujący sposób.

Klasa 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); 
    } 
    } 

Klasa 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); 
    } 
    } 

Inna klasa

 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

kod Format przed złożeniem do lepszego zrozumienia –

+0

readablity i będę w odniesieniu do formatowania kodu. W każdym razie dzięki za odpowiedź. – user2472968

10

Gdy jest więcej niż jedna implementacja interfejsu i używasz @Autowired w tym przypadku sprężyna wiąże dowolną klasę. ale jeśli chcesz autowire konkretną implementację można użyć

@Qualifier("<implementing class name>") 

@Qualifier documentation

kilka rzeczy, które musisz wiedzieć o Wiosna jest

  • Wszystkie fasoli wiosenne są zarządzane - oni „na żywo” w środku kontener, zwany "kontekstem aplikacji".
  • Każda aplikacja ma punkt wejścia do tego kontekstu. Istnieje również miejsce, w którym kontekst aplikacji jest bootstrapowany, a wszystkie fasole - automatycznie. W aplikacjach internetowych może to być odbiornik uruchamiania.

Autowiring odbywa się poprzez umieszczenie instancji jednego komponentu bean w żądanym polu w instancji innego komponentu bean. Obie klasy powinny być komponentami bean, tzn. Powinny być zdefiniowane tak, aby istniały w kontekście aplikacji.

1

Spróbuj tego.

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); 
    } 
    } 

Klasa 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); 
    } 
    } 

Inna klasa

 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); 
     } 
    } 
Powiązane problemy