- Spring
- ssh -> ssm >spring全家桶
- Spring发展历程
- EJB(IBM)->Rod Johnson(spring)Spring5.2.2
- 优势:解耦、AOP切面、声明式事务、方便测试、集成框架、降低JAVAEE API使用难度
- 核心思想
- IOC
- inversion of control(控制反转),是一个技术思想,不是实现
- 帮我们实例化对象并且管理
- 解决了对象之间的耦合问题
- Ioc和DI的区别
- DI:依赖注入 (站在容器的角度)
- AOP
- OOP:封装继承多态
- AOP是OOP的拓展
- 面向切面,在不改变原有业务逻辑,横切解耦逻辑代码,避免代码重复
- 手写IOC和AOP问题分析
- new关键字耦合问题:
- 1.除了new关键字实例化对象,还有(反射)可以实现
- Class.forName(全限定名)
- 可以把全限定名配置在xml中
- 2.使用工厂模式通过反射生产对象,工厂模式是解耦比较好的方式
- 单例模式
- 懒汉式和饿汉式
- 首先都有一个私有构造函数
- 有一个私有静态变量
- 1.懒汉式
- 私有构造和私有变量,静态工厂方法getInstance获取实例化对象
- 有线程安全问题要加synchronized关键字
- 2.饿汉式
- 私有构造,直接实例化的私有静态变量,getInstance直接返回已经实例化的对象
- BeanFactory
- 1.Map成员变量存储对象
- 2.静态块解析Xml,通过反射实例化对象存入map
- 3.提供工厂方法通过id获取Bean
- 事务问题:
- Service层没有事务控制
- 原因:使用了不同的数据库连接,解决方案让连接跟当前线程绑定,每次都获取同一个线程
- 用ThreadLocal存储连接,没有从连接池取,有直接从threadlocal取(单例模式)
- 动态代理来生成业务的代理对象,处理异常控制事务
- Spring容器方式
- 1.XmL模式
- BeanFactory是springIOC容器的顶级接口。ApplacationContext是子接口、
- Web应用在web.xml配置contextloaderlistener监听器
- 2.xml结合注解模式
- 第三方Jar用xml,自己定义的用注解
- xml配置注解扫描
- <context:component-scan base-package="">
- @Auotwired注解
- 按照类型注入,如果容器无法唯一锁定对象可以加@Qualifier("xxx")指定具体的Id
- @Resource注解按照名称注入(不推荐使用,jdk11已经移除)
- SpringBean的生命周期
- 1.实例化bean(如通过反射)
- 2.设置属性值
- 3.调用BeanNameAware的setBeanName
- 4.调用BeanFactoryAware的setbeanfactory方法
- 5.调用ApplicationContextAware的setApplicationContext
- 6.调用beanpostProcessor的预初始化方法
- 7.调用initializiingbean的afterprorertiesSet方法
- 8.调用定制的初始化方法init-method
- 9.调用Beanpostprocessor的后初始化方法
- 10.单例还会调用destorymethod
- BeanDefinition封装配置信息
- 源码分析
- 1.定焦原则:抓主线
- 2.宏观原则:不抠细节,站在上帝视角,关注结构和流程
- 技巧:
- 1.断点
- 2.反调(Find usages)
- 3.经验(Spring中doxxx)
- 安装Gradle构建spring工程
- 编译流程
- core-oxm-context-beans-aspects-aop
- Task-other-complleTest.java
- 循环依赖问题:
- 只能解决set方式
- 三级缓存机制
- 1.单例池,2.early。3.singletonFactorys
- A对象实例化之后提前放入三级缓存(提前暴露自己)
- B对象创建时发现依赖A,去三级缓存使用A,升级到二级缓存
- B创建完成之后放入单例池
- A继续创建时使用单例池中的B
- Spring声明式事务
- 事务四大特性
- 1.原子性
- 指事务是一个不可分割的工作单位,要么都成功,要么都不成功
- 2.一致性
- 从数据的角度来说的,数据一致
- 3.隔离性
- 多个并发事务之间要隔离
- 4.持久性
- 事务被提交,数据永久生效
- 事务的隔离级别
- 脏读:一个线程读到另外一个线程中未提交的数据
- 不可重复读:一个线程中的事务读到另一个线程中已经提交update的数据
- 幻读:读到另一个线程Insert或者delete的数据
- 四种隔离级别
- 串行(最高)
- 可重复读:避免脏读、不可重复读
- 读已提交:避免脏读
- 读未提交:最低
- 默认是可重复读:会对行枷锁
- 事务传播行为
- 如果A调用B,且都添加了事务
- PROPAGATION_REQUIRED:如果当前没有事务,新建一个事务,如果有加入
- PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就不用事务
- AOP通过后置处理器完成代理对象的创建