2013-07-02 5 views
8

아래의 친구가 내 코드이며, 종속성 인젝션을 Spring과 함께 실행하려고합니다.스프링이 자체적으로 많은 인터페이스 구현을 선택하고 있습니까?

저는이 인터페이스의 두 클래스 구현을 가지고 있습니다.

하나의 bean.xml과 하나의 기본 메소드 클래스.

인터페이스 IWriter.java

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

클래스 Writer.java

 package DI; 

    import org.springframework.stereotype.Service; 

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

클래스 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); 
    } 
} 

또 다른 클래스

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> 

을 내가 코드 Spring 컨테이너가 Writer.java 클래스의 메소드의 출력을 제공 실행합니다. 어느 구현을 고를 지 아무데도 지정하지 않았습니다. Spring은 Writer.java의 구현을 어떻게 선택하고 있는가 ??

+0

, 코드가 아니라 더 나은 readablity 위해 제출 및 –

답변

4

다음과 같이 코드를 변경하십시오.

클래스 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); 
    } 
    } 

클래스 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); 
    } 
    } 

또 다른 클래스

 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

형식 코드 앞에 포맷 shuld 코드 형식과 관련하여 유의하십시오. 어쨌든 답장을 보내 주셔서 감사합니다. –

+0

을 이해하는 것은 내가하겠습니다 – user2472968

10

하나 이상의 인터페이스 구현이 있고이 경우 @Autowired를 사용하면 스프링이 클래스를 바인딩합니다. 특정 구현을 autowire하기 원한다면하지만 당신은 당신이 봄에 대해 알고 있어야합니다

@Qualifier("<implementing class name>") 

@Qualifier documentation

몇 가지를 모두 봄 콩 관리

  • 되어 사용할 수 있습니다 - 그들은 내부의 "라이브" "응용 프로그램 컨텍스트"라고하는 컨테이너.
  • 각 응용 프로그램에는 해당 컨텍스트에 대한 진입 점이 있습니다. 또한 응용 프로그램 컨텍스트가 부트 스트랩되고 모든 빈 (autowired)이있는 곳이 있습니다. 웹 애플리케이션에서 이것은 시작 리스너가 될 수 있습니다.

자동 배선은 다른 bean의 인스턴스에서 원하는 필드에 하나의 bean의 인스턴스를 놓음으로써 발생합니다. 두 클래스 모두 빈이어야합니다. 즉, 응용 프로그램 컨텍스트에 존재하도록 정의되어야합니다.

1

이 하나를 시도하십시오.

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

클래스 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); 
    } 
    } 

질문을 게시하기 전에 또 다른 부류의

 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); 
     } 
    } 
관련 문제