kuriyame

spring学习笔记

Spring 概述:
1、简介:
轻量级概念:不需要依赖第三方软件,只需jar包和服务
分层的full-stack轻量级开源框架,以IOC and AOP为内核,提供了展现层(SpringMVC)和业务层事物管理等众多企业级应用技术,可以整合更多优秀的第三方框架和类库
Spring 官方网址:http://spring.io
经常说的spring框架 通常指的是 Spring Farmework
2、优势
一:方便解耦,简化开发
二:AOP编程的支持(面向切面编程)
三:声明式事物的支持
四:方便程序测试 (非容器依赖的方式进行测试)
五:方便集成各种优秀框架
六:降低javaEE API的使用难度(底层代码进行很多的封装)
七:源码是讲点的java学习范例
3、核心结构:spring框架是非常清晰的模块化结构。

IOC编程思想:(注:IOC and AOP 并非spring提出的,之前就存在,spring在技术层次把这两个思想做了非常好的实现)
1、IOC的概念(控制反转)技术思想
描述的事情:java开发领域对象的创建,管理问题
IoC解决方式:不用自己去new 对象,由IoC容器去帮助我们实例化对象并管理它,需要使用是,则直接由IoC容器提供
2、控制反转:
控制:指的是对象创建(实例化、管理)的权利
反转:控制权交给外部环境了(spring框架、IoC容器)
3、IOC解决了什么问题:对象之间的耦合问题
例:当一个接口,有多个实现类是,正常的是通过new 不同的实现类,表示对接口类的依赖(强耦合)
IOC思想是:只需引入一个IOC容器提供的接口类即可,具体实现由IOC容器完成
4、IOC和DI(依赖注入)的区别
描述的事情均为对象实例化及依赖关系维护
IOC:对象的角度,对象实例及其管理的权利交给了容器
DI:容器的角度,容器会把对象依赖的其他对象注入
例:A对象中存在B对象的属性:IOC方式创建A时,是交给容器去创建,DI的思想是,A的新建需要B,则会通过容器将B对象注入到A中

AOP编程思想:
1、AOP的概念 (Aspect oriented Programming)是OOP的延续。OOP的特性:封装、继承、多态
OOP是一种垂直继承体系,可以解决大部分的代码重复问题,但是如果在顶级父类中出现多个方法中重复代码,AOP则无法解决
横切逻辑代码使用场景有限:一般是事务控制,权限校验,日志
横切逻辑代码问题:1、横切代码重复问题 2、横切逻辑代码和业务代码混杂在一起,代码臃肿,不好维护
AOP:提出横向抽取机制,将横切逻辑代码和业务逻辑代码分切
2、AOP在解决什么问题
在不改变业务逻辑的情况也,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复
3、为什么叫面向切面编程
切:横切逻辑,原有业务代码不能动,只能操作横切逻辑代码,所以面向横切伙计
面:横切逻辑代码往往影响的是多个方法,每个方法如同一个点,多点构成面,形成面的概念

 

springIOC源码
好处:提高架构思维,深入理解框架
原则:
定焦原则,抓主线
宏观原则:站在上帝视角,关注源码接口和业务流程(淡化代码的编写细节)
方法:1、断点(调用观察栈)2、反调3、经验doXXX
反编译文件和源码可能会有出入 反编译的时候可能会失真
spring源码构建:GitHub下载源码 安装gradle(5.6.3)
编译过程:spring-core spring-oxm spring-context spring-beans spring-aspects spring-aop tasks--->other--->compileTest.java

springIOC容器初始化主体流程:
ApplicationContext:容器的高级接口。spring应用上下文,官方称之为IOC,map是单例池,只是一个成员
beanFactory:
多态的方法:getBean() 根据不同的参数去获取bean
getBeanProvider
containsBean
isSingleton
massgeSource:国际化
resourceLoader:文件读取

一个顶级父类:多个功能拆分,根据自己所需实现对应的接口即可

IOC创建管理Bean对象,spring Bean是存在生命周期的
构造器执行、初始化方法执行、Bean后置处理器的before/after方法、:AbstractApplicationContext#refresh#finishBeanFactoryInitialization
Bean工厂后置处理器初始化、方法执行:AbstractApplicationContext#refresh#invokeBeanFactoryPostProcessors
Bean后置处理器初始化:AbstractApplicationContext#refresh#registerBeanPostProcessors

AbstractApplicationContext中的refresh方法
1、prepareRefresh();
刷新前的预处理
表示在真正做refresh操作之前需要准备做的事情:
设置Spring容器的启动时间,
开启活跃状态,撤销关闭状态
验证环境信息里一些必须存在的属性等
2、ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
获取BeanFactory;默认实现是DefaultListableBeanFactory
加载BeanDefition 并注册到 BeanDefitionRegistry
创建工厂,加载xml中的配置,转换为BeanDefition,并注册到BeanDefitionRegister
3、prepareBeanFactory(beanFactory);BeanFactory的预准备工作(BeanFactory进行一些设置,比如context的类加载器等)
4、postProcessBeanFactory() beanFactory完成后的后置处理工作(可以实现自己去写逻辑)
5、invokeBeanFactoryPostProcessors()实例化实现了BeanFactoryPostProcessor接口的Bean,并调用接口方法
6、registerBeanPostProcessors(beanFactory);注册BeanPostProcessor(Bean的后置处理器),在创建bean的前后等执行
7、initMessageSource();初始化MessageSource组件(做国际化功能;消息绑定,消息解析);
8、initApplicationEventMulticaster();初始化事件派发器
9、onRefresh(); 子类重写这个方法,在容器刷新的时候可以自定义逻辑;如创建Tomcat,Jetty等WEB服务器
10、registerListeners(); 注册应用的监听器。就是注册实现了ApplicationListener接口的监听器bean
11、finishBeanFactoryInitialization(beanFactory);
初始化所有剩下的非懒加载的单例bean
初始化创建非懒加载方式的单例Bean实例(未设置属性)
填充属性
初始化方法调用(比如调用afterPropertiesSet方法、init-method方法)
调用BeanPostProcessor(后置处理器)对实例bean进行后置处理
12、finishRefresh(); 结束

BeanDefition加载解析及注册流程;
getNamespaceHandlerResolver()处理xml配置中标签的的前缀
BeanDefitionMap会缓存beanName,BeanDefition
BeanDefitionBeanNames 会缓存 beanName
aliasmap会缓存 别名,BeanDefition

Bean的创建流程:
非抽象,非延迟加载,单例才会进行加载

循环依赖问题:循环引用,两个或两个以上的bean互相持有对方,形成闭环
场景:构造器注入 field属性循环注入
无法解决场景:单例bean的构造器参数循环依赖 prototype原型bean循环依赖
可解决的场景:单例bean的set注入/autowired注入的
解决原理:三级缓存机制
一级:单例池(成型的springBean缓存)
二级:early
三级:singletonFactorys

对象实例化立马放到三级缓存:目的:提前暴露出去
示例:springBeanA springBeanB 互相依赖
A创建过程中,对象实例化立马放到三级缓存,发现依赖于B,就会创建B,B在创建过程中发现依赖于A,去三级缓存中使用尚未成型的A,并放到二级缓存中,B创建完成放到一级缓存中,A再使用一级缓存中的B,A创建完成放到一级缓存中

posted on 2021-08-17 00:30  kuriyame  阅读(50)  评论(0编辑  收藏  举报

导航