1. 编写实现ImportBeanDefinitionRegistrar的类

  1. /**
  2. * description
  3. *
  4. * @author 70KG
  5. * @date 2018/11/13
  6. */
  7. public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
  8.  
  9. @Override
  10. public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
  11. // 获取容器中已经存在的Bean的名字
  12. boolean definition1 = registry.containsBeanDefinition("com.nmys.story.springCore.springioc.importBean.Cat");
  13. boolean definition2 = registry.containsBeanDefinition("com.nmys.story.springCore.springioc.importBean.Dog");
  14. if (definition1 && definition2) {
  15. // 将需要放入容器中的Bean用RootBeanDefinition来包装一下。
  16. RootBeanDefinition beanDefinition = new RootBeanDefinition(Pig.class);
  17. // 向容器中注册这个Bean,并给定一个名字。
  18. registry.registerBeanDefinition("pig", beanDefinition);
  19. }
  20. }
  21. }

以上代码的意思是,从容器中尝试获取Cat和Dog,如果两者都存在,那么就向容器中注入Pig类。有条件,有选择性的向容器中注入Bean

2. 配置类

  1. /**
  2. * description
  3. *
  4. * @author 70KG
  5. * @date 2018/11/13
  6. */
  7. @Configuration
  8. @Import(value = {Cat.class, Dog.class, MyImportBeanDefinitionRegistrar.class})
  9. public class MyImportBeanDefinitionRegistrarConfig {
  10.  
  11. }

3. 测试类

  1. /**
  2. * description
  3. *
  4. * @author 70KG
  5. * @date 2018/11/13
  6. */
  7. public class Test02 {
  8.  
  9. @Test
  10. public void test() {
  11.  
  12. // IOC容器创建(容器类似一个Map)
  13. AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MyImportBeanDefinitionRegistrarConfig.class);
  14.  
  15. System.out.println("IOC容器初始化完成。。。。。");
  16.  
  17. // 从容器中获取所有的bean的ID
  18. String[] definitionNames = ac.getBeanDefinitionNames();
  19.  
  20. for (String name : definitionNames) {
  21. System.out.println("------->" + name);
  22. }
  23.  
  24. }
  25.  
  26. }

4. 结果

  1. IOC容器初始化完成。。。。。
  2. ------->org.springframework.context.annotation.internalConfigurationAnnotationProcessor
  3. ------->org.springframework.context.annotation.internalAutowiredAnnotationProcessor
  4. ------->org.springframework.context.annotation.internalRequiredAnnotationProcessor
  5. ------->org.springframework.context.annotation.internalCommonAnnotationProcessor
  6. ------->org.springframework.context.event.internalEventListenerProcessor
  7. ------->org.springframework.context.event.internalEventListenerFactory
  8. ------->myImportBeanDefinitionRegistrarConfig
  9. ------->com.nmys.story.springCore.springioc.importBean.Cat
  10. ------->com.nmys.story.springCore.springioc.importBean.Dog
  11. ------->pig

Spring源码窥探之:ImportBeanDefinitionRegistrar的更多相关文章

  1. Spring源码窥探之:注解方式的AOP原理

    AOP入口代码分析 通过注解的方式来实现AOP1. @EnableAspectJAutoProxy通过@Import注解向容器中注入了AspectJAutoProxyRegistrar这个类,而它在容 ...

  2. Spring源码窥探之:声明式事务

    1. 导入驱动,连接池,jdbc和AOP的依赖 <!-- c3p0数据库连接池 --> <dependency> <groupId>c3p0</groupId ...

  3. Spring源码窥探之:AOP注解

    AOP也就是我们日常说的@面向切面编程,看概念比较晦涩难懂,难懂的是设计理念,以及这样设计的好处是什么.在Spring的AOP中,常用的几个注解如下:@Aspect,@Before,@After,@A ...

  4. Spring源码窥探之:@Profile

    Spring为我们提供的多环境启动 1. 配置类,注入三个不同环境的数据源,并加上注解 /** * description: 以下准备了三套不同环境的数据源 * * @author 70KG * @d ...

  5. Spring源码窥探之:Spring AOP初步使用

    AOP即面向切面编程.它的底层实际是用了spring的动态代理,具体是JDK的代理还是CGLIB的代理,就视情况而定了.本博客园仅仅作为平时记录,显得有些杂乱无章,如果想了解动态代理,设计模式,请访问 ...

  6. Spring源码窥探之:@Value

    1. 首先定义实体 /** * @author 70KG * @Title: Apple * @Description: 苹果实体 * @date 2018/10/22下午9:26 * @From w ...

  7. Spring源码窥探之:BeanPostProcessor

    Spring的Bean后置处理器 1. 实体类 /** * @author 70KG * @Title: Train * @Description: * @date 2018/7/23下午11:31 ...

  8. Spring源码窥探之:Spring AOP初步

    AOP(Aspect Oriented Programming):即我们常说的面向切面编程. 什么是AOP?AOP是在我们原来写的代码的基础上,进行一定的包装,比如在方法执行前.方法返回后.方法抛出异 ...

  9. Spring源码窥探之:单实例Bean的创建过程

    finishBeanFactoryInitialization(beanFactory);初始化剩下的所有的单实例(非懒加载)Bean(Instantiate all remaining (non-l ...

随机推荐

  1. golang面对接口

  2. golang --iota 用法

    package main import "fmt" func main() { const ( a = iota //0 b //1 c //2 d = "ha" ...

  3. GRE

    第一个技术是GRE,全称Generic Routing Encapsulation,它是一种IP-over-IP的隧道技术.它将IP包封装在GRE包里,外面加上IP头,在隧道的一端封装数据包,并在通路 ...

  4. git push proxy 取消不掉 can not prox....

    使用这个折腾了半天 git config --global --unset http.proxy git config --global --unset https.proxy 没用,原来实现项目目录 ...

  5. Mybatis中三种关联关系的实现

    目录 一对一查询 一对多查询 自关联查询: 多对多查询 总结: 三种关联关系:一对多,一对一,多对多 两种查询方式:嵌套查询,连接查询(也可称作:多表单独查询,多表连接查询) 每一种关联关系都可以通过 ...

  6. Java中BIO和NIO

    同步/异步.阻塞/非阻塞概念 同步异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 同步:在发出一个 ...

  7. DEDECMS标签笔记

    注意点: 1.dede的标签不可以嵌套(除了channelartlist里面可以嵌套指定的标签),那么当需要使用{dede:global.cfg_webname/}dede标签的时候我们需要转换成[f ...

  8. 如何通过Restful API的方式读取SAP Commerce Cloud的Product图片

    需求:我在SAP Commerce Cloud的backoffice里给某product维护了一些图片: 分别位于Normal,Thumbnails和Others等字段: 现在我想通过Restful ...

  9. XnViewer管理浏览照片、图片

    有时候拍完照片想要浏览照片.浏览照片的时候想做一些标记,这个时候就需要使用照片管理器: 之前一直使用谷歌的picasa(不更新了),adobe也有个管理器(比较大):这里主要推荐一个: https:/ ...

  10. 输入web网站点击之后发生的事情

    (1)用户在浏览器(客户端)里输入或者点击一个连接: (2)浏览器向服务器发送HTTP请求: (3)服务器处理请求,如果查询字符串或者请求体里含有参数,服务器也会把这些参数信息考虑进去: (4)服务器 ...