Spring源码学习(一) | 源码结构以及Spring容器内部成员概述

前言

       Spring是一款轻量级的javaee框架,它是非侵入式的开源框架。旨在业务逻辑层与其他层的解耦。本系列主要通过一个spring容器启动的demo来分析学习源码中spring容器是如何加载bean到容器等相关知识。本文则概述源码结构和spring容器包含的大体成员及作用来为后续学习做准备。

源码结构

在这里插入图片描述
Spring框架是一个分层框架,包含一系列的功能。从上述图可以看到源码有20多个模块提供功能。下面引用的他人的博客的内容,其中内容为翻译的spring官网已经十分详细,这里偷个懒直接引用了。

博文地址:Spring整体架构与核心技术
在这里插入图片描述

1.1 核心容器(Core Container)

  • spring-core 主要包含Spring框架基本的核心工具类
  • spring-beans 包含访问配置文件、创建和管理bean以及进行IoC/DI操作的相关类. BeanFactory
  • spring-context 构建与Core和Beans之上,继承了Beans的特性,扩展添加了国际化、时间传播、资源加载和对Context的创建和支持。ApplicationContext
  • spring-expression提供 一个强大的表达式语言用于在运行时查询和操作对象,该语言支持设置/获取属性值,属性的分配,方法的调用,访问数组上下文、容器和索引器、逻辑和算是运算符、命名变量以及从Spring的容器中根据名称检索对象

1.2 AOP和Instrumentation
包含模块spring-aop, spring-aspects, spring-instrument, spring-instrument-tomcat

  • spring-aop 提供了一个AOP联盟标准的面向方面编程的实现,它允许你定义方法拦截器与切入点,从而将逻辑代码与实现函数进行分离。
  • spring-aspects 提供了与AspectJ的集成
  • spring-instrument 提供了类工具的支持与classloader的实现,以便在特定的应用服务上使用。
  • spring-instrument-tomcat 包含了spring对于Tomcat的代理

1.3 消息(Messaging)
spring framework 4 包含了spring-messaging模块,其中使用了来自于spring integration项目的关键抽象,如Message, MessageChannel, MessageHandler等,他们可以作为基于消息的应用服务的基础。该模块还包含了一组可将消息映射到方法的注解,类似于spring-mvc的编程模型.

1.4 数据访问/集成(Data Access/ Integration)
包含spring-jdbc, spring-tx, spring-orm, spring-oxm, spring-jms.

  • spring-jdbc 提供了JDBC抽象层,消除了冗长的JDBC编码和解析数据库厂商特有的错误代码.
  • spring-tx 为实现了特定接口的类提供了可编程的声明式事务管理支持,对所有的POJOs都适用
  • spring-orm 提供了对象相关映射(ORM)集成,包含JPA, JDO, Hibernate,使用spring-orm模块可以将这些框架与spring提供的特性结合在一起使用,比如事务管理.
  • spring-oxm 提供了对Object/Xml Mapping实现的抽象,包括JAXB,Castor, XMLBeans, JiBX以及XStream.
  • spring-jms 包含了一些生产和消费消息的特性,从spring Framework 4.1开始,提供了与spring-messaging集成.

1.5 Web
包含spring-web, spring-webmvc, spring-websocket, spring-webmvc-portlet

  • spring-web提供了基于面向web集成的特性,如多文件上传功能、通过servlet listener初始化IoC容器与面向web的ApplicationContext,它还包含了HTTP客户端与Spring远程支持的web相关的部分.
  • spring-webmvc(又名web-servlet)包含了Spring对于Web应用的MVC与REST实现,Spring MVC框架提供了领域模型代码和Web表单之间的分离,并集成了Spring框架的所有其他特性.
  • spring-webmvc-portlet(又名web-portlet)提供了基于Portlet环境使用MVC的实现.

1.6 Test
spring-test模块通过Junit或TestNG对spring的组件提供了单元测试和集成测试

Spring容器启动简单demo

demo比较简单,一共3个类。后续主要详细学习test类中,spring容器启动的整个流程分析,即如下流程:

  • AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
  • context.register(AppConfig.class);
  • context.refresh();

1.配置类AppConfig

@Configuration
@ComponentScan("com.demo")
public class AppConfig {
}

2.dao类

@Component
public class UserDaoImpl {
	public void test(){
		System.out.println("this is tets asdasd a你好啊啊啊啊啊啊啊啊啊啊啊啊啊=========");
	}
}

3.Test测试类

	@org.junit.Test
	public void test1(){
		// DefaultListableBeanFactory
		// 实例化工厂,准备reader和scanner
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();

		// 把AppConfig类注册为一个BeanDefinition,然后放到DefaultListableBeanFactory的beanDefinitionMap里面
		context.register(AppConfig.class);

		// 准备好bean工厂,实例化对象
		context.refresh();

		UserDaoImpl dao = (UserDaoImpl) context.getBean("dao");
		dao.test();
	}

Spring容器包含成员以及作用概述

在这里插入图片描述
首先引用子路老师的图,大佬就是大佬。站在巨人的肩膀上,我们也许才能看得更远。

在这里插入图片描述
下面简要介绍一下这个图。图左边红色框是整个spring容器,即为AnnotationConfigApplicationContext,右边是spring容器里面包含的内容以及作用(根据颜色对应)。

Spring容器中包含

  • AnnotatedBeanDefinitionReader:是一个BeanDefinition读取器,给一个类给他,他帮你转换成为BeanDefinition,但是这个对象只能读取加了注解的类
  • ClassPathBeanDefinitionScanner:能够扫描一个类、包,并且转换成BeanDefinition
  • DefaultListableBeanFactory:spring环境中的一个工厂,如果需要生产bean就需要原料和机器

DefaultListableBeanFactory

  • BeanDefinition:一个bean的描述,简称bd
  • BeanDefinitionMap:一个map,里面存的是bean的名字和bean的描述(即BeanDefinition)
  • beanDefinitionNames:是一个list存放所有的beanName

其他概念:

BeanDefinitionRegistry:等同于DefaultListableBeanFactory,把一个BeanDefinition放到BeanDefinitionMap

BeanDefinitionHolder:是一个map,主要用于方便传参数

BeanExpressionResolver:解析bean的表达式,比如jsp中el表达式等等。

我们也可以从源码简单看一下:
在这里插入图片描述
在这里插入图片描述
由图可看出:AnnotationConfigApplicationContext含有AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner,然后它继承GenericApplicationContext,当然也包含GenericApplicationContext中的DefaultListableBeanFactory

       由此,本文着重介绍spring容器成员的一些概念以及作用,有个初步印象。后续深入学习的时候遇到了相关成员可返回进行查看。本文介绍到此,下一篇将会开始分析学习spring容器启动的流程。


上一篇:搭建spring源码环境
下一篇:Spring源码学习(二) | 主流程分析

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值