【笔记】Spring是什么

发布时间:2023年12月21日

什么是spring?

Spring的基础知识铺垫

IOC AOP<-Spring->容器->生态

先说你的认知,总-分结构
spring是一个基础的框架,同时提供了Bean的容器,用来方便装载具体的Bean对象,之前在使用对象的时候必须自己new,而现在只要告诉容器有哪些对象他会帮我们创建好,并且维护好整个的生命周期。我们在spring的基础上还有SpringBoot、SpringCloud都是在此基础上。
分:
1、什么是IOC?什么是AOP?
IOC表示控制反转,原来我们需要自己去创建对象,并且交由容器去管理控制对象,AOP表示面向切面编程,跟业务逻辑无关的代码能通过AOP来实现,比如说工作中的日志、事务管理都是通过AOP来实现的。也就是说具体的业务逻辑不变,扩展的时候通过AOP的声明通知、具体方法的前置后置Around等添加与业务无关的代码。
2、IOC、AOP如何实现?生命周期、循环依赖?

Spring加载注解和配置文件概述

1、Spring容器简介

Spring中有一个容器,容器中间有多个map对象
在这里插入图片描述

2、Spring加载注解和配置文件

spring源码的xml与注解转换成了BeanDefinition对象

在这里插入图片描述

3、在此中间考虑了扩展性,增加了接口 约束规范

BeanDefinitionReader,只要实现了这个接口就不限于xml、注解、还能增加properties等等去实现bean的定义信息
在这里插入图片描述
(题外话)抽象类与接口的区别
抽象是自下向上,接口是自上向下
在这里插入图片描述

4、spring的扩展接口-BeanFactoryPostProcessor

首先要从BeanDefiniton直接到创建Bean对象,首先想到的思路是反射。
反射
1、获取对象Class clazz=class.forName
2、获取构造器Constructor ctor=clazz.getDeclareConstructor()
3、创建对象
ctor.newInstance()
在这里插入图片描述
但是,理论上直接BeanDefiniton通过反射创建Bean对象,不就能解决问题了吗?别着急,上面图片中的xml文件的property属性中有若干占位符需要替换进去,需要解决这个问题,就不能直接用反射
当我们要创建BeanDefinition后,创建bean对象之前,需要替换jdbc.username这些参数,需要PostProcessor(增强器,提供某些额外的扩展功能)
在这里插入图片描述
上面说的针对的操作对象不同:
BeanFactory代表访问Spring Bean容器的根接口
Bean代表对象
在这里插入图片描述
postProcessor处理了占位符,比如刚刚说的jdbc.username,生成完整的BeanDefinition对象
由于BeanFactory是顶级接口,

5、Bean的生命周期

从对象的创建到销毁的过程,粗略来说就是Bean对象的创建、使用、销毁。
在这里插入图片描述

第一步,实例化在堆空间中申请空间,此时对象的属性值一般是默认值,反射创建对象的过程createBeanInstance
在这里插入图片描述
发现下面的三步,不就是反射的三步骤吗?获取class对象,获取构造器,newInstance。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二、三步,初始化(自定义属性赋值,populateBean)、容器对象属性赋值(Aware就是一个标志,实现接口,能在统一的方法进行处理,invokeAwareMethods)

Spring中的Bean对象按照使用者分为几类?
1.我们的自定义对象;

2.容器对象;(不是我们要用的,是容器在创建过程中要使用的对象),例如:BeanFactory、ApplicationContext、Environment;

在这里插入图片描述
理论上到此前三步搞定,对象的创建和属性的赋值都完成了,就做了new一个对象,然后set参数,对象能拿来使用了,但是注意spring要考虑扩展性。


第四步,postProcessor-做Bean对象的扩展实现
在这里插入图片描述

前置方法,什么都没有
在这里插入图片描述
后置方法,一路点下去
在这里插入图片描述

在这里插入图片描述

所以结论:AOP其实就是IoC整体流程(Bean生命周期)里的一个扩展点
第五步,InitializingBean——执行初始化方法
在这里插入图片描述
至此图上的7个步骤都处理结束,接着就能使用Bean对象


使用对象
context.getBean()

销毁Bean对象(不用)
在这里插入图片描述
我们开发用不到销毁容器的代码,所以不用管

文章来源:https://blog.csdn.net/weixin_43914278/article/details/135100431
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。