Spring之动态注册bean的实现方法

网友投稿 278 2023-01-24


Spring之动态注册bean的实现方法

Spring之动态注册bean

什么场景下,需要主动向Spring容器注册bean呢?

如我之前做个的一个支持扫表的基础平台,使用者只需要添加基础配置 + Groovy任务,就可以丢到这个平台上面来运行了,而这个基础平台是一直都在运行的,所以在新来任务时,最直观需要注册的就是 DataSource 数据源这个bean了,那么可以怎么玩?

I. 主动注册Bean支持

借助BeanDefinition来实现bean的定义,从最终的使用来看,代码比较少,几行而已

public T registerBean(String name, Class 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.ToStrinhttp://g;

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 applicationConhttp://text) {

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 registerBean(String name, Class 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);

}

}

输出如下


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:下单接口自动化测试(接口自动化怎么测试)
下一篇:JavaFx UI控件与代码间的绑定方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~