Предположим, вам нужно динамически (во время выполнения) получить экземпляр подтипа данного типа.Spring: Использование @ Конфигурация для динамического возврата Bean
Как бы вы это сделали, используя Spring IoC?
Предположим, вам нужно динамически (во время выполнения) получить экземпляр подтипа данного типа.Spring: Использование @ Конфигурация для динамического возврата Bean
Как бы вы это сделали, используя 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
. Дополнительная информация в JavaDoc for Profile
Я нашел следующее, это простой способ сделать это.
@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();
}
}
}
Вы можете сделать то же самое более декларативным способом с помощью профилей – NilsH
Вы не задали вопрос. –
@SotiriosDelimanolis Я должен был задать вопрос, но когда я столкнулся с решением, я решил сделать его общедоступным, а затем подумал, что вариант «Ответ на свой вопрос» - это способ сделать это. blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ "если у вас есть вопрос, что вы уже знаете ответ , если хотите, чтобы опубликовать его публично, чтобы другие (включая вас самих) могли найти его позже , это нормально, чтобы спросить и ответить на ваш собственный вопрос на соответствующем сайте Stack Exchange. (...) не просто нормально спросить и ответить ваш собственный вопрос, он явно поощряется » –