我有一個我想循環遍歷的myobjects的HashMap,並將它們中的每一個聲明爲bean。最後,我想選擇一個特定的鍵作爲@primary。Spring聲明多個bean
有沒有辦法在Spring Java Config中做到這一點?
我不能在偵聽器中這樣做,因爲上下文加載時需要這些bean。我在看工廠豆,但無法弄清楚。
任何幫助表示讚賞。
感謝 ABHI
我有一個我想循環遍歷的myobjects的HashMap,並將它們中的每一個聲明爲bean。最後,我想選擇一個特定的鍵作爲@primary。Spring聲明多個bean
有沒有辦法在Spring Java Config中做到這一點?
我不能在偵聽器中這樣做,因爲上下文加載時需要這些bean。我在看工廠豆,但無法弄清楚。
任何幫助表示讚賞。
感謝 ABHI
您可以在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);
謝謝。當我在HashMap中有一個類的列表時,這是有效的。我的要求略有不同,我已經在HashMap中有myClass實例,我想註冊爲singleton。我最終實現了ApplicationContextAware來獲得ApplicationContext,然後註冊實例。謝謝你的幫助。 –