组件注册 07 @Import 给容器快速导入一个组件

给容器注册组件:

  1. 包扫描 + 组件标注注解(@Controller @Service @Repository @Component),局限于自己写的
  2. @Bean(可导入第三方包里的组件)
  3. @Import(快速给容器中导入组件)
    1. @Import([要导入容器中的组件]):容器中就会自动注册这个组件,id默认为全类名 @Import(Color.class) @Import({Color.class,Red.class})
    2. 实现ImportSelector接口:返回需要导入的组件的全类名数组
    3. 实现ImportBeanDefinitionRegistrar接口:手动注册bean到容器中
  4. 使用Spring提供的FactoryBean工厂

配置类 MainConfig3.class

测试

    @Testvoid importTest(){//配置类测试AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig3.class);System.out.println("容器创建完毕");System.out.println("准备获取bean...");String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();for (String name:beanDefinitionNames){System.out.println(name);}}

ImportSelector 测试

Color.java

package com.example.annotations.bean;public class Color {}

Red.java

package com.example.annotations.bean;public class Red {}

MyImportSelector.java

package com.example.annotations.importselector;import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;/*** 自定义逻辑返回需要导入的组件*/
public class MyImportSelector implements ImportSelector {// 返回值:导入到容器中的组件 (全类名)// AnnotationMetadata:当前标注@Import注解的类的所有注解信息@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {// 不能返回 null  可以是空数组return new String[]{"com.example.annotations.bean.Color","com.example.annotations.bean.Red"};}
}

运行结果:

实现ImportBeanDefinitionRegistrar接口

MyImportBeanDefinitionRegistrar.class

package com.example.annotations.importselector;import com.example.annotations.bean.RainBow;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {/**** @param importingClassMetadata 当前类的注解信息* @param registry               BeanDefinition的注册类  负责将bean添加进容器*/@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {// 指定bean定义信息(Bean的类型 Bean的作用域 ...)RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(RainBow.class);// 注册:指定bean名if (!registry.containsBeanDefinition("rainbow")){System.out.println(" start create 'rainbow' ...");registry.registerBeanDefinition("rainbow",rootBeanDefinition);}else {System.out.println("'rainbow' already exists ");}}
}

运行结果

使用FatoryBean

普通bean

将bean导入到容器后,容器会调用其无参构造器,默认创建一个对象注册在容器中

FactoryBean

  1. 是一个接口
  2. 整合第三方框架的时候用的多
  3. 默认获取的是工厂bean调用getObject创建的对象
  4. 要获取工厂bean本身,需要给id前加一个 &

需要实现方法

getObject()
getObjectType()

isSingleton() :默认是true 单实例

实例测试

ColorFactoryBean.java

package com.example.annotations.bean;import org.springframework.beans.factory.FactoryBean;/*** 创建一个Spring定义的FactoryBean*/
public class ColorFactoryBean implements FactoryBean<Color> {/*** 返回分Color对象会被添加到容器中* @return Color* @throws Exception*/@Overridepublic Color getObject() throws Exception {return new Color();}/**** @return*/@Overridepublic Class<?> getObjectType() {return Color.class;}/*** true: 单实例 在容器中保存一份* false:多实例 每获取一次就会创建一个新bean* @return*/@Overridepublic boolean isSingleton() {return true;}
}

MainConfig2.java

@Configuration
public class MainConfig2 {@Beanpublic ColorFactoryBean colorFactoryBean(){return new ColorFactoryBean();}
}

测试

    @Testvoid factoryBeanTest(){//配置类测试AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);System.out.println("容器创建完毕");System.out.println("准备获取bean...");Object bean1 = applicationContext.getBean("colorFactoryBean");//Color.classObject bean2 = applicationContext.getBean("colorFactoryBean");//Color.classSystem.out.println("bean1 == bean2? => " + (bean1 == bean2));}

测试结果

现将ColorFactoryBean.java中的isSingleton改为false,再次运行

查看获取的类型

    @Testvoid factoryBeanTest(){//配置类测试AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);System.out.println("容器创建完毕");System.out.println("准备获取bean...");Object bean1 = applicationContext.getBean("colorFactoryBean");//Color.class  获取的是工厂bean调用 Object bean2 = applicationContext.getBean("&colorFactoryBean");//ColorFactoryBean.classSystem.out.println("bean1 == bean2? => " + (bean1 == bean2));System.out.println("bean1 " + bean1.getClass());System.out.println("bean2 " + bean2.getClass());}

【SpringBoot_ANNOTATIONS】组件注册 07 @Import 给容器快速导入一个组件相关推荐

  1. 2、组件注册-@Configuration@Bean给容器中注册组件

    2.组件注册-@Configuration&@Bean给容器中注册组件 2.1 创建maven项目 spring-annotation pom.xml文件添加 spring-context 依 ...

  2. 自动装配——@Autowired 构造器,参数,方法,属性都是从容器中获取参数组件的值||自定义组件想要使用Spring容器底层的一些组件 ApplicationContext,BeanFactory

    @Autowired:构造器,参数,方法,属性:都是从容器中获取参数组件的值 * 1).[标注在方法位置]:@Bean+方法参数:参数从容器中获取;默认不写@Autowired效果是一样的:都能自动装 ...

  3. java中怎么快速导入一个包_Eclipse中快速导入jar包的方法

    如何在Eclipse中快速导入jar包呢?下面就一起来学习Eclipse中快速导入jar包的方法吧,熟悉一下它的基本操作, 相信对各位小伙伴们一定会有所帮助的哦. Eclipse中快速导入jar包的方 ...

  4. 小程序如何把一个页面当作组件来引用,就是既可以当作一个组件也能当一个页面使用

    把一个页面当作组件来使用.不改变原来的获取值得方式也就是即使他是组件也不能使用props来传值. 遇到的问题:具体就是分享页面,使用了太多的页面,一些是以前得一些页面.如果全部重新浪费时间而且小程序安 ...

  5. spring系列-注解驱动原理及源码-bean组件注册

    目录 一.环境初始化 1.环境准备 二.bean的手动注入 1.xml方式注入bean 2.使用@Configuration&@Bean方式注入bean 三.自动扫描注册组件及bean 1.使 ...

  6. Spring注解驱动:组件注册(一)

    文章目录 1.Spring简单环境 2.Spring注解容器 2.1 代码示例 2.2 给容器注册组件4种方式 2.2.1 工厂创建对象 2.3 声明周期 2.3.1 Bean指定初始化和销毁方法 2 ...

  7. spring注解--组件注册

    组件注册 1.@Configuration , @Bean 1)xml方式 <?xml version="1.0" encoding="UTF-8"?&g ...

  8. Mini 容器学习笔记4——组件的生命周期(应用篇)

    Mini容器支持6中生命周期类型: 1. Singleton :单利类型(缺省组件都是单利类型的生命周期,由容器进行托管的) [Test]public void SingletonLifestyleT ...

  9. Mini 容器学习笔记6——组件的获取(应用)

    1. 通过组件Id获取组件实例: [Test]public void GetByIdTest(){ServiceRegistry.Register<Person>("person ...

  10. mathcal 对应于什么库_如何快速构建React组件库

    前言 俗话说:"麻雀虽小,五脏俱全",搭建一个组件库,知之非难,行之不易,涉及到的技术方方面面,犹如海面风平浪静,实则暗礁险滩,处处惊险- 目前团队内已经有较为成熟的 Vue 技术 ...

最新文章

  1. 银监会警示担保圈贷款风险 联保贷款变异 防多米诺效应
  2. 拜托,面试别再问我时间复杂度了!!!
  3. 操作和维护经常使用的命令
  4. Select 标签可输入
  5. 自学python推荐书籍2019-2019最全Python入门学习路线,绝
  6. 在DigitalOcean玩Kubernetes(K8S)
  7. 使用Javascript获取图片坐标以及宽度高度的方法
  8. UIDevice获取设备数据以及如何获取应用信息
  9. 符号回归工具之 geppy: Python中的基因表达编程框架
  10. 基础算法matlab
  11. 电脑计算机c盘缓存清理,电脑C盘缓存文件怎么删除
  12. 点云标可视化+标注软件
  13. linux的打包压缩文件,linux打包文件,压缩文件
  14. RESTFul API
  15. pta 7-5 输出2到n之间的全部素数 (15 分)
  16. 【嵌入式】学习心路历程与总结
  17. 让你心动的20句励志文案
  18. 小米4c手机显示无服务器,小米4C手机无法开机变砖了怎么办
  19. 护卫神备份mysql_护卫神好备份系统数据库怎么备份?
  20. Vue-GoogleMap (一)实时定位

热门文章

  1. 2020阿里云线上峰会预告
  2. 【破损识别】基于matlab GUI机器视觉+SVM玉米种子破损识别(带面板)【含Matlab源码 1651期】
  3. 【优化调度】基于matlab改进粒子群算法求解微电网优化调度问题【含Matlab源码 052期】
  4. 【钟表识别】基于matlab GUI形态学钟表识别【含Matlab源码 1351期】
  5. 【语音识别】基于matlab GUI BP神经网络0到10数字语音识别【含Matlab源码 672期】
  6. 【优化预测】基于matlab鲸鱼算法优化LSTM预测【含Matlab源码 105期】
  7. 初一计算机课学什么,初一有哪几门课程 各科满分是多少
  8. vscode配置python调试_vscode配置python环境-运行调试-windows环境
  9. python vimdiff_Vim实践与学习-09其他
  10. excel字符串和单元格拼接_Excel工作表中带单位求和的4个技巧,不掌握就真的Out了!...