IoC
-
IoC(控制反转):面向对象编程得一种设计原则,可以用来降低计算机代码建得耦合度
-
实现方式:依赖注入
-
通过控制反转,对象在被创建的时候,由系统的外部实体,将其所依赖的对象的引用传递(注入)进来,而不是系统内部进行对象的创建;
-
核心思想:解耦合,将组建的构建和组件的使用分开,实现每个组件时只考虑组件内部的事件,明确和定义组件间的接口
-
实现基础:面向接口编程+工厂模式+依赖注入
降低耦合度
- 用面向接口编程得思想,消除业务逻辑层和DAO层得耦合
- 业务逻辑针对接口操作,对具体得DAO类的操作,委托给外部类
面向接口思想版本的分析
-
优点:业务逻辑和数据访问完全耦合
-
缺点:界面逻辑和另外两层均有依赖
-
解决方案:到系统外部解决这种依赖关系——工厂模式
工厂模式版本
- 特务逻辑、数据访问和界面逻辑三者之间完全解耦合
- 工厂类负责创建和集成应用所需的各种对象
- 借助依赖注入和工厂模式实现了控制反转
spring IoC
- spring框架通过Bean工厂实现控制反转和依赖注入
- Bean工厂使用统一的方式装配所有的应用对象,是实例化、配置和管理Bean的容器,是Spring其他组件服务的基础
- ApplicationContext构建在Bean Factory基础之上。除了具有BeanFactory的功能以外,还有Spring IoC集成等多功能。
AOP
❖为什么需要AOP?
-
OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合,但OOP在如下场景有局限性:
-
当需要分散的、不具有继承层次的对象引入公共行为的时候,OOP则无法避免代码的重复;
-
抽象地看,OOP允许定义从上到下的关系,但并不适合定义从左到右的关系;
-
具体而言,比如安全验证和记录日志功能,这类代码往往平均的分散在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。
-
❖AOP的基本概念
- AOP采取横向抽取机制,取代了传统的纵向继承体系解决重复性代码的问题(安全检查、事务管理、性能监视、数据缓存等);
❖关注点
-
关注点是指一个特定的问题、概念、或是应用程序的部分,即一段程序必须达到的一个目标。可以分为横切关注点和核心关注点。
-
核心关注点:完成核心业务逻辑的关注点。
-
横切关注点:实现代码散落在很多个类或方法之中的关注点。
❖切面
- 切面是对一个横切关注点的模块化,将那些散落在各处的、实现横切关注点的代码归整在一起,类似于OOP中的类的概念,但切面代表的更多是对象间横向的关系。
❖连接点(join point):程序执行过程中的一个点,可能是:**
-
Method invocation(方法调用)
-
Field access(字段访问)
-
Throws(异常抛出)
❖建议(advice):切面切入目标代码的方式,可以分为前置建议、后置建议和环绕建议。
❖引介(introduction):为一个现有的Java类或接口添加方法或字段。
❖织入(weaving):将切面整合到完整的执行流程或完整的类的过程。
动态横切
-
通过切入点和连接点在一个切面中创建行为的过程。
-
动态横切通常用于帮助向对象层次中的各种方法添加安全验证或日志记录。
-
在很多应用场景中,动态横切基本代表了AOP,动态横切的核心技术包括连接点、切入点、建议、切面。
静态横切
-
静态横切不修改一个给定对象的执行行为,相反,它可以把扩展和实现附加到对象的基本结构中。
-
此外,它通过引入附加的方法字段和属性来修改对象的结构。
-
在AOP的实现中,通常静态横切也就是引入或混入。
Spring MVC拦截器
-
Spring MVC拦截器(Interceptor)类似于Servlet技术中的过滤器,用于对请求进行前置和后置的过滤,实现系统的plug-in功能,达到按业务功能部分和非业务功能部分解耦的目的。
-
Spring MVC的拦截器实现机制是基于Spring AOP实现的,和Servlet中的过滤器及其他Web表现层框架的过滤/拦截器实现机制不同。
Spring Boot
❖SpringBoot的主要特点:
-
极低的学习成本;
-
开发可独立运行的Web应用;
-
“约定优于配置”,极大的提高了开发效率;
-
简单的组件依赖,自动发现与自动装配;
-
提供运行时的应用监控;
-
提供与分布式架构、云计算和大数据组件的良好集成
数据库事务
❖数据库事务(Database Transaction):指作为一个程序执行单元的一系列操作,要么完全执行,要么完全不执行。
❖事务的特性(ACID)
-
原子性(atomicity):一个事务是一个不可分割的工作单位
-
一致性(consistency):事务必须是使数据库从一个一致性状态转变到另一个一致性状态
-
隔离性(isolation):一个事务的执行不能被其他事务干扰
-
持久性(durability):事务一旦提交,对数据库中数据的改变应该是永久性的
JDBC事务处理
❖JDBC的事务处理是基于Connection对象进行的,默认事务处理行为采用自动提交(auto-commit)方式。
❖JDBC提供以下方法进行显式的事务处理:
-
setAutoCommit:设置是否自动提交
-
commit:显式的提交事务
-
rollback:回滚事务
-
还可以在Connection对象设置隔离级别常量
声明式事务管理
❖Spring框架的声明式事务管理是基于AOP的思想实现的,其本质是对方法进行拦截,目的是解耦合,尽量保证业务代码的纯粹和干净。
❖Spring中提供四种实现:
-
基于TransactionInterceptor拦截器
-
基于TransactionProxyFactoryBean代理
-
基于<tx>命名空间
-
基于@Transactional注解
持久化
❖什么是持久化?
-
持久化:把瞬态数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘中的文件、数据库等);
-
持久化的目标一般可以分为:
-
无结构文本文件:通过I/O技术读写文件;
-
结构化的文本文件:通过SDK提供的API读写文件;
-
关系型数据库:通过数据库驱动技术(如JDBC)读写DBMS
-
ORM
❖对象关系映射:完成瞬态的对象数据到持久的关系型数据映射的机制称为对象关系映射(Object-Relation Mapping),简称ORM。
REST
❖什么是REST(RepresentationalState Transfer)?
-
资源(Resources):REST的名称中省略了主语——资源,即网络资源。
-
表述性(Representational):将“资源”具体呈现出来的形式就称为资源的表述。
-
状态转换(State Transfer):用户访问资源(和资源的互动)会导致资源的状态发生改变,用户使用网站或其他互联网应用的本质就是对服务器上的资源进行了状态转换。
-
如果这种状态转换是建立在资源表述的基础上(或是由资源表述来决定如何转换),就称为表述性状态转换(REST)。
❖REST的六大约束
-
客户端-服务器:关注点分离、提高服务端的简单性和客户端的可移植性。
-
无状态协议:会话信息保存在客户端、请求必须包含所有信息而不依赖于上下文、提升了服务端的简单性、可靠性和可见性。
-
缓存:响应内容应该显式或隐式的被标为可以被缓存或不可被缓存、减少客户端和服务端的交互次数。
-
分层系统:客户端不知道是和代理还是和真实服务器通信、尽可能将服务器端的安全、负载均衡、错误处理等实现细节隐藏。
-
按需代码:客户端可以按需直接从服务端下载部分代码、简化客户端。
-
统一接口:所有接口应统一使用RESTful设计思想