spring之 动态注册 bean
什么场景下,需要主动向spring容器注册bean呢?
如我之前做个的一个支持扫表的基础平台,使用者只需要添加基础配置 + groovy任务,就可以丢到这个平台上面来运行了,而这个基础平台是一直都在运行的,所以在新来任务时,最直观需要注册的就是 datasource 数据源这个bean了,那么可以怎么玩?
i. 主动注册bean支持
借助beandefinition来实现bean的定义,从最终的使用来看,代码比较少,几行而已
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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); } |
测试如下
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
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测试数据ponent;
@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); } } |
输出如下
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
原文链接:https://segmentfault测试数据/a/1190000015887070
查看更多关于Spring之动态注册bean的实现方法的详细内容...