概念
Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。Spring框架的不光是技术牛,而是它的核心思想更牛,它不重复发明轮子,而是"拿来主义",把业界做的最好的技术黏合起来形成一个强大的企业级的应用框架。
Spring的分层结构
Spring 框架是一个分层架构,由7个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如下图所示:
组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现,可以说Spring管理着所有模块。
模块 | 说明 |
---|---|
核心容器Spring Core | 核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC)模式,将应用程序的配置和依赖性规范与实际的应用程序代码分开。 |
Spring上下文Spring Context | Spring上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。 |
Spring AOP | 通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。可以很容易地使 Spring框架管理的任何对象支持AOP。Spring AOP模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。 |
Spring DAO | JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。 |
Spring ORM | Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括JDO、Hibernate和iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。 |
Spring Web | Web上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以Spring 框架支持与 Jakarta Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。 |
Spring MVC框架 | MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。 |
Spring的核心思想
Spring框架主要用来管理Bean的,底层使用BeanFactory用来储存Bean
被Spring容器管理的对象叫做Bean
模块 | 说明 |
---|---|
BeanFactory | Spring内部使用,创建bean的工厂 |
ApplicationContext | 外部应用程序调用,也成为spring容器 |
IoC控制反转Inversion of Control | 开发者在无需自己new对象,交给Ioc创建并管理 |
DI依赖注入Dependency Injection | 松耦合方式实现对象直接的依赖 |
AOP面向切面编程 | 补充java面向对象的不足 |
IOC思想
IOC中文意思表示 : 控制反转
- 以前我们需要使用对象时就new,new多了浪费会给内存造成很大影响。
- 而现在程序需要把new对象的控制权交给IOC去创建对象;反转了程序需要使用对象时不在去new,而是找IOC容器取
- IOC容器反过来控制程序所需要的外部资源,也是程序开发思想
谁控制谁?
IOC容器控制应用程序去创建对象
控制什么?
控制对象本身的创建,实例化。控制对象的依赖关系。
为何叫反转?
因为应用程序不能主动获取资源了,而是被动等待IOC给他注入它所需要的资源,所以称为反转
那些方向被反转了?
不需要程序创建对象了,程序获得资源的方式反了
为什么需要反转?
引入IOC容器过后,体系更为松散,而且管理更有序(只需要实现接口的类),真正实现了松散耦合
什么是IOC容器?
IOC容器的对象装配以及对象生命周期管理的软件,实现服务消费者不去直接依赖服务提供者的组件;而是依赖中间商
DI思想
中文意思表示 : 依赖注入(自动装配)
- 因使用IOC容器创建的是无参构造我们很难在创建构造函数为成员属性赋值,着时候出现DI思想
- 程序依赖于IOC容器去为类成员属性初始化,而IOC可以向成员属性注入值进而被初始化
- 应用程序依赖IOC容器来注入所需要的外部资源(对类所讲,外部资源就是自己类的内部不能实现的得到的东西)
谁依赖谁?
应用程序依赖IOC容器
为什么需要依赖?
因为发生了反转,应用程序依赖的资源都在IOC容器内。我们需要取到我们的对象
依赖什么东西?
应用程序依赖IOC容器,IOC容器为他注入所需要的(资源)
谁注入与谁?
IOC容器注入到应用程序
注入了什么东西?
注入应用程序所需要的资源
为何要注入?
程序正常运行需要这些资源,才可以运行
依赖注入和控制反转是同样的概念吗?
不是同一概念,其实他们描述的是同一件事情,但是冲不同角度来说
- 控制反转:是从IOC容器的角度描述
- 依赖注入:是从应用程序的角度思考问题
- 控制反转描述是:IOC容器反过来控制应用程序,控制程序所需要外部资源
- 依赖注入描述是:应用程序依赖IOC容器,依赖他注入所需要的资源
----------------完成依赖注入和控制反转只有应用程序和IOC-----------
使用IOC和DI开发需要的新思想
- 应用程序不需要主动new对象,但须要描述创建他们的方式
- 我们无需使用有参构造,而是通过注入到属性的方式开发
- 所有组件都是被动的,所有组件初始化/专供都需要容器负责
AOP概念
作用
- 实现对原有的方法进行扩展,实现对程序代码的解耦
- 在影响源代码的情况下,对原有的方法进行扩展
Aop专业名名字解释
术语 | 解释 |
---|---|
目标 | 当前需要切面的对象 |
拦截点 | 指那些被拦截后的方法称为点(Spring只支持方法拦截) |
切入点 | 要对那些拦截点进行拦截的定义 |
连接点 | 已存在的业务方法(一般用在环绕通知) |
通知(增强) | 指Aop拦截到对象方法后需要做那些事情,一个advice有多个通知方法 |
切面 | 切入点 和 通知 的结合(需要切面的类所在的包) |
引介 | 一种特殊的 通知,在运行期为类动态的添加一些方法(在不修改源代码的前提下) |
织入 | 把"前置增强" 和 “后置增强” 应用到目标对象的过程 |
代理 | 一个类被AOP注入增强后,就产生了一个代理类 |
通知(增强切入方法的功能)
术语 | 功能 |
---|---|
前置加强 | 方法执行之前加入相关代码 |
后置加强 | 方法执行之后加入相关代码 |
环绕加强 | 前置加强和后置加强的综合 |
异常加强 | 目标方法发生异常时通知 |
AOP应用场景
前置加强:用户信息检查
后置加强:
环绕加强:IO创建流与关流、数据库加装驱动与关流、性能测试、缓存管理、权限管理、事务的管理
异常加强:目标方法抛出异常,我们需要在后置回滚用户数据
多切面执行顺序
下面是 两个切面 各通知的执行顺序:
Spring对事务的管理
概念:
Spring针对于数据库中的事务控制,开发了一套注解@Transactional
实现原理:
其核心原理使用了AOP的Around通知功能,对原有的方法进行扩展;实现了对事务的控制
- 方法执行前开启数据库事务
- 如果方法执行成功则事务提交
- 如果执行不成功则事务回滚
@Transactional注解默认的事务策略
- 如果出现了运行时异常,事务才会回滚
- 如果控制的方法,检查异常(编译异常:不是运行时异常),事务不会自动回滚;
Spring认为程序既然已经提示需要异常处理,则默认由程序员自己控制,Spring不负责管理
注解的属性
rollbackFot: 遇到什么类型的异常回滚事务
noRollbackFor: 遇到什么类型的异常事务不回滚