Spring-03-AOP

Spring-03-AOP回顾:任务目标一. AOP介绍1. Aop介绍2. AOP核心概念3. Spring AOP 基础知识3.1 JDK动态代理实现3.2 CGlib实现代理二. Spring中AOP开发1. Spring 中 AOP 基于xml开发1.1 项目准备1.2 准备操作对象1.3 增强类1.4 将增强织入目标对象(xml)2. Spring中的AOP基于注解开发2.1 创建配置文件2.2 修改增强类MyAdvice复习作业面试题

回顾:

1. 依赖注入的各种配置和属性
2. 使用注解的方式实现依赖注入
3. 在Spring中使用JUnit测试

任务

1. AOP基本概念
2. 在Spring中使用AOP

目标

1. 掌握AOP基本原理
2. 掌握在Spring中使用AOP

一. AOP介绍

1. Aop介绍

​ AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

​ AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

​ 使用"横切"技术,AOP把软件系统分为两个部分:核心关注点横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

2. AOP核心概念
3. Spring AOP 基础知识

Spring的 AOP底层用到两种代理机制:

3.1 JDK动态代理实现
  1. 创建接口和对应实现类
 

 

  1. 创建动态代理类
 

测试

 

测试结果: 在调用接口方法的前后都会添加代理类的方法!

3.2 CGlib实现代理

使用JDK创建代理有一个限制,它只能为接口创建代理实例.这一点可以从Proxy的接口方法 newProxyInstance(ClassLoader loader,Class [] interfaces,InvocarionHandler h)中看的很清楚

​ 第二个入参 interfaces就是需要代理实例实现的接口列表.

​ 对于没有通过接口定义业务方法的类,如何动态创建代理实例呢? JDK动态代理技术显然已经黔驴技穷,CGLib作为一个替代者,填补了这一空缺.

​ GCLib采用底层的字节码技术,可以为一个类创建子类,在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势志入横切逻辑.

  1. 创建创建CGLib代理器
 

测试

 

二. Spring中AOP开发

1. Spring 中 AOP 基于xml开发
1.1 项目准备

pom文件添加

 
1.2 准备操作对象

先创建UserService接口:

 

实现类

 

1.3 增强类
 

1.4 将增强织入目标对象(xml)

在applicationContext-aop.xml 中配置

注意:添加了 aop命名空间

 

测试:

 

2. Spring中的AOP基于注解开发

在使用@Aspect之前,首先必须保证所使用的Java是 5.0 以上版本,否则无法使用注解技术.

Spring 在处理@Aspect注解表达式时,需要将Spring的asm模块添加到类路径中,asm是轻量级的字节码处理框架,因为Java的反射机制无法获取入参名,Spring利用asm处理@Aspect中所描述的方法入参名.

此外,Spring采用AspectJ提供的@Aspect注解类库及相应的解析类库,需要在pom.xml文件中添加aspectj.weaver和aspectj.tools类包的依赖.

2.1 创建配置文件

class-path路径下创建applicationContext-aop-annotation.xml

配置目标对象,配置通知对象,开启注解

 

2.2 修改增强类MyAdvice
  1. 在类上添加 @Aspect 注解
  2. 可以将 execution 直接定义在通知方法名上,如下:
 
  1. 也可以定义一个方法, 如下面的 pc() 方法,然后在通知方法上指定 @Before("MyAdvice.pc()")
 

完整定义增强类

 

复习

1. 依赖注入的配置和属性的含义
2. 使用注解的方式实现依赖注入
3. 在Spring中使用JUnit测试 

作业

1. 使用Hibernate第三天作业的员工部门数据表
2. 完成两表的CRUD操作
3. 使用AOP完成项目的日志功能
4. 使用AOP完成在Hibernate的方法调用时自动开启连接,开启事务、提交事务(回滚事务)、关闭连接,以简化Hibernate业务代码(提示:使用around通知)

面试题

1. 什么是AOP,AOP有什么作用
2. 在Spring中什么地方使用了AOP
3. 在项目中什么时候用到了AOP,举例说明
4. 名词解释:切面、切入点、连接点、织入、通知