SpringBoot中的ImportSelector类动态加载bean详解

 更新时间:2024年01月29日 08:54:49   作者:梨轻巧  
这篇文章主要介绍了SpringBoot中的ImportSelector类动态加载bean详解,ImportSelector接口是spring中导入外部配置的核心接口,根据给定的条件(通常是一个或多个注释属性)判定要导入那个配置类,在spring自动化配置和@EnableXXX中都有它的存在,需要的朋友可以参考下

ImportSelector类动态加载bean

实现ImportSelector类→ 动态加载bean → 源码中大量使用

代码

package com.qing.config;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
import java.util.Map;
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata metadata) {
        //metadata元数据 : 指的是加载本类MyImportSelector的类
        //metadata的get、has、is 有大量方法,可以用来获取判断数据
        Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes("org.springframework.context.annotation.ComponentScan");
        System.out.println("注解"+annotationAttributes);
        boolean hasConfiguration = metadata.hasAnnotation("org.springframework.context.annotation.Configuration");
        if(hasConfiguration){
            return new String[]{"com.qing.bean.cat"};
        }
        return new String[]{"com.qing.bean.dog"};
    }
}

元数据metadata指的是下面的config6

package com.qing.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
//@Configuration 注解是测试用的
@Configuration
//@ComponentScan 注解是测试用的
@ComponentScan("com.qing.bean")
@Import(MyImportSelector.class)
public class SpringConfig6 {
}

测试

package com.qing.app;
import com.qing.config.SpringConfig6;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class App6 {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig6.class);
        String[] names = ctx.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println("bean的名字:" + name);
        }
    }
}

 结果

因为元数据上有@Configuration注解,所以返回的是cat

元数据上没有@Configuration注解了,所以返回的是dog

总结

到此这篇关于SpringBoot中的ImportSelector类动态加载bean详解的文章就介绍到这了,更多相关ImportSelector类动态加载bean内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • RocketMQ生产消息与消费消息超详细讲解

    RocketMQ生产消息与消费消息超详细讲解

    这篇文章主要介绍了RocketMQ生产消息与消费消息,RocketMQ可用于以三种方式发送消息:可靠的同步、可靠的异步和单向传输。前两种消息类型是可靠的,因为无论它们是否成功发送都有响应
    2022-12-12
  • springboot配置内存数据库H2教程详解

    springboot配置内存数据库H2教程详解

    这篇文章主要介绍了springboot配置内存数据库H2的详细教程,需要的朋友可以参考下
    2017-07-07
  • 两分钟解决IntelliJ IDEA中文乱码问题(推荐)

    两分钟解决IntelliJ IDEA中文乱码问题(推荐)

    这篇文章主要介绍了两分钟解决IntelliJ IDEA中文乱码问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • protobuf与json转换小结

    protobuf与json转换小结

    protobuf对象不能直接使用jsonlib去转,因为protobuf生成的对象的get方法返回的类型有byte[],而只有String类型可以作为json的key,protobuf提供方法进行转换
    2017-07-07
  • 详细总结Java堆栈内存、堆外内存、零拷贝浅析与代码实现

    详细总结Java堆栈内存、堆外内存、零拷贝浅析与代码实现

    零拷贝,这是个耳熟能详的名词,是开发岗面试中经常提及的问题.最近在回顾Netty的基础原理,还是把NIO中关于堆外内存的知识点过了一遍,这里就针对堆栈内存 堆外内存和零拷贝这几个概念以及相关知识做一下记录,需要的朋友可以参考下
    2021-05-05
  • 浅析java 希尔排序(Shell)算法

    浅析java 希尔排序(Shell)算法

    这篇文章主要介绍了浅析java 希尔排序(Shell)算法的原理以及示例,需要的朋友可以参考下
    2015-02-02
  • springboot项目启动自动跳转到浏览器的操作代码

    springboot项目启动自动跳转到浏览器的操作代码

    这篇文章主要介绍了springboot项目启动自动跳转到浏览器的操作代码,本文图文实例代码相结合给大家介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • Spring Boot使用Redisson实现滑动窗口限流的项目实践

    Spring Boot使用Redisson实现滑动窗口限流的项目实践

    滑动窗口限流是一种流量控制策略,用于控制在一定时间内的请求频率,本文主要介绍了Spring Boot使用Redisson实现滑动窗口限流的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • IDEA新建javaWeb以及Servlet简单实现小结

    IDEA新建javaWeb以及Servlet简单实现小结

    这篇文章主要介绍了IDEA新建javaWeb以及Servlet简单实现小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • spring boot(四)之thymeleaf使用详解

    spring boot(四)之thymeleaf使用详解

    Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP 。接下来通过本文给大家介绍spring boot(四)之thymeleaf使用详解,需要的朋友可以参考下
    2017-05-05

最新评论