2013-07-02 7 views
8

下のフレンドは私のコードです。私はSpringとの依存性注入を実行しようとしています。Springは、多くのインターフェイス実装を単独で選択していますか?

私はそのインターフェイスの2つのクラス実装を持っています。

1つのbean.xmlと1つのメインメソッドクラス。

インタフェース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); 
    } 
} 
IはコードSpringコンテナを実行する

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> 

はWriter.javaクラスのメソッドの出力を与えます。どの実装を選択するか指定していません。 SpringはWriter.javaの実装をどのように受け止めていますか?

+0

質問を投稿する前に、コードがうまく –

答えて

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

いくつかのことをすべてのSpring Beanが管理されている

  • される使用することができます - 彼らは内部の「ライブ」 「アプリケーションコンテキスト」と呼ばれるコンテナ。
  • 各アプリケーションには、そのコンテキストへのエントリポイントがあります。また、アプリケーションのコンテキストがブートストラップされ、すべてのBeanが自動割り当てされる場所もあります。 Webアプリケーションでは、これはスタートアップリスナーになることができます。

自動配線は、あるBeanのインスタンスを別の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); 
     } 
    } 
関連する問題