使用 FactoryBean 進行動態 bean 例項化
為了動態決定注入哪些 bean,我們可以使用 FactoryBean
s。這些是實現工廠方法模式的類,為容器提供 bean 例項。它們被 Spring 識別並且可以透明地使用,而不需要知道 bean 來自工廠。例如:
public class ExampleFactoryBean extends AbstractFactoryBean<String> {
// This method determines the type of the bean for autowiring purposes
@Override
public Class<?> getObjectType() {
return String.class;
}
// this factory method produces the actual bean
@Override
protected String createInstance() throws Exception {
// The thing you return can be defined dynamically,
// that is read from a file, database, network or just
// simply randomly generated if you wish.
return "Something from factory";
}
}
組態:
@Configuration
public class ExampleConfig {
@Bean
public FactoryBean<String> fromFactory() {
return new ExampleFactoryBean();
}
}
得到豆子:
AbstractApplicationContext context = new AnnotationConfigApplicationContext(ExampleConfig.class);
String exampleString = (String) context.getBean("fromFactory");
要獲取實際的 FactoryBean,請在 bean 的名稱前使用&符號字首:
FactoryBean<String> bean = (FactoryBean<String>) context.getBean("&fromFactory");
請注意,你只能使用 prototype
或 singleton
範圍 - 將範圍更改為 prototype
override isSingleton
方法:
public class ExampleFactoryBean extends AbstractFactoryBean<String> {
@Override
public boolean isSingleton() {
return false;
}
// other methods omitted for readability reasons
}
請注意,作用域指的是建立的實際例項,而不是工廠 bean 本身。