spring核心容器中分为几个模块 :
- Spring Core : 它是框架最基础的部分,提供了IOC控制反转,对Bean进行管理
- Spring Context : 他继承了BeanFactory,提供上下文信息,扩展出JNDI,EJB,电子邮件,国际化等功能
- Spring Dao : 提供了JDBC的抽象层,以及声明事物的管理方法
- Spring ORM : 主要是提供一些JPA,MyBatis等映射层
- Spring AOP : 面向切面编程,能够在除业务逻辑之外提供一些事物,日志,安全的处理
- Spring Web MVC : 提供了web应用的模型-视图-控制器的全功能实现
spring是一个开源的轻量级的容器架构,能够帮我们承载具体的bean对象,它里面提供了IOC的控制反转以及AOP的面向切面编程,首先 :
IOC : 在我们没有引入IOC的时候,一个对象A依赖对象B,那么对象A实例化的时候必须去创建对象B,也就是对象的创建,销毁其控制权都是在自己的手上,那么引入IOC之后,就从一种主动变成了被动的形式
那么在IOC控制反转之后获取对象的过程叫做依赖注入,那么依赖注入的方式有: set注入,构造器注入,注解注入
AOP : 他是指在一个系统里面包含了很多的组件,每一个组件都会去实现一个功能,但是出去我们自身的业务逻辑之外还会有事物,日志,安全的处理,那么AOP能够在这些业务逻辑中去做其他的事情,也就是在代码执行前执行后可以去做一下日志,安全,事物的处理, 它里面提供了两个动态代理
1. JDK动态代理 : 目标对象必须去实现业务接口
2. CGLIB动态代理 : 对目标对象生成的子类并覆盖其中的方法,采用继承的方式去实现,所以他不能处理一些 final修饰的类进行代理
在spring中的执行流程大致 :
1. (通过xml配置文件得到BeanDefinition) :在spring中的大部分功能都是以配置文件作为切入点,通过XmlBeanDefinitionReader 对文件进行读取,解析以及注册,最终得到BeanDefinition的Bean的定义信息(从解析xml文件到BeanDefinition还有许多复杂的过程)
XML文件的解析流程 :
2.1 通过去继承AbstractBeanDefinitionReader中的方法,使用RourceLoader将资源文件路径转换为对应的Resource文件
2.2 通过DocumentLoader对Resource文件进行转换,将Resource文件转换为Document文件
2.3 通过实现接口BeanDefinitionDocumentReader的DefaultBeanDefinitionDocumentReader类对Document进行解析,并使用BeanDefinitionParserDelegate对Element进行解析
Bean的生命周期主要分为五步 :
1. (通过反射API创建Bean实例) : 实例化 : 通过反射实例化对象,实例化一个Bean对象;Bean实例化时机分为两个 :
1.1 BeanFactory管理的Bean是在使用Bean时才会去实例化
1.2 ApplicationContext管理的Bean是在容器初始化时就会完成Bean的实例化
实例化过程 :
创建一个applicationContext容器,getBean时是通过Bean的名称和注解去容器中获取bean的,如果找到了那么就直接返回,没有找到那就进行创建
2. 属性赋值 : 设置相关的属性和依赖
3. 初始化 : 配置文件中的Bean定义包含
init-method
属性,该属性的值将解析为Person类中的方法名称,初始化的时候会调用这个方法3.1 初始化前 : 检查Aware的相关接口并设置相关依赖 ; BeanPostProcessor前置处理
3.1.1 实现了
BeanNameAware
接口,通过传递Bean的名称来调用setBeanName()
方法3.1.2 实现了
BeanFactoryAware
接口,通过传递BeanFactory对象的实例来调用setBeanFactory()
方法3.1.3 实现了BeanPostProcessor接口,在初始化之前调用用
postProcessBeforeInitialization()
方法3.1.4 实现了
InitializingBean
接口,在设置了配置文件中定义的所有Bean属性后,调用afterPropertiesSet()
方法3.2 初始化 : 是否实现了InitailizinBean接口 ; 是否配置自定义的init- method
3.3 初始化后 : BeanPostProcessor 后置处理
Bean Factory对象如果附加了Bean 增强处理器,就会调用
postProcessAfterInitialization()
方法初始化完成
4.销毁 : Bean的使用前注册销毁相关的回调接口(Destruction) --- 使用中 --- 实现DestructionBean接口(当Application不再需要Bean引用时,将调用
destroy()
方法) --- 如果配置文件自定义的destory-method属性就会调用相应的方法销毁
Spring怎么解决依赖循环问题 : spring的依赖循环包括构造器和setter循环依赖
- 构造器依赖循环 : 关于这个问题是无法进行解决的,只能抛出BeanCurrentlyInCreationException
Spring的执行流程可以概括为以下步骤:
1. 加载配置文件:Spring通过配置文件或注解等方式加载应用程序的配置信息。
2. 初始化IoC容器:Spring会根据配置文件或注解等方式创建IoC容器,并将容器管理的Bean实例化、配置和组装。
3. Bean的生命周期:Spring容器管理的Bean的生命周期包括实例化、属性注入、初始化和销毁等过程。
4. 处理请求:Spring通过控制器等组件接收请求,并根据请求调用相应的服务处理业务逻辑。
5. 返回响应:Spring将处理结果返回给客户端,并进行视图渲染等操作。
Bean的声明周期包括以下阶段:
1. 实例化:当Spring容器启动时,根据配置文件或注解等方式创建Bean的实例。
2. 设置属性:Spring容器将配置文件或注解中的属性值注入到Bean实例中。
3. 初始化:当Bean实例创建完成并注入属性后,Spring容器会调用Bean的初始化方法进行一些额外的初始化处理。
4. 使用:Bean实例被放入IoC容器中进行管理,可以在整个应用程序中被调用和使用。
5. 销毁:当Spring容器关闭时,会调用Bean的销毁方法进行一些收尾工作,如释放资源等。