【问题标题】:Spring autowire list without merging all possible beans春季自动装配列表而不合并所有可能的bean
【发布时间】:2016-02-22 21:36:02
【问题描述】:

我使用的是 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 beans 都将合并到一个大列表中,例如 ["/auction/*", "someString"]。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    @Beans documentation

    通常,@Bean 方法在 @Configuration 类中声明。 在这种情况下,bean 方法可能会引用其他 @Bean 方法 通过直接调用他们相同的类。这确保了参考 bean 之间是强类型和可导航的。这种所谓的 'inter-bean references' 保证尊重范围和 AOP 语义,就像 getBean() 查找一样。这些是语义 从需要的原始“Spring JavaConfig”项目中知道 每个此类配置类在运行时的 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();
        }
    }
    

    【讨论】:

    • 这可行,但遗憾的是在我的情况下 someFilterRegistrationBean 是在不同的配置中创建的(在不同的子模块中的不同包中)。 :(
    • 无论如何我都会给你+1,因为这在很多情况下都是一个很好的例子。
    【解决方案2】:

    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) {
            ...
        }
    }
    

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

    【讨论】:

      【解决方案3】:

      使用Qualifier注解:

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

      【讨论】:

      • 我试过了,但它不适用于@Autowired。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 2019-08-02
      • 2017-12-13
      • 2017-12-09
      • 2013-04-26
      • 2015-12-11
      • 1970-01-01
      相关资源
      最近更新 更多