文章目录
Spring的优点有哪些?
- Spring的IOC将对象之间的依赖关系交给框架来处理,减少了组件之间的耦合
- Spring的AOP将通用任务进行抽取,提高了代码的复用性
- Spring对其他主流框架都具有很好的支持,代码侵入性很低
Spring的控制反转(IOC)
- 控制反转是将对象间的依赖关系交给Spring容器去管理,使用配置文件来创建所依赖的对象,将主动创 建改为被动创建,实现解耦合
控制反转举例说明:
自顶向下进行依赖,如果需要修改轮子或者更换轮子需要逐层修改依赖
将关系进行反转,变为自底向上的注入,如果需要修改轮子或者更换轮子,无序上层修改。
所以不应该自顶向下的逐层依赖,而应该自底向上的依赖于抽象
创建一个实例的过程
会逐层的查配置,然后再倒过来自底向上逐层注入
Spring中依赖注入的方式
-
三种注入方式
- 构造器注入(在xml中配置注入属性或者在构造函数中设置)
- setter方式注入:xml中配置property标签或者调用setter方法
- 基于注解的注入:使用@Autowride或者@Resource自动注入
- 使用 @Autowired按类型装配,可以直接使用
- 使用@Resource按名字装配,需要加上注入类设置的名字
-
注入的类需要被一下四个注解之一标注
- @Controller 控制层
- @Service 业务层
- @Repository 持久层
- @Component 其他需要注入的地方
Spring的AOP面向切面编程
面向切面编程是指当需要在有一个方法之前或者之后做一些额外的操作,可以利用AOP技术将功能代码从业务逻辑代码中分离出来
-
应用场景:如日志记录,权限判断,异常统计,事务等,
-
AOP的三种织入方式
- 编译时织入:需要特殊的Java编辑器,如AspectJ
- 类加载时织入:需要特殊的Java编辑器,如AspectJ
- 运行时织入:采用动态代理的方式,Spring采用就是这个
-
Spring的AOP的两种实现方式:
- 使用JDK动态代理实现
目标对象必须实现接口,原理是通过运行期间创建一个接口的实现类来完成对目标对象的代理(注入代理类,添加方法)
- 使用cglib实现
目标对象不需要实现接口,底层通过继承目标对象产生代理子对象,覆盖其中的方法,所以被代理类不能被声明为final
-
Spring的AOP对两种代理的选择
- 如果目标对象实现了接口,默认使用JDK动态代理
- 如果没有实现接口,强制使用cglib库
-
Spring的AOP的增强类型(5种)
- 前置增强(Before)
- 后置增强(AfterReturn)
- 环绕增强 (Around)
- 异常抛出增强(AfterThrowing)
- 最终增强 (After)
-
切入点表达式:
execution([修饰符] 返回值类型 包名.类名.方法名(参数))
- execution:必须要
- 修饰符:可省略
- 返回值类型:必须要,但是可以使用
*
通配符 - 包名 :
- 多级包之间使用.分割
- 包名可以使用代替,多级包名可以使用多个代替
- 如果想省略中间的包名可以使用 …
- 类名:
- 可以使用
*
代替 - 也可以写成*DaoImpl
- 可以使用
- 方法名:
- 也可以使用
*
号代替
*- 也可以写成add*
- 也可以使用
- 参数:
- 参数使用
*
代替 - 如果有多个参数,可以使用
..
代替
- 参数使用
如果是匹配所有的:execution(* *..*.*.*(..))
- 核心概念(记忆最重要四个)
- Aspect 切面:切入点 + 增强
- Joint point 连接点:所有的支持被拦截的点
- Advice 增强:被拦截之后所做的操作
- Pointcut 切入点:需要被拦截的连接点
IOC容器初始化
容器初始化过程:
- Resource定位
- BeanDefinition载入
- BeanDefinition注册
BeanFactory和FactoryBean的区别
- BeabFactory是一个工厂,是IOC容器的顶级接口,作用是管理Bean,包括实例化、定位和配置应用程序中的对象及创建这些对象之间的依赖
- FactoryBean是一个Bean,作用是产生其他Bean实例
BeanFactory和ApplicationContext的区别
- BeanFactory是Spring中IOC的顶级接口,作用是管理Bean,通常使用对象是Spring本身
- ApplicationContext接口时BeanFactory的派生,除了提供BeanFactory具有的功能外,还提供了更完整的框架功能,方便开发人员进行使用
- 继承了MessageSource,支持国际化
- 提供了统一的资源文件访问方式
- 提供了同时加载多个文件的功能等
- BeanFactory采用延迟加载形式注入Bean,ApplicationContext在容器启动时一次性创建所有的bean
BeanFactory和ApplicationContext优缺点分析
- BeanFactory
- 优点:应用启动时占用资源很少,对资源要求高的应用有优势
- 缺点:运行速度相对较慢,通过Bean工厂创建的Bean生命周期会比较简单
- ApplicationContext
- 优点:所有bean在启动时一起加载,系统运行速度快,且启动时可以发现系统配置问题
- 驱动:内存占用较大
Spring Bean
Spring Bean的作用域
使用注解@Scope
- singleton:默认值,单例的
- prototype:多例的
- request:存放在request域中
- session:存放在session域中
- global session:web项目中运用于整个容器,如果没有容器环境,就相当于session
Spring Bean实例化的方法
- 使用无参构造函数(默认情况下),如果bean中没有无参构造函数,创建失败
- 静态工厂方法(了解)
- 实例工厂方法(了解)
Spring Bean的生命周期
Spring Bean的生命周期分为四个阶段和多个扩展点,扩展点分为影响多个bean和影响一个bean
- 四个阶段
- 实例化
- 属性赋值
- 初始化
- 销毁
- 多个扩展点
- 影响多个bean的
- BeanPostProcessor 实例化前后进行的操作
- InstantiationAwareBeanPostProcessor 初始化前后进行的操作
- 影响单个bean的
- Aware :注入aware接口声明的依赖
- 生命周期相关bean
- InitializingBean 初始化
- DisposableBean 销毁
- 影响多个bean的
Spring中用到的设计模式
- BeanFactory和ApplicationContext使用了工厂模式
- Bean创建过程中使用了单例模式和原型模式
- AOP使用了代理模式,装饰器模式,适配器模式
- 事件监听器使用了观察者模式
- 类似于JdbcTemplate使用了模板模式
SpringMVC
核心组件
-
DispatcherServlet:前端控制器,整个流程的控制中心,降低了组件的耦合。用来匹配请求,将请求进行分发
-
Handler:(Controller)后端控制器,负责处理请求的控制逻辑
-
HandlerMapping:映射器对象,用于管理url与Controller映射关系
-
HandlerAdapter:适配器,调用响应的Handler对业务逻辑进行处理并返回ModelAndView
-
ViewResolver:视图解析器,解析对应的视图的关系,并生成一个View
Spring事务支持
事务并发问题
-
脏读:一个事务读取到另一个事务未提交的数据
事务A写入的数据写入到缓冲区了还未提交,被事务B读取到了,之后事务A回滚了,导致事务B读到的数据是脏数据 -
不可重复读:一个事务因读取到另一个事务已提交的数据。导致对同一条记录读取两次以上的结果不一致。update操作(一个事务内两次查询不一样)
读取同一条数据,读取过程中有一个事务A修改了数据,导致两次读数据不一致 -
幻读:一个事务因读取到另一个事务已提交的数据。导致对同一张表读取两次以上的结果不一致。insert、delete操作(用户注册查询唯一索引是否存在)
事务隔离级别
- DEFAULT :数据库默认设置的隔离级别(默认)
- Read uncommitted (读未提交):最低级别,任何情况都无法保证。
- Read committed (读已提交):可避免脏读的发生。
- Repeatable read (可重复读):可避免脏读、不可重复读的发生。
- Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
大多数数据库的默认隔离级别是Read committed,比如Oracle、DB2等。
MySQL数据库的默认隔离级别是Repeatable read。
事务的传播行为
- PROPAGATION_REQUIRED 支持当前事务,如果当前没有事务就新建一个事务(默认)
- PROPAGATION_SUPPORTS 支持当前事务,如果没有就以非事务方式进行
- PROPAGATION_MANDATORY 支持当前事务,如果没有就抛出异常
- PROPAGATION_NESTED:支持当前事务,如果存在就嵌套一层事务,如果没有就新建一个事务
- PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务就挂起当前事务
- PROPAGATION_NOT_SUPPORTED 非事务运行,当前存在事务就挂起
- PROPAGATION_NEVER 非事务运行,当前存在事务抛出异常
一般就使用required和supports,查询使用supports,增删改用required
简单谈一谈Spring Boot
Spring Boot是Spring开源组织下的子项目,是Spring组件一站式解决方案,主要是简化了使用Spring的难度,省去了繁杂的配置,提供了各种启动器starter,方便快速上手。
优点:可独立运行,简化了配置,可以自动配置,可进行应用监控
SpringBoot的核心注解:
- @SpringBootConfiguration 实现配置文件的功能
- @EnableAutoConfiguration 开启自动配置
- @ComponentScan:Spring组件扫描
- @SpringBootApplication标注启动类