Spring源码窥探之:ImportBeanDefinitionRegistrar
1. 编写实现ImportBeanDefinitionRegistrar的类
/**
* description
*
* @author 70KG
* @date 2018/11/13
*/
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
// 获取容器中已经存在的Bean的名字
boolean definition1 = registry.containsBeanDefinition("com.nmys.story.springCore.springioc.importBean.Cat");
boolean definition2 = registry.containsBeanDefinition("com.nmys.story.springCore.springioc.importBean.Dog");
if (definition1 && definition2) {
// 将需要放入容器中的Bean用RootBeanDefinition来包装一下。
RootBeanDefinition beanDefinition = new RootBeanDefinition(Pig.class);
// 向容器中注册这个Bean,并给定一个名字。
registry.registerBeanDefinition("pig", beanDefinition);
}
}
}
以上代码的意思是,从容器中尝试获取Cat和Dog,如果两者都存在,那么就向容器中注入Pig类。有条件,有选择性的向容器中注入Bean
2. 配置类
/**
* description
*
* @author 70KG
* @date 2018/11/13
*/
@Configuration
@Import(value = {Cat.class, Dog.class, MyImportBeanDefinitionRegistrar.class})
public class MyImportBeanDefinitionRegistrarConfig { }
3. 测试类
/**
* description
*
* @author 70KG
* @date 2018/11/13
*/
public class Test02 { @Test
public void test() { // IOC容器创建(容器类似一个Map)
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MyImportBeanDefinitionRegistrarConfig.class); System.out.println("IOC容器初始化完成。。。。。"); // 从容器中获取所有的bean的ID
String[] definitionNames = ac.getBeanDefinitionNames(); for (String name : definitionNames) {
System.out.println("------->" + name);
} } }
4. 结果
IOC容器初始化完成。。。。。
------->org.springframework.context.annotation.internalConfigurationAnnotationProcessor
------->org.springframework.context.annotation.internalAutowiredAnnotationProcessor
------->org.springframework.context.annotation.internalRequiredAnnotationProcessor
------->org.springframework.context.annotation.internalCommonAnnotationProcessor
------->org.springframework.context.event.internalEventListenerProcessor
------->org.springframework.context.event.internalEventListenerFactory
------->myImportBeanDefinitionRegistrarConfig
------->com.nmys.story.springCore.springioc.importBean.Cat
------->com.nmys.story.springCore.springioc.importBean.Dog
------->pig
Spring源码窥探之:ImportBeanDefinitionRegistrar的更多相关文章
- Spring源码窥探之:注解方式的AOP原理
AOP入口代码分析 通过注解的方式来实现AOP1. @EnableAspectJAutoProxy通过@Import注解向容器中注入了AspectJAutoProxyRegistrar这个类,而它在容 ...
- Spring源码窥探之:声明式事务
1. 导入驱动,连接池,jdbc和AOP的依赖 <!-- c3p0数据库连接池 --> <dependency> <groupId>c3p0</groupId ...
- Spring源码窥探之:AOP注解
AOP也就是我们日常说的@面向切面编程,看概念比较晦涩难懂,难懂的是设计理念,以及这样设计的好处是什么.在Spring的AOP中,常用的几个注解如下:@Aspect,@Before,@After,@A ...
- Spring源码窥探之:@Profile
Spring为我们提供的多环境启动 1. 配置类,注入三个不同环境的数据源,并加上注解 /** * description: 以下准备了三套不同环境的数据源 * * @author 70KG * @d ...
- Spring源码窥探之:Spring AOP初步使用
AOP即面向切面编程.它的底层实际是用了spring的动态代理,具体是JDK的代理还是CGLIB的代理,就视情况而定了.本博客园仅仅作为平时记录,显得有些杂乱无章,如果想了解动态代理,设计模式,请访问 ...
- Spring源码窥探之:@Value
1. 首先定义实体 /** * @author 70KG * @Title: Apple * @Description: 苹果实体 * @date 2018/10/22下午9:26 * @From w ...
- Spring源码窥探之:BeanPostProcessor
Spring的Bean后置处理器 1. 实体类 /** * @author 70KG * @Title: Train * @Description: * @date 2018/7/23下午11:31 ...
- Spring源码窥探之:Spring AOP初步
AOP(Aspect Oriented Programming):即我们常说的面向切面编程. 什么是AOP?AOP是在我们原来写的代码的基础上,进行一定的包装,比如在方法执行前.方法返回后.方法抛出异 ...
- Spring源码窥探之:单实例Bean的创建过程
finishBeanFactoryInitialization(beanFactory);初始化剩下的所有的单实例(非懒加载)Bean(Instantiate all remaining (non-l ...
随机推荐
- SpringMVC的拦截器讲解
Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 用户可以自己定义一些拦截器来实现特定的功能. 谈到拦截器,还要向大家提一个词 ...
- 移动测(APP)试与web端测试的区别
1.操作环境不同 移动端的测试环境是安卓操作环境或者iOS操作系统: web端操作环境一般是windows(如果你用的是MC电脑,那就是iOS操作系统). 2.页面的显示尺寸不同 移动端的尺寸比较多, ...
- url与uri区别
url属性: 是要求按照url的写法来写地址 URL:Uniform Resource Locator 统一资源定位符.它是可以唯一标识一个资源的位置 写法: http://localhost:808 ...
- 在Python中创建和使用类
编程只是 if : 为了少写重复的代码,有了循环 for/while: 但碰到很长的重复代码,可能用一个循环难以实现,所以出现了面向对象的思想: 类:就是你的循环主体 实例:就是对你的循环的一次调用 ...
- 高仿linux下的ls -l命令——C语言实现
主要用到的函数可以参考头文件,仅仅支持ls -l这功能,扩展就交给大家了0.0 相关测试图片: 话不多说,直接上码 #include <stdio.h> #include < ...
- SpringCloud之Hystrix集群及集群监控turbine
目的: Hystrix集群及监控turbine Feign.Hystrix整合之服务熔断服务降级彻底解耦 集群后超时设置 Hystrix集群及监控turbine 新建一个springboot工程mic ...
- SpringCloud之Ribbon负载均衡及Feign消费者调用服务
目的: 微服务调用Ribbon Ribbon负载均衡 Feign简介及应用 微服务调用Ribbon Ribbon简介 1. 负载均衡框架,支持可插拔式的负载均衡规则 2. 支持多种协议,如HTTP.U ...
- python MySQL 插入Elasticsearch
一.需求分析 注意: 本环境使用 elasticsearch 7.0版本开发,切勿低于此版本 mysql 表结构 有一张表,记录的数据特别的多,需要将7天前的记录,插入到Elasticsearch中, ...
- yum安装k8s集群
k8s的安装有多种方式,如yum安装,kubeadm安装,二进制安装等.本文是入门系列,只是为了快速了解k8s的原理和工作过程,对k8s有一个快速的了解,这里直接采用yum安装 的1.5.2为案例进行 ...
- ADO.NET 三(Command)
操作数据库需则要用到 Command 类中提供的属性和方法.下面来介绍一下如何使用 Command 类来操作数据表中的数据. Command 类概述 在 System.Data.SqlClient 命 ...