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();
}
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();
}
}
sessionAttributeName
和 urlsRequireAuthentication
应该是配置属性而不是 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) {
...
}
我正在使用 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();
}
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();
}
}
sessionAttributeName
和 urlsRequireAuthentication
应该是配置属性而不是 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) {
...
}