前几天学了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的第二种开发模式:基于注解的声明式开发。