当前位置: 首页 > news >正文

springboot多种方式注入bean获取Bean

springboot动态注入bean

  • 1、创建Bean(demo)
  • 2、动态注入Bean
  • 3、通过注解注入Bean
  • 4、通过config配置注入Bean
  • 5、通过Import注解导入
  • 6、使用FactoryBean接口
  • 7、实现BeanDefinitionRegistryPostProcessor接口

1、创建Bean(demo)

@Data
public class Demo(){private String name;public void printName(){System.out.print("动态载入Bean的name属性"+this.name);}
}

2、动态注入Bean

@springbootTest
public class TestDemo(){@Testpublic void test(){// 获取ApplicationContextApplicationContext context = (ApplicatonContext)SpringApplication.run(App.class,args);// 获取BeanFactoryDefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory)context.getAutowireCapableBeanFactory();// 创建Bean信息BeanDefinitiontBuilder beanDefinitiontBuilder = BeandefinitionBuilder.genericBeanDefinition(Demo.class);beandefinitionBulider.addPropertyValue("name","小猫咪")// 注入BeanbeanFactory.registerBeanDefinition("demo",beanDefinitionBuilder.getBeanDefinition());// 获取动态注入的BeanDemo demo = applicationContest.getBean("demo");demo.printName();// 移除动态注入的beanbeanFactory.removeBeanDefinition("demo"); }
}

3、通过注解注入Bean

直接在需要注入Bean的类上加这些注解

@RestController
@Service
@Component

4、通过config配置注入Bean

@Configuration标识这个类是一个配置类
@Bean表示这个方法返回的对象,和以前xml配置的Bean一样

5、通过Import注解导入

@import(xxx.class)可以嵌套在启动类上,也可以嵌套在config配置类上
@Import + 实现ImportSelector接口的selectImports方法
@Import + 实现ImportBeanDefinitionRegistrar 接口中的方法
@Import +  实现DeferredImportSelector接口的selectImports方法,DeferredImportSelector 它是 ImportSelector的子接口

6、使用FactoryBean接口

FactoryBean接口和BeanFactory千万不要弄混了,从名字其实可以大概的区分开,FactoryBean, 后缀为bean,那么它其实就是一个bean, BeanFactory,顾名思义 bean工厂,它是IOC容器的顶级接口,这俩接口都很重要。

package com.example.config;import com.example.dto.Demo;
import org.springframework.beans.factory.FactoryBean;public class DemoFactoryBean implements FactoryBean<Demo> {@Overridepublic Bike getObject() throws Exception {return new Demo();}@Overridepublic Class<?> getObjectType() {return Demo.class;}@Overridepublic boolean isSingleton() {return true;}
}
@Configuration
@Import({BikeFactoryBean.class,Dog.class,MyImportSelector.class})
public class MyConfig

7、实现BeanDefinitionRegistryPostProcessor接口

这种方式也是利用到了 BeanDefinitionRegistry,在Spring容器启动的时候会执行 BeanDefinitionRegistryPostProcessor 的 postProcessBeanDefinitionRegistry 方法,大概意思就是等beanDefinition加载完毕之后,对beanDefinition进行后置处理,可以在此进行调整IOC容器中的beanDefinition,从而干扰到后面进行初始化bean。

public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Demo.class).getBeanDefinition();registry.registerBeanDefinition("Demo", beanDefinition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {}
}
@Configuration
@Import({MyBeanDefinitionRegistryPostProcessor.class})
public class MyConfig {
http://www.lryc.cn/news/13007.html

相关文章:

  • Markdown及其语法详细介绍(全面)
  • 在Linux和Windows上安装sentinel-1.8.5
  • 面试攻略,Java 基础面试 100 问(十)
  • Zero-shot(零次学习)简介
  • 51单片机简易电阻电感电容RLC测量仪仿真设计
  • [软件工程导论(第六版)]第6章 详细设计(课后习题详解)
  • 【2.19】算法题2:贪心算法、动态规划、分治
  • 【Redis】Redis 发布订阅通信模式 ( 发布订阅模式 | 订阅频道 | 发布消息 | 接收消息 )
  • VNCTF 2023复现
  • python基础知识有哪些需要背(记住是基础知识)我是初学者
  • Linux下TCP连接断开后不释放的解决办法
  • 1.关于嵌入式开发软件工程师的理解
  • 1760字,让你拿捏 [‘列表‘]
  • A562基于android的养老APP
  • java面试题-并发基础
  • 用纯C语言实现3D空间中的点坐标转化为屏幕二维点坐标,包含主视图、侧视图、俯视图、正等轴投影
  • .sh脚本文件的执行方式
  • Android 基础知识4-2.5View与VIewGroup的概念、关系与区别
  • 【ESP 保姆级教程】玩转巴法云篇① ——初识巴法云
  • Python学习-----模块3.0(正则表达式-->re模块)
  • JSP中http与内置对象学习笔记
  • Windows Server 2016远程桌面配置全过程
  • SPI通讯简介
  • Python 迭代器
  • Python语言零基础入门教程(二十七)
  • Redis基础操作以及数据类型
  • 自抗扰控制ADRC之反馈控制律(NLSEF)
  • “生成音乐“ 【循环神经网络】
  • 能否手写vue3响应式原理-面试进阶
  • 前端工程师leetcode算法面试必备-简单的二叉树