4-Spring源码解析之this()(1)——AnnotatedBeanDefinitionReader

1. 程序入口

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);

2. AnnotationConfigApplicationContext类有参构造器

其中MainConfig类是自己写的配置类,我们从这一行代码来开始分析。Spring容器先从这一行代码开始来创建AnnotationConfigApplicationContext类型的容器,利用类型构造器来创建对象。下面来看一下这个有参构造器方法执行了哪些操作。

	public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
   
		this();  // 1.
		register(annotatedClasses);  // 2.
		refresh(); // 3.
	}

第一行:this();:调用AnnotationConfigApplicationContext的无参构造器
第二行:register(annotatedClasses):对传入的配置类进行预处理与解析
第三行:refresh():容器的创建与刷新

3. AnnotationConfigApplicationContext类的this()方法

3.1 依次调用父类的构造方法

我们先看一下AnnotationConfigApplicationContext类的类结构

在这里插入图片描述

由于AnnotationConfigApplicationContext类的父类是GenericApplicationContext类,因此在有参构造器中调用this()时,首先执行父类GenericApplicationContext类的构造器,那么我们先看看GenericApplicationContext类的构造器。

	private final DefaultListableBeanFactory beanFactory;
	public GenericApplicationContext() {
   
		this.beanFactory = new DefaultListableBeanFactory();
	}

在这个构造器中,首先初始化一个DefaultListableBeanFactory类型的对象,Spring加载的所有Bean都会放到DefaultListableBeanFactory中

当然DefaultListableBeanFactory类在执行构造方法的时候先调用其父类AbstractBeanFactory的构造器,AbstractBeanFactory在执行构造方法的时候先调用父类DefaultResourceLoader类型的构造器。整个顺序就是上面类图的顺序。

	public AbstractApplicationContext() {
   
		this.resourcePatternResolver = getResourcePatternResolver();
	}

    public DefaultResourceLoader() {
   
        this.classLoader = ClassUtils.getDefaultClassLoader();
    }
3.2 AnnotationConfigApplicationContext类的this()方法

当父类方法全部调用对应的无参构造器后,我们来返回看AnnotationConfigApplicationContext类的this()方法。

	public AnnotationConfigApplicationContext() {
   
		// BeanDefinition读取器. BeanDefinition是描述bean注册的信息
		this.reader = new AnnotatedBeanDefinitionReader(this);
		// 创建BeanDefinition扫描器
		this.scanner = new ClassPathBeanDefinitionScanner(this);
	}

this.reader = new AnnotatedBeanDefinitionReader(this)中,传入的参数为this,而this的类型即当前类的类型,即:AnnotationConfigApplicationContext类型。

3.3 this() 中调用 的AnnotatedBeanDefinitionReader构造器
	public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
   
		this(registry, getOrCreateEnvironment(registry));
	}

	private static Environment getOrCreateEnvironment(BeanDefinitionRegistry registry) {
   
		Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
		if (registry instanceof EnvironmentCapable) {
   
			return ((EnvironmentCapable) registry).getEnvironment();
		}
		return new StandardEnvironment();
	}

	public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
   
		Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
		Assert.notNull(environment, "Environment must not be null");
		this.registry = registry;
		this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
		// 注册注解配置的处理器。即项目中我们标注注解的类由下面注册的处理器解析
		// 3.4 分析该方法
		AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
	
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
dynamic-datasource-spring-boot-starter 是一个基于 Spring Boot 的动态数据源库。它提供了在运行时动态切换数据源、动态创建数据源以及多租户的支持。 对于 dynamic-datasource-spring-boot-starter源码分析,可以从以下几个方面进行思考: 1. 数据源的自动装配:源码中可能会使用 Spring Boot 的自动配置功能,通过扫描配置类或者注解的方式,自动将数据源相关的类和 bean 注入到应用程序中。 2. 动态切换数据源的实现:动态切换数据源是 dynamic-datasource-spring-boot-starter 的核心功能之一。源码中可能会涉及到 AOP、动态代理等技术,通过拦截器或者代理的方式,在运行时根据特定条件切换数据源。 3. 动态创建数据源的实现:动态-datasource-spring-boot-starter 提供了在运行时动态创建数据源的功能。源码中可能会包含一些工厂类或者构建者模式的实现,根据配置信息动态创建数据源实例。 4. 多租户支持的实现:多租户是指一个系统可以同时服务于多个不同的客户或租户。dynamic-datasource-spring-boot-starter 也提供了对多租户的支持。源码中可能会包含一些多租户相关的类和逻辑,如解析请求或者从配置文件中获取租户信息等。 总结来说,dynamic-datasource-spring-boot-starter 源码分析涉及到数据源的自动装配、动态切换数据源的实现、动态创建数据源和多租户支持等方面的内容。可以通过阅读源码来深入了解其实现原理和技术细节,从而更好地使用和定制该库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值