1、Aop 全程是Aspect Oriented Programming 即面向切面编程,通过预编译方式和运行期动态代理实现程序功能的同一维护的一种技术。Aop是oop的延续,是软件开发中的 一个热点,也是Spring框架中一个重要的内容。是函数式编程的一个衍生范例,利用Aop可以对业务逻辑各个部分进行分割,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用行,提高了开发效率。简单的说就是把我们程序中的重复代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上已有的方法进行增强,(使用动态代理的方式实现)
相关术语
JoinPoint:链接点 那些被拦截到的点,在spring中,这些点指的是方法,因为spring只支持方法类型的连接点
Pointcut:切入点 是指我们要对哪些JoinPont进行拦截的定义
Advice:通知/增强 拦截到Joinpoint之后所要做的事情就是通知
通知类型:前置通知、后置通知、异常通知、最终通知、环绕通知
Introduction:引介 是一种特殊的通知,在不修改类代码的前提下,Introduction可以在运行期为类动态的添加一些方法或field
Target:目标对象,代理的目标对象
Weaving织入 是指把增强应用到目标对象来创建新的代理对象的过程,spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入
Proxy:代理,一类类被Aop织入增强后,就产生一个结果代理类
Aspect:切面 是切本文来源gao@!dai!ma.com搞$$代^@码网*入点和通知(引介)的结合
在 spring 中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。
基于XMl的AOP步骤
1、创建Maven项目引入spring坐标
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mingqi</groupId> <artifactId>SpringIOC</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.7</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </project>
2、创建业务层接口:
package com.mingqi.services; public interface IAccountService { /** * 模拟登陆账户 */ void saveAccount(); /** * 模拟更新账户 * @param id */ void updateAccount(int id); /** * 模拟删除账户 * @return */ int deleteAccount(); }
3.创建业务层实现类
package com.mingqi.services.impl; import com.mingqi.services.IAccountService; public class AccountServicesImpl implements IAccountService { public void saveAccount() { System.out.println("执行了保存"); } public void updateAccount(int id) { System.out.println("执行了更新"+id); } public int deleteAccount() { System.out.println("执行了删除"); return 0; } }