Autowire使用" byName"忽略autowire-candidate = false配置

时间:2016-12-29 12:08:21

标签: spring dependency-injection autowired

根据Spring Framework Reference文档的this section,当bean {1}}在bean的XML定义中设置为autowire-candidate时,它会从自动装配基础结构中排除bean。该部分没有讨论此案例的任何例外情况。

false设置为autowire时,此方法有效。但是当它设置为byType时,byName配置将被忽略,并且bean仍然是自动装配的。

我的问题是:

  • 这是设计而非记录(或)
  • 是一个错误(或)
  • 我的配置中遗漏了什么?

以下是相关来源列表的列表:

MovieDataStore.java

autowire-candidate="false"

MovieDao.java

public class MovieDataStore {
    // Just some dummy class
}

spring-context.xml片段

public class MovieDao {
    private MovieDataStore movieDataStore;

    public MovieDataStore getMovieDataStore() {
        return movieDataStore;
    }

    public void setMovieDataStore(MovieDataStore movieDataStore) {
        this.movieDataStore = movieDataStore;
    }
}

测试代码

<bean id="movieDao" class="com.example.spring.MovieDao" autowire="byName"/>

<bean id="movieDataStore" class="com.example.spring.MovieDataStore" 
        autowire-candidate="false"/>

我希望它打印ClassPathXmlApplicationContext ctx; ctx = new ClassPathXmlApplicationContext("spring-context.xml"); MovieDao movieDao = ctx.getBean("movieDao", MovieDao.class); System.out.println(movieDao.getMovieDataStore()); ctx.close(); ,因为我要求自动装配的唯一依赖实际上是从自动装配中排除的。但是,上面的测试代码打印出来:

null

请注意,仅在autowire com.example.spring.MovieDataStore@22915056 的情况下才会发生这种情况。如果我自动装配byName,则会按预期打印byType

我使用的是Spring Framework 4.3.5.RELEASE和Java 7。

1 个答案:

答案 0 :(得分:0)

根据我提出的this Spring JIRA ticket,它是设计的,没有记录。

Juergen Hoeller对票的评论:

  

这是一个旧的设计决策,其中autowire-candidate =“false”仅影响基于类型的自动装配尝试,而不影响名称的直接引用...而不是autowire =“byName”。虽然后者可能有争议,但我不打算在此时改变它,因为autowire =“byName”是一个过时的机制。因此,我将此转变为文档问题。