2013-04-12 2 views
-1

Предположим, вам нужно динамически (во время выполнения) получить экземпляр подтипа данного типа.Spring: Использование @ Конфигурация для динамического возврата Bean

Как бы вы это сделали, используя Spring IoC?

+0

Вы можете сделать то же самое более декларативным способом с помощью профилей – NilsH

+0

Вы не задали вопрос. –

+0

@SotiriosDelimanolis Я должен был задать вопрос, но когда я столкнулся с решением, я решил сделать его общедоступным, а затем подумал, что вариант «Ответ на свой вопрос» - это способ сделать это. blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ "если у вас есть вопрос, что вы уже знаете ответ , если хотите, чтобы опубликовать его публично, чтобы другие (включая вас самих) могли найти его позже , это нормально, чтобы спросить и ответить на ваш собственный вопрос на соответствующем сайте Stack Exchange. (...) не просто нормально спросить и ответить ваш собственный вопрос, он явно поощряется » –

ответ

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

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(); 
    } 
    } 
} 
Смежные вопросы