Spring运行时动态注册bean的方法
程序员文章站
2024-02-20 12:42:34
在spring运行时,动态的添加bean,dapeng框架在解析xml的字段时,使用到了动态注册,注册了一个实现了factorybean类!
定义一个没有被spring管...
在spring运行时,动态的添加bean,dapeng框架在解析xml的字段时,使用到了动态注册,注册了一个实现了factorybean类!
定义一个没有被spring管理的controller
public class usercontroller implements initializingbean{ private userservice userservice; public userservice getuserservice() { return userservice; } public void setuserservice(userservice userservice) { this.userservice = userservice; } @override public void afterpropertiesset() throws exception { system.out.println("我是动态注册的你,不是容器启动的时候注册的你"); } public string toaction(string content){ return "-->" + userservice.doservice(content); } }
需要注意的是,如果要注入userservice,需要提供它的getter和setter方法
现在启动springboot工程,显而易见这个类是不会被spring管理的,接下来我们定义一个获取spring上下文的工具类,如下
工具类
public class springcontextutil { private static applicationcontext applicationcontext; //获取上下文 public static applicationcontext getapplicationcontext() { return applicationcontext; } //设置上下文 public static void setapplicationcontext(applicationcontext applicationcontext) { springcontextutil.applicationcontext = applicationcontext; } //通过名字获取上下文中的bean public static object getbean(string name){ return applicationcontext.getbean(name); } //通过类型获取上下文中的bean public static object getbean(class<?> requiredtype){ return applicationcontext.getbean(requiredtype); } }
我们在springboot的启动类中,保存当前spring上下文,代码如下:
@springbootapplication public class helloapplication { public static void main(string[] args) { applicationcontext app = springapplication.run(helloapplication.class, args); springcontextutil.setapplicationcontext(app); } }
然后我们在另一个被spring管理的容器中,写如下方法,进行bean的动态注册
@getmapping("/bean") public string registerbean() { //将applicationcontext转换为configurableapplicationcontext configurableapplicationcontext configurableapplicationcontext = (configurableapplicationcontext) springcontextutil.getapplicationcontext(); // 获取bean工厂并转换为defaultlistablebeanfactory defaultlistablebeanfactory defaultlistablebeanfactory = (defaultlistablebeanfactory) configurableapplicationcontext.getbeanfactory(); // 通过beandefinitionbuilder创建bean定义 beandefinitionbuilder beandefinitionbuilder = beandefinitionbuilder.genericbeandefinition(usercontroller.class); // 设置属性userservice,此属性引用已经定义的bean:userservice,这里userservice已经被spring容器管理了. beandefinitionbuilder.addpropertyreference("userservice", "userservice"); // 注册bean defaultlistablebeanfactory.registerbeandefinition("usercontroller", beandefinitionbuilder.getrawbeandefinition()); usercontroller usercontroller = (usercontroller) springcontextutil.getbean("usercontroller"); return usercontroller.toaction("动态注册生成调用"); //删除bean. //defaultlistablebeanfactory.removebeandefinition("testservice"); }
如上,就能动态的注册bean
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Java实现图片拼接
下一篇: 一个通用的jsp分页PageBean
推荐阅读
-
Spring运行时动态注册bean的方法
-
Spring之动态注册bean的实现方法
-
JSP 获取spring容器中bean的两种方法总结
-
Spring BPP中如何优雅的创建动态代理Bean详解
-
idea快速搭建spring cloud注册中心与注册的方法
-
Spring的Bean生命周期方法
-
在spring中使用自定义注解注册监听器的方法
-
Spring基本用法4——创建Bean的三种方式 博客分类: Spring Spring创建Bean的三种方式静态工厂方法实例工厂方法
-
Spring基本用法6——协调作用域不同步的Bean 博客分类: Spring Spring作用域不同步具体类实现lookup方法
-
spring动态bean注册示例分享