面向切面编程(AOP)
applicationContext.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
复制修改
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
复制修改
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
">
<aop:config>
<!-- 切入点配置 expression:表达式 execution:执行 id用于下面增强ref引用-->
<aop:pointcut expression="(execution(public void show())"
id="show" />
<!-- 切入面配置 -->
<!-- ref是增强类的对象名(小写开头) -->
<aop:aspect ref="zengQiang">
<!-- method是增强的对象的方法名 pointcut-ref的值和 切入配置的id值相同 -->
<!-- 前置增强 -->
<aop:before method="qianZhi" pointcut-ref="show" />
<!-- 后置增强 returning:返回值(必须和方法的形参相同) 在后置增强方法里面能获取返回值 出现异常不会执行后置增强的方法
-->
<aop:after-returning method="houZhi"
pointcut-ref="show" returning="result" />
<!-- 异常增强 只能捕获运行时的异常 throwing 返回异常的对象 -->
<aop:after-throwing method="yiChang" pointcut-ref="show" throwing="e"/>
<!-- 最终增强 有异常也会执行最终增强的方法 -->
<aop:after method="zuiZhong" pointcut-ref="show" />
<!-- 环绕增强 包含了以上所有增强 只能单独使用-->
<aop:around method="huanRao" pointcut-ref="show" />
</aop:aspect>
</aop:config>
</beans>
增强类里的方法
package aopDemo;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;
/**
* 增强类
*/
@Component
public class ZengQiang {
/**
*
* @param joinPoint
* 切入点:被增强的对象
*/
public void qianZhi(JoinPoint joinPoint) {
// 获取被增强的对象的名称
joinPoint.getTarget();
// 获取形参
joinPoint.getArgs();
// 获取方法的全称
joinPoint.getSignature();
System.out.println("前置增强");
}
public void houZhi(JoinPoint joinPoint,Object result) {
System.out.println("后置增强");
}
public void yiChang(RuntimeException e) {
System.out.println("异常增强");
// 打印出异常堆栈
e.printStackTrace();
}
public void zuiZhong() {
System.out.println("最终增强");
}
/**
*
* @param pjp
* 正在运行的切入点
*/
public void huanRao(ProceedingJoinPoint pjp) {
System.out.println("前置");
try {
// 相当于调用运行被切入的方法
pjp.proceed();
System.out.println("后置");
} catch (Throwable e) {
System.out.println("异常");
e.printStackTrace();
} finally {
System.out.println("最终增强");
}
}
}
切入点expression=“execution(方法)” 属性值
public * addNewUser(entity.User): “*”表示匹配所有类型的返回值。
public void *(entity.User): “*”表示匹配所有方法名。
public void addNewUser(..): “..”表示匹配所有参数个数和类型。
* com.service.*.*(..):匹配com.service包下所有类的所有方法。
* com.service..*.*(..):匹配com.service包及其子包下所有类的所有方法
AOP注解方式
applicationContext.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
">
<!-- 自动注解扫描设置 -->
<context:component-scan base-package="aopDemo" />
<!-- 启动AOP自动代理 -->
<aop:aspectj-autoproxy />
</beans>
增强类 切入点注解写入增强类
@Component
// 切入点 ASpect
@Aspect
public class ZengQiang {
//定义通用切入点
@Pointcut("execution(* *.*(..))")
public void pointcut() {
}
/**
* @param joinPoint
* 切入点:被增强的对象
*/
@Before("pointcut()")
public void qianZhi(JoinPoint joinPoint) {
System.out.println("前置增强");
}
@AfterReturning(pointcut = "pointcut()", returning = "result")
public void houZhi(JoinPoint joinPoint, Object result) {
System.out.println("后置增强");
}
@AfterThrowing(pointcut = "pointcut()", throwing = "e")
public void yiChang(RuntimeException e) {
System.out.println("异常增强");
// 打印出异常堆栈
e.printStackTrace();
}
@After("pointcut()")
public void zuiZhong() {
System.out.println("最终增强");
}
/**
* @param pjp
* 正在运行的切入点
*/
// @Around("pointcut()") 环绕增强
public void huanRao(ProceedingJoinPoint pjp) {
}
}