- 基于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 后置通知和最终通知的异同
1.2 创建目标接口和目标类(内部有切点)org.springframework spring-context5.3.12 org.aspectj aspectjweaver1.8.13
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条)