我是DI的春天,而不使用XML。
基于配置(例如,xml / properties文件),我希望在我的上下文中创建一个特定类型的bean(确切数量由配置确定),以便它们可以自动装入类。
我会通过以下方式自动装配:@Autowired public MyClass(List<MyType> types)
我正在寻找使用@Configuration
注释的类。
所以我可以这样做:
@Configuration
public MyConfigurationClass {
@Autowired
public void configure(ApplicationContext context) {
// register stuff here
}
}
......但它没有&#34;感觉&#34;右...
什么是&#34;春天&#34;实现这个目标的方法?
编辑:
想象一下这段代码,其中To
和Ty
只是空类定义。
@Configuration
public class Config {
@Bean
public Collection<Ty> tyList() {
return new ArrayList<Ty>() {{
this.add(new Ty()); // could be any number of Ty instances.
}};
}
@Bean
public To to(Collection<Ty> tylist) {
return new To();
}
}
答案 0 :(得分:1)
如果您不需要拥有单独的限定符并且可以自动装配为List,则可以在Spring 4中执行此操作:
@Configuration
public MyConfigurationClass {
@Bean
public List<MyType> configure() {
//create your dynamical list here
}
}
但是对于Spring 3(泛型被忽略),你会更安全地使用:
@Configuration
public MyConfigurationClass {
@Bean
@Qualifier("mylist")
public List<MyType> configure() {
//create your dynamical list here
}
}
和autowire:
@Autowired public MyClass(@Qualifier("mylist") List<MyType> types)
使用此功能,您无需直接触摸ApplicationContext实例。它不被认为是非常好的做法。
编辑:
你试过这个吗?:
@Configuration
public class Config {
@Bean
@Qualifier("tylist")
public Collection<Ty> tyList() {
return new ArrayList<Ty>() {{
this.add(new Ty()); // could be any number of Ty instances.
}};
}
@Bean
public To to(@Qualifier("tylist") Collection<Ty> tylist) {
return new To();
}
}
答案 1 :(得分:0)
我不确定我是否理解正确但我相信这就是你想要的。
public interface MyStuff {
void doSomething();
}
@Scope("prototype") // 1
@Service("stuffA") // 2
public class MyStuffImpl_A implements MyStuff {
public void doSomething()
{
// do your stuff
}
}
@Scope("prototype")
@Service("stuffB")
public class MyStuffImpl_B implements MyStuff {
public void doSomething()
{
// do your stuff the B way ;)
}
}
现在你可以这样做:
public class UseTheStuff {
@Autowired
private Provider<MyStuff> stuffA; // 3
@Autowired
private Provider<MyStuff> stuffB; // 4
public void doStuffWithTheProvider(){
MyStuff stuffA.get(); // 5
MyStuff stuffB.get(); // 6
}
}