1

我已经下载了一个 Spring annotations 示例,但我看不到它如何选择注入哪个类,这里​​是代码和配置。首先是 IWriter 接口的几个实现(未显示)

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

测试豆:-

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' 实现?

4

1 回答 1

0

从文档中我发现了这个:-

“对于回退匹配,bean 名称被视为默认限定符值。这意味着 bean 可以使用 id “main”而不是嵌套限定符元素定义,从而导致相同的匹配结果。

但是,请注意,虽然这可以用来通过名称引用特定的 bean,但 @Autowired 从根本上讲是关于带有可选语义限定符的类型驱动注入。这意味着限定符值,即使在使用 bean 名称回退时,也总是在类型匹配集中具有缩小语义;它们不会在语义上表达对唯一 bean id 的引用。”因此在我的示例中,字段“writer”用于查找名为“Writer”的类。

私人 IWriter 作家;

聪明的 !(也许太聪明了!)

于 2012-11-27T14:39:03.423 回答