Spring autowire列表没有合并所有可能的bean

时间:2016-02-22 21:36:03

标签: java spring spring-mvc dependency-injection autowired

我正在使用4.2.0 spring。

我创建了两个bean:

@Bean
public String sessionAttributeName() {
    return "someString";
}

@Bean
public List<String> urlsRequireAuthentication() {
    return Lists.newArrayList(
            "/auction/*"
    );
}

当我尝试自动装配这样的bean列表时:

@Bean
public FilterRegistrationBean someFilterRegistrationBean(List<String> urlsRequireAuthentication) {
...
}

不仅原始列表将按预期自动装配[&#34; / auction / *&#34;],但所有已注册的String bean将合并到一个大的列表,如[&#34; / auction / *& #34;,&#34; someString&#34;]。

我在时间中使用了这个功能并且它很有用但是对于这个特定的地方我真的只想包含urlsRequireAuthentication列表的内容。我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

直接使用该方法而不是将bean作为参数注入:

@Bean
public FilterRegistrationBean someFilterRegistrationBean() {
    List<String> urlsRequireAuthentication = urlsRequireAuthentication();
}

@Beans documentation

  

通常,@ Node方法在@Configuration类中声明。   在这种情况下,bean方法可能会引用其他的@Bean方法   同一个班直接打电话给他们。这确保了引用   bean之间是强类型和可导航的。这样所谓   &#39; bean间引用&#39;保证尊重范围和AOP   语义,就像getBean()查找一样。这些是语义   从最初的Spring JavaConfig&#39;需要的项目   CGLIB在运行时子类化每个这样的配置类。作为一个   结果,@ Configuration类和它们的工厂方法一定不能   在此模式下标记为最终或私人。例如:

<强>更新

另一种方法是使用javax @Resource注释。由于@Qualifier的这一特性,它不能正确地使用@Autowired注释:通过将注释添加到期望的字段或方法,可以从ApplicationContext提供特定类型的所有bean。那种类型的数组):

@Configuration
public class ConfigurationClass {

    @Resource(name="urlsRequireAuthentication")
    private List<String> urlsRequireAuthentication;

    @Bean
    public FilterRegistrationBean someFilterRegistrationBean() {
        urlsRequireAuthentication.size();
    }
}

答案 1 :(得分:1)

sessionAttributeNameurlsRequireAuthentication应该是配置属性而不是bean。在资源目录中创建application.properties并添加以下行authentication-urls = /auction/*, /url2/*。现在,您可以使用@Value注释访问您的媒体资源。

@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {

    @Bean
    public FilterRegistrationBean someFilterRegistrationBean(@Value("${authentication-urls}") String[] authenticationUrls) {
        ...
    }
}

如果您使用的是春季启动,则应查看externalized configuration的文档。

答案 2 :(得分:0)

使用Qualifier注释:

@Bean
public FilterRegistrationBean someFilterRegistrationBean(@Qualifier("urlsRequireAuthentication") List<String> urlsRequireAuthentication) {
    ...
}