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