spring动态注册bean

作者: 水煮鱼又失败了 | 来源:发表于2021-06-07 07:25 被阅读0次

1 场景

spring运行过程中,有时候需要在程序中动态添加bean。本文主要记录动态添加bean的方式。

2 代码

2.1 准备

(1) Spring命名空间工具类

定义如下工具类,可以在非spring命名空间内用来获取spring命名空间:

@Component
public class SpringContextUtil implements ApplicationContextAware {
    
    private static ApplicationContext applicationContext;
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }
    
    /**
     * 获取spring命名空间
     * @return
     */
    public static ApplicationContext getSpringContext(){
        return SpringContextUtil.applicationContext;
    }
}

在spring命名空间内,通过如下方式注入ApplicationContext即可:

@Autowired
private ApplicationContext applicationContext;

(2)相关测试依赖类**

@Service
public class UserService{
    public void method(){
        System.out.println("UserService method");
    }
}
@Service
public class OtherService {
    public void method(){
        System.out.println("OtherService method");
    }
}
@Data
public class UserConfig {
    /**
     * 基本属性
     */
    private String userCode;
    private Integer age;
    
    /**
     * 自动注入bean
     */
    @Autowired
    private UserService userService;
    
    /**
     * 手动注册bean(可通过“构造函数”或“手动set注入”)
     */
    private OtherService otherService;
    
    /**
     * 构造函数
     *
     * @param userCode
     * @param otherService
     */
    public UserConfig(String userCode, OtherService otherService) {
        this.userCode = userCode;
        this.otherService = otherService;
    }
    
    /**
     * 方法
     */
    public void out() {
        this.userService.out();
        this.otherService.out();
    }
}

2.2 注册bean

 // ------ 1、创建bean定义
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserConfig.class);

// ------ 2、初始化属性
//(1)【构造参数】设置(如果有)
// 简单属性
beanDefinitionBuilder.addConstructorArgValue("张三");
// 注入属性
beanDefinitionBuilder.addConstructorArgReference("otherService");

// (2)【基本属性】设置(如果有)
// 简单属性
beanDefinitionBuilder.addPropertyValue("age", 19);
// 注入属性
// beanDefinitionBuilder.addAutowiredProperty("otherService");

// ------ 3、注册bean
ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) SpringContextUtil.getSpringContext();
BeanDefinitionRegistry beanDefinitionRegistry = (BeanDefinitionRegistry) configurableApplicationContext.getBeanFactory();
beanDefinitionRegistry.registerBeanDefinition("userConfig", beanDefinitionBuilder.getRawBeanDefinition());

2.3 测试

// bean存在标志(true:已存在;false:不存在)
boolean containsNameFlag = SpringContextUtil.getSpringContext().containsBean("userConfig");
System.out.println("创建结果:" + (containsNameFlag ? "成功" : "失败"));

UserConfig userConfigs = SpringContextUtil.getSpringContext().getBean(UserConfig.class);
System.out.println(userConfigs);
userConfigs.out();

输出结果:

创建结果:成功
UserConfig(userCode=张三, age=19, userService=com.sa.example.context.service.UserService@3fdecce, otherService=com.sa.example.context.service.OtherService@344426bf)
UserService out
OtherService out

3 备注

spring手动创建bean之前,一般会先判断此bean是否已存在,同时,创建bean后,也可判断命名空间中是否创建成功。可通过如下代码判断:

// bean存在标志(true:已存在;false:不存在)
boolean containsNameFlag = SpringContextUtil.getSpringContext().containsBean("xxxBeanName");

相关文章

  • 180804-Spring之动态注册bean

    Spring之动态注册bean 什么场景下,需要主动向Spring容器注册bean呢? 如我之前做个的一个支持扫表...

  • Spring动态注入Bean

    动态注册bean的两种api Spring中的bean定义都保存在 BeanDefinitionRegistry ...

  • Spring动态注册bean

    起因:在使用mybatis 3.2的时候使用了注解式sql;虽然用起来方便 但是这样的bean却不能通过注解来声明...

  • spring动态注册bean

    1 场景 spring运行过程中,有时候需要在程序中动态添加bean。本文主要记录动态添加bean的方式。 2 代...

  • Spring自定义标签解析与实现

    在Spring Bean注册解析(一)和Spring Bean注册解析(二)中我们讲到,Spring在解析xml文...

  • Spring AOP的总体流程

    注册解析 AOP的服务 解析和加载横切逻辑 将横切逻辑织入目标Bean中 Spring 动态代理不会干预 Bean...

  • spring 动态注册bean,动态删除bean,自动ioc

    前言 有一种情况当ioc的一个bean由于异常原因导致的不可用,必须需要重新注册一个bean,来替换当前的bean...

  • 动态注册bean

    干货点: 看完该篇文章我们可以了解到为何要动态注册bean、动态注册bean的方式、注册和实例化的区别、sprin...

  • spring梳理(二) 基于注解的方式注册bean

    我们知道,如果想要将bean交由spring容器管理,就需要首先将bean注册在spring容器中,而bean可以...

  • Spring Bean注册解析(二)

    在上文Spring Bean注册解析(一)中,我们讲解了Spring在注册Bean之前进行了哪些前期工作,以及Sp...

网友评论

    本文标题:spring动态注册bean

    本文链接:https://www.haomeiwen.com/subject/hfkqeltx.html