前几天学了AspectJ,今天来做做学习笔记。
1、定义:
AspectJ是一个基于java语言的AOP框架,它提供了强大的AOP功能。Spring2.0后,Spring AOP引入对AspectJ的支持,并允许直接使用AspectJ进行编程,而Spring自身的AOP API也尽量与AspectJ保持一致。使用AspctJ实现AOP有两种方式:一种是基于XML的生命是AspectJ,另一种是基于注解的声明式AspectJ。
2、实现方式:
第一种是基于XML声明式的AspectJ,代码较多(记得要导入jar包哦!)。
结构图:
首先,我们先创建一个接口,里面包含添加用户和删除用户的两个方法。
package com.itheima.jdk; public interface UserDao { public void addUser(); public void deleteUser(); }然后创建一个类实现这个接口
package com.itheima.jdk; import org.springframework.stereotype.Repository; @Repository("userDao") public class UserDaoImpl implements UserDao { @Override public void addUser() { // TODO Auto-generated method stub System.out.println("添加用户"); } @Override public void deleteUser() { // TODO Auto-generated method stub System.out.println("删除用户"); } }
接着,我们先创建一个名为MyAspect的类,里面模拟了5种通知的方法。
package com.itheima.aspectj.xml; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; public class MyAspect { //前置通知 public void myBefore(JoinPoint joinPoint) { System.out.print("基于XML声明式的AspectJ\n"+"author:Black_YeJing\n"); System.out.println(""); System.out.println("前置通知:模拟执行权限检查...,"); System.out.println("目标类是:"+joinPoint.getTarget()); System.out.println(",被植入增强处理的目标方法为:"+joinPoint.getSignature().getName()); } //后置通知 public void myAfterReturning(JoinPoint joinPoint) { System.out.println("后置通知:模拟记录日志....,"); System.out.println("被植入增强处理的目标方法为:"+joinPoint.getSignature().getName()); } /** * 环绕通知 * ProceedingJoinPoint是JoinPoint子借口,表示可以执行目标方法 * 1、必须是Object类型的返回值 * 2、必须接受一个参数,类型为ProcessdingJoinPoint * 3、必须throws Throwable */ 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("最终通知:模拟方法结束后的释放资源"); } }
最后写一个测试类TestXmlAspectj.java
package com.itheima.aspectj.xml; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.itheima.*; import com.itheima.jdk.UserDao; public class TestXmlAspectj { public static void main(String[] args) { String xmlPath="com/itheima/aspectj/xml/applicationContext.xml"; ApplicationContext context=new ClassPathXmlApplicationContext(xmlPath); UserDao userDao=(UserDao)context.getBean("userDao"); userDao.addUser(); userDao.deleteUser(); } }运行结果:
图(3-1)
总结:从图(3-1)可以看出,使用基于XML的声明式AspectJ已经实现了AOP开发
ps:下一篇将介绍AspectJ的第二种开发模式:基于注解的声明式开发。