2016-03-05 51 views
1

我有一個我想循環遍歷的myobjects的HashMap,並將它們中的每一個聲明爲bean。最後,我想選擇一個特定的鍵作爲@primary。Spring聲明多個bean

有沒有辦法在Spring Java Config中做到這一點?

我不能在偵聽器中這樣做,因爲上下文加載時需要這些bean。我在看工廠豆,但無法弄清楚。

任何幫助表示讚賞。

感謝 ABHI

回答

0

您可以在Java配置類的一個越來越以ApplicationContext參考創建一組豆類。例如,

@Configuration 
public class ServicesConfig { 

    @PostConstruct 
    public void onPostConstruct() { 
     Map<String, MyClass> mapOfClasses = HashMap<>(); // your HashMap of objects 
     AutowireCapableBeanFactory autowireCapableBeanFactory = context.getAutowireCapableBeanFactory(); 
     BeanDefinitionRegistry registry = (BeanDefinitionRegistry) autowireCapableBeanFactory; 

     for (Map.Entry<String, MyClass> myClassEntry : mapOfClasses.entrySet()) { 
     GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); 
     beanDefinition.setBeanClass(myClassEntry.getValue().getClass()); 
     beanDefinition.setAutowireCandidate(true); 
     registry.registerBeanDefinition(myClassEntry.getKey(), beanDefinition); 
     autowireCapableBeanFactory.autowireBeanProperties(myClassEntry, 
       AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false); 
     } 
    } 
} 

這裏MyClass是你myobject的類型和每個MyClass也可以有@Autowired註釋。在這一點上,我假設這些對象中的每一個都將被賦予它們的bean名稱HashMap的關鍵字。如果需要,這個對象可以用作其他bean的依賴關係。

同樣的事情可以通過執行BeanDefinitionRegistryPostProcessor和覆蓋postProcessBeanDefinitionRegistry來註冊您的HashMap對象。在此方法中,您將能夠使用BeanDefinitionBuilder創建BeanDefinition

AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(MyClass.class).getBeanDefinition(); 
beanDefinitionRegistry.registerBeanDefinition("key_of_this_object", beanDefinition); 

我不確定您是否可以將這些bean中的一個標記爲@Primary。但是基於這個post,你可以通過擴展DefaultListableBeanFactory來定義你自己的bean解析器,這是我沒有測試過的。作爲替代,您可以使用@Qualifier,因爲您已經知道哪個對象將成爲主要的bean。

希望這會有所幫助。

P.S如果對象是已經可以在被添加到ApplicationContext,下面的方法將這些自定義對象添加到ApplicationContext的

ConfigurableListableBeanFactory configurableListableBeanFactory = ((ConfigurableApplicationContext)context).getBeanFactory(); 
configurableListableBeanFactory.registerSingleton("key_of_this_object", myClassObject); 
+0

謝謝。當我在HashMap中有一個類的列表時,這是有效的。我的要求略有不同,我已經在HashMap中有myClass實例,我想註冊爲singleton。我最終實現了ApplicationContextAware來獲得ApplicationContext,然後註冊實例。謝謝你的幫助。 –