假设您需要动态地(在运行时)获取给定类型的子类型的实例。
如何使用Spring IoC实现这一目标?
答案 0 :(得分:1)
您还可以使用@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
系统属性。 JavaDoc for Profile
答案 1 :(得分:0)
我发现以下是一种简单的方法。
@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();
}
}
}