当前位置:首页 > 科技  > 软件

Spring扩展点之ImportBeanDefinitionRegistrar

来源: 责编: 时间:2023-09-28 10:03:46 216观看
导读一、是什么?查看接口注释:根据给定的注释元数据,根据需要注册bean定义......spring会遍历所有的beanDefinition,逐个创建对应的bean。public interface ImportBeanDefinitionRegistrar { /** * Register bean definition

7HR28资讯网——每日最新资讯28at.com

一、是什么?

查看接口注释:根据给定的注释元数据,根据需要注册bean定义......spring会遍历所有的beanDefinition,逐个创建对应的bean。7HR28资讯网——每日最新资讯28at.com

public interface ImportBeanDefinitionRegistrar {	/**	 * Register bean definitions as necessary based on the given annotation metadata of	 * the importing {@code @Configuration} class.......(截取部分注释)	 */	default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,			BeanNameGenerator importBeanNameGenerator) {		registerBeanDefinitions(importingClassMetadata, registry);	}	default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {	}}

PS:创建bean还有哪些方式?7HR28资讯网——每日最新资讯28at.com

1、@Component、@Bean等等2、@Import(导入类)3、实现ImportSelector接口,重写selectImports方法,返回需要导入的全类名4、实现ImportBeanDefinitionRegistrar接口,注册bean定义

二、demo案例

StudentBean:学生类。7HR28资讯网——每日最新资讯28at.com

public class StudentBean {    private String stuName;    public String getStuName() {        return stuName;    }    public void setStuName(String stuName) {        this.stuName = stuName;    }}

StudentImportBeanDefinitionRegistrar:实现ImportBeanDefinitionRegistrar接口。7HR28资讯网——每日最新资讯28at.com

@Componentpublic class StudentImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {    @Override    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {        // 创建beanDefinitionBuilder        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(StudentBean.class);        beanDefinitionBuilder.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);        // 获取beanDefinition        AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();        BeanDefinitionHolder beanDefinitionHolder = new BeanDefinitionHolder(beanDefinition, StudentBean.class.getSimpleName());        // 注册beanDefinition        BeanDefinitionReaderUtils.registerBeanDefinition(beanDefinitionHolder, registry);    }}

启动类:使用@Import导入StudentImportBeanDefinitionRegistrar类。7HR28资讯网——每日最新资讯28at.com

@Import(StudentImportBeanDefinitionRegistrar.class)@SpringBootApplicationpublic class DemoApplication {    public static void main(String[] args) {        ConfigurableApplicationContext applicationContext = SpringApplication.run(DemoApplication.class, args);        StudentBean studentBean = applicationContext.getBean(StudentBean.class);        System.out.println("studentBean: " + studentBean);    }}

7HR28资讯网——每日最新资讯28at.com

我们大都习惯使用@Enable***方式引入某个组件,此处可稍作改造。7HR28资讯网——每日最新资讯28at.com

新增注解:EnableStudentBean。7HR28资讯网——每日最新资讯28at.com

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(StudentImportBeanDefinitionRegistrar.class)public @interface EnableStudentBean {}

启动类修改:7HR28资讯网——每日最新资讯28at.com

@EnableStudentBean@SpringBootApplicationpublic class DemoApplication {    public static void main(String[] args) {        ConfigurableApplicationContext applicationContext = SpringApplication.run(DemoApplication.class, args);        StudentBean studentBean = applicationContext.getBean(StudentBean.class);        System.out.println("studentBean: " + studentBean);    }}

三、ImportBeanDefinitionRegistrar在其他开源项目中的使用

mybatis

在使用mybatis时,我们需要指定mapper的扫描路径:7HR28资讯网——每日最新资讯28at.com

@MapperScan(basePackages = "com.test.demo.dao.mapper")

查看@MapperScan源码,发现导入了MapperScannerRegistrar类,该类实现了ImportBeanDefinitionRegistrar接口。7HR28资讯网——每日最新资讯28at.com

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(MapperScannerRegistrar.class)@Repeatable(MapperScans.class)public @interface MapperScan

MapperScannerRegistrar类(截取部分代码):7HR28资讯网——每日最新资讯28at.com

public class MapperScannerRegistrar implements ImportBeanDefinitionRegistrar {  @Override  public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {    // 获取MapperScan注解    AnnotationAttributes mapperScanAttrs = AnnotationAttributes        .fromMap(importingClassMetadata.getAnnotationAttributes(MapperScan.class.getName()));    if (mapperScanAttrs != null) {      // 扫描对应的mapper接口,并注册BeanDefinition(bean定义)      registerBeanDefinitions(importingClassMetadata, mapperScanAttrs, registry,          generateBaseBeanName(importingClassMetadata, 0));    }  }}

Openfeign

在使用OpenFeign时,我们需要指定feign接口扫描路径:7HR28资讯网——每日最新资讯28at.com

@EnableFeignClients(basePackages = ""com.test.demo")

查看@EnableFeignClients源码,发现导入了FeignClientsRegistrar类,该类实现了ImportBeanDefinitionRegistrar接口。7HR28资讯网——每日最新资讯28at.com

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(FeignClientsRegistrar.class)public @interface EnableFeignClients

FeignClientsRegistrar类(截取部分代码):7HR28资讯网——每日最新资讯28at.com

class FeignClientsRegistrar	implements ImportBeanDefinitionRegistrar {	@Override	public void registerBeanDefinitions(AnnotationMetadata metadata,BeanDefinitionRegistry registry) {		registerDefaultConfiguration(metadata, registry);    registerFeignClients(metadata, registry);	}}

扫描所有加了@FeignClient注解的接口,接着注册FeignClientFactoryBean类型的BeanDefinition到容器中,需要使用时生成具体的接口代理实现服务调用。7HR28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-11740-0.htmlSpring扩展点之ImportBeanDefinitionRegistrar

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Java中数据共享和同步问题,导致线程安全性问题和竞态条件

下一篇: Python Qt6 真的值得学习吗?看看这些你就知道了!

标签:
  • 热门焦点
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • 让我们一起聊聊文件的操作

    让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • Python异步IO编程的进程/线程通信实现

    Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 大厂卷向扁平化

    大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • 华为Mate60系列模具曝光:采用硕大圆形后置相机模组+拼接配色方案

    华为Mate60系列模具曝光:采用硕大圆形后置相机模组+拼接配色方案

    据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将迎来更新,有望在9-10月份带来全新的华为Mate60
  • 回归OPPO两年,一加赢了销量,输了品牌

    回归OPPO两年,一加赢了销量,输了品牌

    成为OPPO旗下主打性能的先锋品牌后,一加屡创佳绩。今年618期间,一加手机全渠道销量同比增长362%,凭借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
  • 微软发布Windows 11新版 引入全新任务栏状态

    微软发布Windows 11新版 引入全新任务栏状态

    近日,微软发布了Windows 11新版,而Build 22563更新主要引入了几周前曝光的平板模式任务栏等,系统更流畅了。更新中,Windows 11加入了专门针对平板优化的任务栏
Top
Baidu
map