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

Spring扩展点之ImportBeanDefinitionRegistrar

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

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

一、是什么?

查看接口注释:根据给定的注释元数据,根据需要注册bean定义......spring会遍历所有的beanDefinition,逐个创建对应的bean。Mj128资讯网——每日最新资讯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还有哪些方式?Mj128资讯网——每日最新资讯28at.com

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

二、demo案例

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

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

StudentImportBeanDefinitionRegistrar:实现ImportBeanDefinitionRegistrar接口。Mj128资讯网——每日最新资讯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类。Mj128资讯网——每日最新资讯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);    }}

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

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

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

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

启动类修改:Mj128资讯网——每日最新资讯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的扫描路径:Mj128资讯网——每日最新资讯28at.com

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

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

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

MapperScannerRegistrar类(截取部分代码):Mj128资讯网——每日最新资讯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接口扫描路径:Mj128资讯网——每日最新资讯28at.com

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • SpringBoot中使用Cache提升接口性能详解

    环境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架从 3.1 开始,对 Spring 应用程序提供了透明式添加缓存的支持。和事务支持一样,抽象缓存允许一致地使用各
  • 从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • 最“俊美”淘宝卖家,靠直播和短视频圈粉,上架秒光,年销3000万

    来源 | 电商在线文|易琬玉编辑|斯问受访店铺:Ringdoll戒之人形图源:微博@御座的黄山、“Ringdoll戒之人形”淘宝店铺有关外貌的评价,黄山已经听累了。生于1985年的他,哪
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大“烤”之下的除了众生,还有各大企业发布的ESG报告。ESG是“环境保
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的“征求意见版”:1、取消P序列
  • 三星显示已开始为AR设备研发硅基LED微显示屏

    7月18日消息,据外媒报道,随着苹果首款头显产品Vision Pro在6月份正式推出,AR/VR/MR等头显产品也就将成为各大公司下一个重要的竞争领域,对显示屏这一关
  • 英特尔Xe HPG游戏显卡:拥有512EU,单风扇版本

    据10 月 30 日外媒 TheVerge 消息报道,英特尔 Xe HPG Arc Alchemist 的正面实被曝光,不仅拥有 512 EU 版显卡,还拥有 128EU 的单风扇版本。另外,这款显卡 PCB
Top