Spring源码学习(一)
一、前言
该系列博客用于记录本人学习Spring源码的过程,以Spring5.1为例。第一篇笔记不会记录太多代码相关的内容,更多的是梳理一下Spring整体的结构,本人学识有限,如果书写过程中有什么纰漏希望及时指出。
二、Spring简介
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
三、Spring核心概念
提到Spring,最核心的两个概念就是IOC(Inversion of Control,控制反转),AOP(Aspect Oriented Programming,面向切面编程)。我会首先尝试讲解IOC这个概念。通常情况下我们会将Spring的工厂称之为容器,因为在Spring中工厂不仅仅是创建对象,同时会维护整个对象的生命周期。即工厂创建了对象,同时也保存了对象所以我们会称之为IOC容器(这里我们默认Spring创建的是单例对象,即scope为singleton)。首先看一个Spring的Demo,下面的代码是一个最简单的使用Spring为我们创建对象的例子。从代码中不难看出,我们使用ApplicationContext类来获取配置好的bean,并且让Spring帮我们创建对象。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--定义一个Person对象--> <bean id="person" class="com.cmxy.entity.Person"> <property name="age" value="27"/> <property name="name" value="hardy"/> </bean> </beans>
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Person person = context.getBean("person", Person.class); System.out.println(person); }
ApplicationContext是一个高级工厂,整合了非常多不同的工厂,即ApplicationContext用于众多工厂的能力。可以看到,首先ApplicationContext是一个接口,其次继承了ListableBeanFactory、HierarchicalBeanFactory(这两个工厂后续也会讲解),因为是源码学习,所以我们需要深入底层。这里直接给出结论,Spring众多工厂中处于最底层的是BeanFacotry。
BeanFacotry(Spring工厂核心的接口!!!)
既然要学习源码就要对结构有一个大体的了解。首先看一下Spring最核心的工厂接口的继承关系。从图中不难看出BeanFacotry的众多的子接口,以及子类。例如HierarchicalBeanFactory、AutowireCapableBeanFactory、ListableBeanFactory等等一些列的。子接口是在拥有父接口所有能力的前提下,对父接口进行功能的扩展。接下来简单介绍一下BeanFacotry子接口的作用(之后会详细介绍)。
1、BeanFactory:Spring工厂体系中最底层的接口,定义了工厂的基本操作,例如获取bean、是否包含某个bean、获取Bean的类型。
2、HierarchicalBeanFactory(可继承的Bean工厂):顾名思义,该接口给工厂赋予了可继承的能力。应用:SpringMVC中的父子工厂。
3、AutowireCapableBeanFactory(自动注入Bean工厂):给工厂赋予自动注入的能力。
4、ListableBeanFactory:给工厂赋予获取相关配置信息的能力。
5、ConfigurableBeanFactory(可配置工厂):可配置Bean是否为单例、以及提供类型转换等功能。
Spring还有许多的工厂,Spring容器是由一系列的工厂组合而成,Spring的设计严格按照单一职责原则所以每个工厂各司其职,组合在一起最终形成了一个功能丰富的顶层接口(ApplicationContext),Spring为了方便我们开发,也是提供了几个集成了所有工厂能力的类,其中一个就是我们最为熟知的ApplicationContext(接口),以及XmlBeanFactory(实现类,虽然已经过期,但是后续Spring提供的替代类只不过是把这个类里的方法提取出来,所以学习源码时先按这个类)。
未完待续。。。