Spring之動態(tài)注冊bean的實現(xiàn)方法
Spring之動態(tài)注冊bean
什么場景下,需要主動向Spring容器注冊bean呢?
如我之前做個的一個支持掃表的基礎(chǔ)平臺,使用者只需要添加基礎(chǔ)配置 + Groovy任務(wù),就可以丟到這個平臺上面來運行了,而這個基礎(chǔ)平臺是一直都在運行的,所以在新來任務(wù)時,最直觀需要注冊的就是 DataSource 數(shù)據(jù)源這個bean了,那么可以怎么玩?
I. 主動注冊Bean支持
借助BeanDefinition來實現(xiàn)bean的定義,從最終的使用來看,代碼比較少,幾行而已
public <T> T registerBean(String name, Class<T> clazz, Object... args) {
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
if (args.length > 0) {
for (Object arg : args) {
beanDefinitionBuilder.addConstructorArgValue(arg);
}
}
BeanDefinition beanDefinition = beanDefinitionBuilder.getRawBeanDefinition();
BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) applicationContext.getBeanFactory();
beanFactory.registerBeanDefinition(name, beanDefinition);
return applicationContext.getBean(name, clazz);
}
測試如下
import com.github.hui.story.quickstory.server.VisitService;
import lombok.ToString;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;
@Component
public class BeanHolder {
private final ConfigurableApplicationContext applicationContext;
public BeanHolder(ConfigurableApplicationContext applicationContext) {
this.applicationContext = applicationContext;
initSer();
}
public void initSer() {
InrSer ser = registerBean("test", InrSer.class);
ser.name = "一灰";
ser.uid = 22;
System.out.println(ser);
InrSer ser2 = registerBean("test2", InrSer.class, "一灰灰Blog", 20);
System.out.println(ser2);
}
@ToString
public static class InrSer {
private String name;
private Integer uid;
@Autowired
private VisitService visitService;
public InrSer() {
}
public InrSer(String name, Integer uid) {
this.name = name;
this.uid = uid;
}
}
private <T> T registerBean(String name, Class<T> clazz, Object... args) {
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
if (args.length > 0) {
for (Object arg : args) {
beanDefinitionBuilder.addConstructorArgValue(arg);
}
}
BeanDefinition beanDefinition = beanDefinitionBuilder.getRawBeanDefinition();
BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) applicationContext.getBeanFactory();
beanFactory.registerBeanDefinition(name, beanDefinition);
return applicationContext.getBean(name, clazz);
}
}
輸出如下

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
如何使用intellij IDEA搭建Spring Boot項目
這篇文章主要介紹了如何使用intellij IDEA搭建Spring Boot項目,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07
java調(diào)用ffmpeg實現(xiàn)轉(zhuǎn)換視頻
這篇文章主要為大家詳細介紹了java調(diào)用ffmpeg實現(xiàn)轉(zhuǎn)換視頻功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12
JAVA核心知識之ConcurrentHashMap源碼分析
這篇文章主要介紹了JAVA核心知識之ConcurrentHashMap源碼分析,想了解ConcurrentHashMap的同學一定要看啊2021-04-04
Java concurrency之AtomicLong原子類_動力節(jié)點Java學院整理
AtomicLong是作用是對長整形進行原子操作。下面通過本文給大家介紹Java concurrency之AtomicLong原子類的相關(guān)知識,感興趣的朋友一起看看吧2017-06-06

