SpringBoot注册第三方Bean的方法总结

 更新时间:2024年01月18日 09:58:25   作者:尽欢Sir  
众所周知,SpringBoot默认会扫描启动类所在的包及其子包,一般我们都是在需要的类上通过注解的方式去将Bean注册交给IOC进行管理,但是注册第三方Bean的方案却不支持,所以本文给大家介绍了SpringBoot注册第三方Bean的方法,需要的朋友可以参考下

SpringBoot中如何注册第三方Bean

众所周知,SpringBoot默认会扫描启动类所在的包及其子包,一般我们都是在需要的类上通过注解的方式去【Compoment、Controller、Service、Respository】将Bean注册交给IOC进行管理,但是注册第三方Bean的方案却不支持直接在类上写这个(read-only),但是我们可以在其他地方使用@Bean或者@Import注解将三方Bean进行注册。

第一种:使用@Bean

【tips:】前面是引入,不算白雪,也可以直接看每个的最终版,结果测试在@Bean的第一个案例里面

1、在SpringBoot的启动类里面进行配置

@SpringBootApplication
public class 启动类 {
    【测试方法都可以用这个 后续的案例就不在一一输出了】
    public static void main(String[] args) {
        //获取容器用于检查容器内部是否有对应的Bean对象
        ApplicationContext context = SpringApplication.run(启动类.class, args);
        //获取对应的Bean对象
        Country aBean = context.getBean(A.class);
        //检验输出
        System.out.println(aBean);
    }
   
    /**
     * @Bean
     * public 三方类名 三方类名小写(){
     *     return new 三方类构造方法();
     * }
     */
     //注入第三方的Bean A对象到IOC容器里面
    @Bean
    public A a() {
        return new A();
    }
}

【“白雪”警告!】在这里需要几个Bean对象就可以写几个Bean,但是不建议这样写
因为这是在启动类里,启动类启动类 干的就是启动的活,或者用一句更嘿嘿的话说:这样写不够美观
所以,'【不建议大家这样写】

2、【最终版不白雪】创建配置类专门进行Bean的注册

配置类的的路径必须在???(默认扫描的路径中)

配置类MyConfig

@Configuration//告诉Spring 给哥们把这个玩意弄上
public class MyConfig {
    /**
     * @Bean
     * public 三方类名 三方类名小写(){
     *     return new 三方类构造方法();
     * }
     */
    @Bean
    public A a() {
        return new A();
    }
    /**
     * 创建的对象默认名字就是其方法名
     * 可以通过name属性对其进行赋值
     */
    @Bean
    public B b(){
        return new B();
    }
    /**
     * 注意!!!
     *      如果当我们声明的第三方Bean对象创建需要依赖其他的
     		(已经存在IOC容器中的)Bean对象的时候
     *      直接在其形式参数列表里进行声明即可
     * */
    @Bean
    public C c(A a){
        return new C();
    }
}

第二种:使用@Import

实际开发中,最常导入的类一般为【配置类、ImportSelector接口实现类】

1、在启动类上直接导入配置类

@Import(???.class)  这里的配置类,不用写注解(@Configuration)了,也不用在默认扫描路径之下了  
@SpringBootApplication
public class 启动类 {
}
这个类可以是任意类,有多个怎么办?看下图,参数可以用数组的!蒙鼓人!
@Import({A.class,B.class...})
-那我要是有一百个怎么办?
-(那你写一百个呗),那肯定不够优雅啊,
-那咋办呢?
-那不还有一个ImportSelector接口实现类么,
-我&……%¥#*()()*……&*……&*……%&%

2、导入ImportSelector接口实现类

简单版

1、自定义ImportSelector接口实现类
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        //返回【全类名】的数组,有多少写多少
        // return new String[]{"com.why.config.MyConfig"};
        return new String[]{配置类1.class.getName(),配置类2.class.getName()};
    }
}
2、启动类
@Import(MyImportSelector.class)
@SpringBootApplication
public class 启动类 {
}   

最终版(建议啊建议大家用(手动狗头),讲一下每一步骤)

【1、配置文件 test.configs】
配置类全类名1
配置类全类名2
...
=================================================
【2、自定义ImportSelector的实现类】
public class CommmonImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        List<String> imports = new ArrayList<>();//存放每一个配置类的全类名 的集合
        /**
         * 通过类加载器去获取一个名为test.imports的资源作为输入流
         * 注意:1、要访问的资源文件的路径
         *      2、getResourceAsStream()返回的输入流需要进行适当的关闭处理
         * */
        InputStream is = CommmonImportSelector.class.//获取CommmonImportSelector的Class对象
                getClassLoader().//获得该类的类加载器
                getResourceAsStream("test.imports");//通过类加载器获取资源,就是尝试找这个文件并将其转为输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String line = null;
        while(true){
            try {
                if (!((line = br.readLine()) != null)) break;
            } catch(IOException e) {
                throw new RuntimeException(e);
            }finally {
                if(br != null){
                    try {
                        br.close();
                    } catch(IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
            imports.add(line);
        }
        //这里是将集合对象转为数组对象,但是需要传入一个数组对象作为参数来指定返回数组的类型和大小,传递一个空的数组作为参数,是要根据运行时集合的大小自动创建一个合适大小的数组
        return imports.toArray(new String[0]);
        return imports.toArray(String[]::new);// >= JDK11
    }
}
======================================================================
【3、启动类】
@Import(MyImportSelector.class)
@SpringBootApplication
public class 启动类 {
}  

好了,学到这里就完事了,后续是装波一阶段,【白雪警告!!!】

使用自定义注解”更改“(个鸡毛的)配置类

什么,你说启动类上加一堆这玩意不好看,怎么办,雪啊,你看看SpringBootApplication这个注解 不就是一个混合注解么,你也搞一个把它塞进去不就完事了

不爱装的雪玩写的启动类

@SpringBootApplication
@Import(CommmonImportSelector.class)
public class SbRegisterApplication {  
}

真是没有逼格,看会装的怎么写吧

1、编写自定义的注解类

//@Target 指定目标类型   ElementType.TYPE表示只能在类、接口或枚举类上
@Target(ElementType.TYPE)
//@Retention 指定它们在代码中的保留策略,即注解在什么时候保留有效 
//RUNTIME 表示被注解的注解在运行时保留,
@Retention(RetentionPolicy.RUNTIME)
//嘿嘿 没想到吧 老弟|妹儿 还是它
@Import(CommmonImportSelector.class)
public @interface EnableMyConfig {
}

2、学过装(博弈)的写的启动类

@SpringBootApplication
@EnableMyConfig
public class SbRegisterApplication {  
}

以上就是SpringBoot注册第三方Bean的方法总结的详细内容,更多关于SpringBoot注册Bean的资料请关注脚本之家其它相关文章!

相关文章

  • JavaWeb应用实例:用servlet实现oracle 基本增删改查

    JavaWeb应用实例:用servlet实现oracle 基本增删改查

    本篇文章主要介绍了JavaWeb应用实例:用servlet实现oracle 基本增删改查,非常具有实用价值,需要的朋友可以参考下。
    2017-01-01
  • 详解Mybatis模板(已优化)适合小白

    详解Mybatis模板(已优化)适合小白

    这篇文章主要介绍了Mybatis模板(已优化)适合小白,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • java设计模式之适配器模式(Adapter)

    java设计模式之适配器模式(Adapter)

    这篇文章主要介绍了java设计模式之适配器模式Adapter的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Java join 线程控制用法

    Java join 线程控制用法

    Java join 线程控制用法,需要的朋友可以参考一下
    2013-03-03
  • 浅谈java实现mongoDB的多条件查询

    浅谈java实现mongoDB的多条件查询

    这篇文章主要介绍了java实现mongoDB的多条件查询,具有一定参考价值,需要的朋友可以参考下。
    2017-09-09
  • java对象池管理方式common-pool2使用

    java对象池管理方式common-pool2使用

    这篇文章主要为大家介绍了java对象池common-pool2使用示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • SpringBoot前后端分离项目之打包、部署到服务器详细图文流程

    SpringBoot前后端分离项目之打包、部署到服务器详细图文流程

    作为后台开发,项目打包部署是经常性的操作,下面这篇文章主要给大家介绍了关于SpringBoot前后端分离项目之打包、部署到服务器的相关资料,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  •  Java数据结构的十大排序

     Java数据结构的十大排序

    这篇文章主要介绍了 Java数据结构的十大排序,排序算法分为比较类排序和非比较类排序,具体的内容,需要的朋友参考下面思维导图及文章介绍,希望对你有所帮助
    2022-01-01
  • java操作elasticsearch的案例解析

    java操作elasticsearch的案例解析

    这篇文章主要介绍了java操作elasticsearch的案例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 浅谈Java中的克隆close()和赋值引用的区别

    浅谈Java中的克隆close()和赋值引用的区别

    下面小编就为大家带来一篇浅谈Java中的克隆close()和赋值引用的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09

最新评论