-1

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

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

4

2 回答 2

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系统属性。用于 Profile 的 JavaDoc中的更多信息

于 2013-04-12T19:08:17.503 回答
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();
    }
  }
}
于 2013-04-12T18:42:49.667 回答