- 连接点:AOP关注的类中的具有特定功能的方法叫连接点
- 切入点:被抽取公共功能的连接点叫切入点
- 通知:切入点对应的方法的共性功能被抽取后,组成独立的代码逻辑,被封装在某个类中的某个方法中,在被抽取了共性功能的方法被执行时,这些代码逻辑还要加入原始方法的执行,这些被抽取出来组成独立代码逻辑的共性功能成为通知.共性功能被抽取后,可能来自于切腹点对应的方法中的任何位置,因此通知不仅描述共性的代码逻辑,还描述被抽取时从何处抽取.被抽取的代码在切入点中的具体位置,称为通知类别.
- AOP代理:切入点所在类的对象执行切入点方法时,需要将原始的共性功能(通知)加入还原,此时通过代理的形式创建类的对象,并完成共性功能(通知)的加入,上述过程称为AOP代理.AOP代理的意义是将被抽取共性功能类的对象创建出,同时将共性功能(通知)加入,完成原始的完整操作的过程.
- 切面(Aspect):是一个设计概念,指切入点与通知的匹配模式,换句话说指被抽取了共性功能的方法(切入点)与被抽取了共性功能(通知)对应的绑定关系.程序设计时,可以设置多个切面,用来描述切入点与通知之间的关系.
- 织入(Weaving):通过AOP代理,完成了切入点和通知的融合,并组织成了完整的代码逻辑,并通知加入到切入点对应位置的动作称为织入.织入是一个动态过程,不对应任何代码,可以理解为动态的运行过程(即运行时动态在切入点还原通知).织入可以在三个阶段进行,编译时,类加载时和运行时.Spring采用的是运行时织入.
- 目标对象:被抽取共性功能所在的类的对象.
- 8.
XML配置开发AOP
导入jar包
- 基本:Spring四个核心包两个日志包
AOP相关jar包:
Spring进行AOP开发(1个)
spring-aop-3.2.0.RELEASE.jar
Spring整合AspectJ框架
spring-aspects-3.2.0.RELEASE.jar
AOP联盟规范(dependencies包中)
com.springsource.org.aopalliance-1.0.0.jar
aspectJ支持(dependencies包中)
com.springsource.org.aspectJ.weaver-1.6.8.RELEASE.jar导入aop命名空间
<beans xmlns="..."
...
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="...
...
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
关于加入命名空间后标签没有提示的操作方法:
复制xsi中xsd那一行,windows->preferences->搜索xml->xml Catalog->add->key:粘贴,location:选择你想要找的命名空间的schema位置,keyvalue:选择uri
<!--aop配置-->
<aop:config>
<!--切面aspect配置,切入点和通知的匹配方式
ref:通知所在类
before:描述通知所在的位置
method:通知方法
pointcut:切入点 第一个*是指任何返回类型,后面指全类名.(全部方法)(无论什么参数)
<aop:aspect ref="">
<aop:before method="beginTransaction" pointcut="execution(* com.test.service.UserServiceImpl.*(..))"/>
</aop:aspect>
</aop:config>
AOP通知类型
1. before:前置通知类型(应用:各种校验),在方法执行前执行
2. after:后通知(应用:清理现场),方法执行完毕后执行,无论方法中是否出现异常
3. afterReturning:返回后通知(应用:常规数据处理),方法正常返回后执行,如果方法中抛出异常,无法执行
4. afterThrowing:抛出异常后通知(应用:包装异常信息),方法抛出异常后执行,如果没有抛出异常则无法执行
5. around:环绕通知(应用:十分强大,可以做任何事情)方法执行前后分别执行,可以阻止方法的执行
public class LogManager{
//通知
public void addLog(JoinPoint jp){
//获取切入点的方法名:用户操作
String methodName = jp.getSignature().getName();
Date time = new Date();
//处理用户操作:比如当出现不当操作时记录日志,或存入数据库
}
}
AOP注解
1.applicationContext.xml中开启aop注解
<!--开启aop注解-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
2.配置切面类
@Component(value="tx")
@Aspect//切面类
public class TransactionManager{
//通知
@Before(value="execution(*com.test.service.*.*(..))")
public void beginTransaction()
{
System.out.println("开启事务");
}
@AfterReturning(value="execution(*com.test.*.*(..))")
public void commitTransaction()
{
System.out.println("提交事务");
}
@AfterThrowing(value="execution(*com.test.*.*(..))")
public void rollbackTransaction()
{
System.out.println("回滚事务");
}
}