假设您需要动态(在运行时)获取给定类型的子类型的实例。
您将如何使用 Spring IoC 实现这一目标?
您还可以使用@Profile
以更具声明性的方式实现类似的功能。
@Configuration
@Profile("default")
public class TypeAConfig {
@Bean
public Type getType() {
return new TypeA();
}
}
@Configuration
@Profile("otherProfile")
public class TypeBConfig() {
@Bean
public Type getType() {
return new TypeB();
}
}
@Configuration
public class SysConfig {
@Autowired
Type type;
@Bean Type getType() {
return type;
}
}
然后,您可以通过指定 Spring 应该激活的配置文件来控制要使用的实现,例如使用spring.profiles.active
系统属性。用于 Profile 的 JavaDoc中的更多信息
我发现以下是一种简单的方法。
@Component
public class SystemPreferences {
public boolean useA() {...}
}
interface Type {....}
public class TypeA implements Type {
@Autowired
Other xyz;
}
public class TypeB implements Type {...}
@Configuration
public class SysConfig {
@Autowired
SystemPreferences sysPrefs;
@Bean
public Type getType() {
if (sysPrefs.useA()) {
//Even though we are using *new*, Spring will autowire A's xyz instance variable
return new TypeA();
} else {
return new TypeB();
}
}
}