2012-11-27 109 views
1

我已經下載了一個Spring註釋示例,但是我不能看到它是如何選擇注入哪個類的,繼承人的代碼和配置。 首先一對夫婦的IWriter接口(未顯示)Spring註釋如何選擇類注入?

package writers; 
import org.springframework.stereotype.Service; 

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


package writers; 
import org.springframework.stereotype.Service; 

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

package testbean; 

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

import writers.IWriter; 

    @Service 
    public class SpringBeanWithDI{ 
     private IWriter writer; 

     @Autowired 
     public void setWriter(IWriter writer) { 
      this.writer = writer; 
     } 

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

測試bean的實現: -

package main; 

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

import testbean.SpringBeanWithDI; 

public class TestBean { 
    public static void main(String[] args) { 
     ApplicationContext context = new ClassPathXmlApplicationContext("META-INF/beans.xml"); 
     BeanFactory factory = context; 
     SpringBeanWithDI test = (SpringBeanWithDI) factory.getBean("springBeanWithDI"); 
     test.run(); 
    } 
} 

和beans.xml的文件: -

<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="testbean" /> 
    <context:component-scan base-package="Writers" /> 

</beans> 

一切都非常簡單但爲什麼它總是注入'Writer'實現?

回答

0

從documenation我發現這一點: -

「。對於一個備用的比賽,該bean的名稱被視爲默認限定值,這意味着該豆可以用ID來定義的‘主’,而不是嵌套的限定符元素,導致相同的匹配結果

但是,請注意,雖然這可以用於通過名稱引用特定的bean,但@Autowired基本上是可選的語義限定符的類型驅動注入。值,即使在使用bean名稱後備時,也始終在該類型匹配集合內縮小語義;它們不會在語義上表示對唯一bean id的引用。「 所以在我的例子中,字段'writer'用於找到一個名爲'Writer'的類。

私人IWriter作家;

聰明! (也許太聰明瞭!)