Spring 不合并所有可能的 bean 的自动装配列表

Spring autowire list without merging all possible beans

我正在使用 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) {
...
}

不仅原始列表将按预期自动装配 ["/auction/*"],而且所有已注册的 String bean 都将合并到一个大列表中,如 ["/auction/*", "someString"] .

我当时使用了这个功能,它很有用,但对于这个特定的地方,我真的只想包含 urlsRequireAuthentication 列表的内容。我该怎么做?

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

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

@Beans documentation :

Typically, @Bean methods are declared within @Configuration classes. In this case, bean methods may reference other @Bean methods in the same class by calling them directly. This ensures that references between beans are strongly typed and navigable. Such so-called 'inter-bean references' are guaranteed to respect scoping and AOP semantics, just like getBean() lookups would. These are the semantics known from the original 'Spring JavaConfig' project which require CGLIB subclassing of each such configuration class at runtime. As a consequence, @Configuration classes and their factory methods must not be marked as final or private in this mode. For example:

更新

另一种方法是使用 javax @Resource 注释。由于 @Autowired 的这个特性,它不能与 @Qualifier 注释一起工作:可以通过将注释添加到需要该类型的数组):

@Configuration
public class ConfigurationClass {

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

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

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

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

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

如果您使用 spring 引导,您应该查看 externalized configuration 的文档。

使用Qualifier注释:

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