Spring之动态注册bean的实现方法
程序员文章站
2024-02-20 12:34:10
spring之动态注册bean
什么场景下,需要主动向spring容器注册bean呢?
如我之前做个的一个支持扫表的基础平台,使用者只需要添加基础配置 + groo...
spring之动态注册bean
什么场景下,需要主动向spring容器注册bean呢?
如我之前做个的一个支持扫表的基础平台,使用者只需要添加基础配置 + groovy任务,就可以丢到这个平台上面来运行了,而这个基础平台是一直都在运行的,所以在新来任务时,最直观需要注册的就是 datasource
数据源这个bean了,那么可以怎么玩?
i. 主动注册bean支持
借助beandefinition来实现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); } }
输出如下
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
Spring之动态注册bean的实现方法
-
Spring基本用法6——协调作用域不同步的Bean 博客分类: Spring Spring作用域不同步具体类实现lookup方法
-
荐 Spring源码之容器的基本实现:通过Xml配置装载Bean
-
详解Spring中实现接口动态的解决方法
-
spring security动态配置url权限的2种实现方法
-
spring cloud 之 Feign 使用HTTP请求远程服务的实现方法
-
详解Spring中实现接口动态的解决方法
-
spring security动态配置url权限的2种实现方法
-
Spring动态注册多数据源的实现方法
-
spring cloud 之 Feign 使用HTTP请求远程服务的实现方法