
- 基于XML的AOP开发
- 1.入门例子
- 1.1 导入相关坐标
- 1.2 创建目标接口和目标类(内部有切点)
- 1.3 创建切面类
- 1.4 在XML中配置目标类和切面类
- 1.5 在XML中配置织入关系
- 1.6 测试
- 2.XML配置AOP详解
- 2.1 切面配置
- 2.2 配置切入点
- 2.3 通知的配置
- 2.4 后置通知和最终通知的异同
org.springframework
spring-context
5.3.12
org.aspectj
aspectjweaver
1.8.13
1.2 创建目标接口和目标类(内部有切点)
package com.lxg.aspectj;
public interface UserDao {
public void addUser();
public void deleteUser();
}
package com.lxg.aspectj;
public class UserDaoImpl implements UserDao{
public void addUser() {
System.out.println("添加用户");
}
public void deleteUser() {
System.out.println("删除用户");
}
}
1.3 创建切面类
package com.lxg.aspectj.xml;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
public class MyAspect {
//前置通知
public void myBefore(JoinPoint joinPoint){
System.out.println("前置通知:模拟执行权限检查");
System.out.println("目标类是:"+joinPoint.getTarget());
System.out.println(",被织入增强处理的方法是:"+joinPoint.getSignature().getName());
}
//后置通知
public void afterReturning(JoinPoint joinPoint){
System.out.println("前置通知:模拟记录日志。。。");
System.out.println("目标类是:"+joinPoint.getTarget());
}
public Object myAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//开始
System.out.println("环绕开始:执行目标方法之前,模拟开启事务");
//执行当前目标方法
Object obj = proceedingJoinPoint.proceed();
//结束
System.out.println("环绕结束:执行目标方法之后,模拟关闭事务");
return obj;
}
//异常通知
public void myAfterThrowing(JoinPoint joinPoint,Throwable e){
System.out.println("异常通知:出错了"+e.getMessage());
}
//最终通知
public void myAfter(){
System.out.println("最终通知:模拟方法结束后释放资源...");
}
}
1.4 在XML中配置目标类和切面类
1.5 在XML中配置织入关系
1.6 测试
package com.lxg.aspectj.xml;
import com.lxg.aspectj.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestXMLAspectj {
public static void main(String[] args) {
//初始化Spring容器,加载配置文件
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
//从容器中获取UserDao实例
UserDao userDao = app.getBean("userDao", UserDao.class);
//执行添加用户方法
userDao.addUser();
}
}
运行结果:
前置通知:模拟执行权限检查 目标类是:com.lxg.aspectj.UserDaoImpl@56de5251 ,被织入增强处理的方法是:addUser 环绕开始:执行目标方法之前,模拟开启事务 添加用户 最终通知:模拟方法结束后释放资源... 环绕结束:执行目标方法之后,模拟关闭事务 前置通知:模拟记录日志。。。 目标类是:com.lxg.aspectj.UserDaoImpl@56de52512.XML配置AOP详解 2.1 切面配置
id: 用于定义该切面的唯一标识
ref: 引用普通的Spring Bean ,定义切面类
**id: ** 唯一标识
expression: 切入点表达式
切入点表达式的写法:
表达式语法:
execution([修饰符] 返回值类型 包名.类名.方法名(参数))
- 访问修饰符可以省略
- 返回值类型、包名、类名、方法名可以使用星号* 代表任意
- 包名与类名之间一个点 . 代表当前包下的类,两个点 … 表示当前包及其子包下的类
- 参数列表可以使用两个点 … 表示任意个数,任意类型的参数列表
如:
execution(public void com.itheima.aop.Target.method()) execution(void com.itheima.aop.Target.*(..)) execution(* com.itheima.aop.*.*(..)) execution(* com.itheima.aop..*.*(..)) execution(* *..*.*(..))2.3 通知的配置
语法:
通知的常用属性及其描述
aop:after-returning:后置通知
aop:after:最终通知
相同点: 都是在目标方法执行之后执行。
区别: 后置通知只有在目标方法成功执行后才会被织入,而最终通知不论目标方法如何结束(包括成功执行和异常终止),他都会被织入。
另外,如果程序没有异常,异常通知将不会执行。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)