本文包含以下内容:

  1. @Import快速导入组件

  2. 配合ImportSelector 导入组件

  3. 配合ImportBeanDefinitionRegistrar 导入组件

  4. FactoryBean 定义工厂注册组件

1.@Import快速导入组件

在前几篇推文中,通过@Bean 标记在方法上,手动new 一个实例注入到容器中,这种方法,会比较繁琐,需要手动编写过多无意义代码

  @Bean("bill")  public Person person01(){    return new Person("Bill Gates",62);  }

通过@Import,方法可以不需要编写构造方法,快速注册组件1)建立测试类

public class Color {}public class Red  {  }public class Blue {  }public class Yellow {}

2)使用@Import({Color.class,Red.class})  导入类组件

@Import({Color.class,Red.class})public class MainConfig2 {}

3)编写测试方法

@Testpublic void testImport(){  printBeans(applicationContext);  Blue bean = applicationContext.getBean(Blue.class);  System.out.println(bean);}private void printBeans(AnnotationConfigApplicationContext applicationContext){  String[] definitionNames = applicationContext.getBeanDefinitionNames();  for (String name : definitionNames) {    System.out.println(name);  }}

4)运行测试,可以看到@Import注解创建的组件默认以全类名作为id 的形式注入到容器中

2.配合ImportSelector 导入组件

在@Import注解 中还能添加ImportSelector

查看源码,看到这个接口需要实现selectImports 返回类的全类名即可:

1)创建Selector

//自定义逻辑返回需要导入的组件public class MyImportSelector implements ImportSelector {  //返回值,就是到导入到容器中的组件全类名  //AnnotationMetadata:当前标注@Import注解的类的所有注解信息  @Override  public String[] selectImports(AnnotationMetadata importingClassMetadata) {    // TODO Auto-generated method stub    //importingClassMetadata    //方法不要返回null值    return new String[]{"peason.zxc.annotation.bean.Blue","peason.zxc.annotation.bean.Yellow"};  }}

2)在注解中引入Selector

@Import({Color.class, Red.class,MyImportSelector.class})

3)获得测试结果,能够注入"peason.zxc.annotation.bean.Blue","peason.zxc.annotation.bean.Yellow"等组件

3.配合ImportBeanDefinitionRegistrar 导入组件

在@Import注解中还能添加ImportSelector

1)建立自定义的实现类其中有2个参数:AnnotationMetadata:当前类的注解信息

BeanDefinitionRegistry :当前容器的注册入口,可以直接注册组件下面例子是如果注册器内存在Red 、Blue 的组件,就进行创建rainBow 实例,此处id 累哦自定义名称
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {  /**   * AnnotationMetadata:当前类的注解信息   * BeanDefinitionRegistry:BeanDefinition注册类;   *     把所有需要添加到容器中的bean;调用   *     BeanDefinitionRegistry.registerBeanDefinition手工注册进来   */  @Override  public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {    boolean definition = registry.containsBeanDefinition("peason.zxc.annotation.bean.Red");    boolean definition2 = registry.containsBeanDefinition("peason.zxc.annotation.bean.Blue");    if(definition && definition2){      //指定Bean定义信息;(Bean的类型,Bean。。。)      RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);      //注册一个Bean,指定bean名      registry.registerBeanDefinition("rainBow", beanDefinition);    }  }}

2)在注解中引入

@Import({Color.class, Red.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})

3)测试结果,成功根据条件注入了id 为rainBow的组件

4.FactoryBean 定义工厂注册组件

在@Import注解,会调用默认的无参构造器创建对象,而注入容器FactoryBean 的主键会默认调用,这个接口的getObject()返回实例进行组件的创建。下面进行测试:1)创建实现FactoryBean 接口的类

//创建一个Spring定义的FactoryBeanpublic class ColorFactoryBean implements FactoryBean {  //返回一个Color对象,这个对象会添加到容器中  @Override  public Color getObject() throws Exception {    // TODO Auto-generated method stub    System.out.println("ColorFactoryBean...getObject...");    return new Color();  }  @Override  public Class> getObjectType() {    // TODO Auto-generated method stub    return Color.class;  }  //是单例?  //true:这个bean是单实例,在容器中保存一份  //false:多实例,每次获取都会创建一个新的bean;  @Override  public boolean isSingleton() {    // TODO Auto-generated method stub    return false;  }}

2)通过@Bean 将工厂注入到容器中

  @Bean  public ColorFactoryBean colorFactoryBean(){    return new ColorFactoryBean();  }

3)编写测试方法

  @Test  public void testImport(){    printBeans(applicationContext);    //工厂Bean获取的是调用getObject创建的对象    Object bean2 = applicationContext.getBean("colorFactoryBean");    Object bean3 = applicationContext.getBean("colorFactoryBean");    System.out.println("bean的类型:"+bean2.getClass());    System.out.println(bean2 == bean3);    Object bean4 = applicationContext.getBean("&colorFactoryBean");    System.out.println(bean4.getClass());  }

4)获得结果

5)分析结果:1.在打印所有的组件可以看到colorFactoryBean 组件通过获取,多次可以看到,2次获取结果并非同一个实例对象,由此见得,在方法isSingleton 生效了,采用多实例构建

//是单例?  //true:这个bean是单实例,在容器中保存一份  //false:多实例,每次获取都会创建一个新的bean;  @Override  public boolean isSingleton() {    // TODO Auto-generated method stub    return false;  }

2.通过该id 获取该组件,获取到bean 的类型为peason.zxc.annotation.bean.Color 由此可见,获取对象时通过调用getObject函数创建组件

//返回一个Color对象,这个对象会添加到容器中  @Override  public Color getObject() throws Exception {    // TODO Auto-generated method stub    System.out.println("ColorFactoryBean...getObject...");    return new Color();  }

3.可以通过&符号获取到FactoryBean 对象即最后的结果class peason.zxc.annotation.bean.ColorFactoryBean,可以看到源码所示,指定了&符号

-END-

可以关注我的公众号,免费获取价值1980元学习资料

点击“在看”,学多少都不会忘~

factorybean 代理类不能按照类型注入_Spring注解驱动开发之四——@Import快速导入组件、FactoryBean 定义工厂注册组件...相关推荐

  1. factorybean 代理类不能按照类型注入_Spring拓展接口之FactoryBean,我们来看看其源码实现...

    是什么 FactoryBean的源码比较简单,大家可以细读下其注释,我做了简单的如下翻译 /*** 实现此接口的bean不能用作普通bean.此bean暴露的对象是通过getObject()创建的对象 ...

  2. factorybean 代理类不能按照类型注入_快速理解Spring中的FactoryBean接口

    1.前提概要 很多java开发者在使用Spring框架中都见过后缀为FactoryBean的类,比如Mybatis-Spring中的SqlSessionFactoryBean.说到这里就不得不提Bea ...

  3. factorybean 代理类不能按照类型注入_彻底搞懂依赖注入(一)Bean实例创建过程

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 上一章介绍了Bean的加载过程(IOC初始化过程),加载完成后,紧接着就要用到它的依赖注入 ...

  4. factorybean 代理类不能按照类型注入_《Spring入门经典》:使用Spring进行依赖注入

    第二章:使用Spring进行依赖注入 重点:配置并使用Spring容器 使用不同类型的配置元数据来配置Spring容器 理解依赖解析 了解自动装配的优缺点 在容器中执行显式Bean查找 学习不同的Be ...

  5. 【视频分享】尚硅谷Java视频教程_Spring注解驱动开发视频教程

    <Spring注解驱动开发>是一套帮助我们深入了解Spring原理机制的教程: 现今SpringBoot.SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了S ...

  6. @value 静态变量_Spring注解驱动开发之八——@Value属性赋值、@PropertySource 加载外部配置文件...

    本文包含以下内容: 建立新的配置类 建立新的测试方法 通过@Value 进行赋值 通过@PropertySource  加载配置文件,并进行注入 拓展@Value  .@PropertySource ...

  7. Spring注解驱动开发第11讲——面试官让我说说:如何使用FactoryBean向Spring容器中注册bean?

    写在前面 经过前面的学习,我们知道可以通过多种方式向Spring容器中注册bean.可以使用@Configuration注解结合@Bean注解向Spring容器中注册bean:可以按照条件向Sprin ...

  8. 给容器中注册组件 || @Scope -- @Lazy -- @Conditional({Condition}) -- @Import--使用Spring提供的 FactoryBean

    * @Scope:调整作用域    * prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中.       *              每次获取的时候才会调用方法创建对象: ...

  9. @transactional注解_为啥同一个类中普通方法调用Spring注解方法,注解会失效?看完你就明白,So easy!...

    Spring注解(如@Transactional.@Cacheable.@Async等),在使用不当时,很可能会失效.失效的情况有很多种,本文我们就来瞅瞅,为啥同一个类中普通方法调用Spring注解方 ...

最新文章

  1. C#断点续传原理与实现
  2. 铜仁计算机专业学校,听说计算机专业的在本部啊 这是真的么
  3. libevent: linux安装libevent
  4. Open3d之python版本快速安装和使用
  5. apt-get 很有用的一个命令
  6. chart控件怎么使x轴标签全部显示出来
  7. 二级Visual Basic语言视频教程
  8. 深度学习面试题之LSTM补充
  9. java二重积分_java 版本二重积分计算
  10. 可用性设计之过载保护
  11. blast在linux上的用法
  12. Java 1.4(打印表格)编写程序,显示以下表格。
  13. python 四维数据怎么看性别_四维b超数据怎么看性别
  14. mysql怎么分组计算逾期率_Tableau分享第一篇:如何计算分组留存率(Cohort Analysis)!...
  15. 《卸甲笔记》-单行函数对比之三
  16. COSMOS认证辅导,原材料生产到成品分销的各个环节预防和安全原则的约束
  17. ALCATEL分机转接分机或手机设置
  18. 【已解决】Windows10安装报:Windows检测到EFI系统分区格式化为NIFS,将EFI系统分区格式化为FAT32,然后重新启动安装
  19. 域名该怎么玩?域名玩法介绍
  20. 客户机-服务器系统通信

热门文章

  1. 当刻度嘟嘟和网易云信在一起...
  2. 项目管理 - 学习总目录
  3. Linux CentOS 7下 Apache Tomcat 7 安装与配置
  4. 最简单的视音频播放示例7:SDL2播放RGB/YUV
  5. Jenkisn之JDK-MVN-ANT-GRADLE
  6. 使用xshell 登陆aws的ec2
  7. 企业批量部署RealVNC远程控制软件
  8. 【原创】自动更新程序2--更新程序的主窗体(技术:spring.net+三层架构+webservice+IrisSkin2换肤)...
  9. wind2008中如何显示隐藏文件/夹
  10. Exchange数据保护