Spring:使用@Configuration动态返回Bean

时间:2013-04-12 18:08:31

标签: java spring spring-ioc

假设您需要动态地(在运行时)获取给定类型的子类型的实例。

如何使用Spring IoC实现这一目标?

2 个答案:

答案 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();
    }
  }
}