1 Star 0 Fork 0

XingtianLiu / spring-learning

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

Spring

Spring 是分层的全栈轻量级开源框架,以 IOC 和 AOP 为内核,提供了展示层 Spring MVC 和业务层事务管理等众多企业级应用技术,还能整合第三方框架和类库,是使用最多的 JAVA EE 企业级开源框架。

IOC 和 AOP

IOC、AOP 不是 Spring 提出的,只不过之前更加偏向理论化,在技术层面 Spring 做了非常好的实现。

IOC

什么是 IOC ?

IOC 全称 Inversion of Control(控制反转),这是一个技术思想,不是技术实践。 描述的是对象的创建、管理。

在传统开发中:一个类调用另一个类,往往需要在当前类中 new 一个对象;

IOC 思想下:不需要自己 new 对象,使用 IOC 容器,帮助实例化、管理对象,需要使用时通过 IOC 容器获取;

此时我们无需考虑如何创建对象,也不需要考虑对象的创建、管理。

控制:对象创建(实例化)的权利; 反转:控制器交给外部 Spring IOC 框架,IOC 维护对象依赖关系;

图2

IOC 解决了什么问题?

解决对象之间的耦合问题,

图3

IOC 和 DI

DI:Dependency Injection (依赖注入),IOC 和 DI 都描述了对象创建和关系维护,IOC 站在对象角度,对象实例化、管理的权利交给容器,DI 站在容器的角度,对象使用时,容器会把依赖的其它对象注入;

AOP

什么是 AOP?

AOP:Aspect Oriented Programming(面向切面编程),是 OOP 的延续,OOP包含封装、继承、多态三大特性,OOP 是一种垂直继承体系,OOP 思想可以解决大多数代码重复性问题,但是有一些处理不了,在顶级父类中出现了代码重复(图6);

在多个顺序流程中,出现的相同子流程代码称为横切逻辑代码,这些子流程称为点,多个流程称为面,横切逻辑的使用很有限,比如在事务、日志、权限校验。图7

横切逻辑的问题:横切代码逻辑重复、横切代码和主题业务无关,混杂在一起代码不好维护;

AOP 独辟蹊径,提出横向抽取机制,将横切逻辑代码和业务逻辑代码分离

AOP 解决什么问题?

在不改变原有代码逻辑的前提下,增强横向逻辑代码,从根本上解耦合。

为什么叫面向切面编程?

切:原有逻辑不能动,只能操作横切逻辑代码,所以面向横切逻辑;

面:横切逻辑代码往往要影响很多方法,每个方法如同一个点,多个点构成面;

手写 IOC、AOP

Spring 使用

Bean 实例化

set方法、构造器注入

三种使用方式

纯XML

注解+XML: 第三方的jar定义在xml,自己定义的写在注解中 开启注解: <context:component-scan base-package="com.xiaoming"></context:component-scan> 引入JDBC配置: <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder> @Component、@Controller、@Service、@Repository @Autowired 按照类型注入,如果一个接口有多个实现,可以结合@Qualifier("id")

纯注解: @Configuration @ComponentScan component-scan @PropertySource property-placeholder 引入配置文件 @Value 读取配置文件属性 @Import 关联多个类 @Bean bean

高级使用

bean 延迟加载(使用时创建):

Spring IOC 默认在服务启动时实例化所有 singleton bean

xml:lazy-init="true" 或者 beans 的default-lazy-init @Lazy

不常用的对象可以延迟加载

可以查看 ApplicationContext的BeanFactory singletonObjects 数据

FactoryBean 和 BeanFactory:

BeanFactory是容器的顶级接口,定义了接口行为,负责生产、管理Bean;

Spring 的Bean 有两种:普通Bean、工厂Bean 我们可以借助FactoryBean自定义Bean的创建过程,类比Bean创建的静态方法、实例方法;

经常用于整合其他框架;

后置处理器:

BeanPostProcessor:bean对象实例化之后

BeanFactoryPostProcessor:bean实例化前,BeanFactory实例化后

SpringBean生命周期: 读取xml、反射实例化、设置属性值、调用BeanNameAware的setBeanName、调用BeanFactoryAware的setBeanFactory方法、调用ApplicationContextAware的setApplicationContext、 调用BeanPostProcessor的预初始化方法(两个方法postProcessBeforeInitialization、postProcessAfterInitialization)、调用InitialzingBean的afterPropertiesSet方法 、调用init-method方法、

如果是prototype立即交付,如果是singleton放入缓存池 销毁时调用DisposableBean的destory和destory-method方法

读取xml涉及到BeanDefinition封装xml bean标签信息

英语Aware:发现

Spring IOC 源码

原则:抓主线、关注源码解构和业务流程,淡化某一行编写细节

技巧:断点(调用栈)、反调(Find Usage)

编译:core、oxm、 context、beans、aspects、aop等等 工程-》tasks-》compilerTestJava

BeanFactory创建流程:

ApplicationContext 是容器的高级接口,BeanFactory是顶级容器,官方称为IOC容器(map IOC容器的单例池,容器是一组组件和过程的集合,不仅仅是单例池),

ApplicationContext实现: AutowireCapableBeanFactory: HierarchicalBeanFactory:父容器 ListableBeanFactory:新增批量操作接口 MessageSource:国际化 ResourceLoader:加载资源(xml、properties等等)

IOC容器创建管理Bean,Bean有生命周期, 无参构造器、初始化方法、Bean后置处理器的before/after:AbstractApplicationContext 的 finishBeanFactoryInitialization Bean工厂后置处理器:AbstractApplicationContext 的 invokeBeanFactoryPostProcessors Bean的后置处理器:AbstractApplicationContext 的 registerBeanPostProcessors

BeanDefinition加载、解析注册流程:

Bean创建流程:

延迟加载流程:

Spring IOC 循环依赖问题处理:

空文件

简介

暂无描述 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/liuxingtian/spring-learning.git
git@gitee.com:liuxingtian/spring-learning.git
liuxingtian
spring-learning
spring-learning
master

搜索帮助