• AspectJ


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

  • 相关阅读:
    内存-程序运行的空间
    数据在内存中是这样存储的(二进制形式存储)
    从编写源代码到程序在内存中运行的全过程解析
    QT开发工具
    Linux中Too many open files 问题分析和解决
    TCP端口状态说明ESTABLISHED、TIME_WAIT
    HttpClient当HTTP连接的时候出现大量CLOSE_WAIT连接
    缓存穿透、击穿、雪崩
    Http长连接和Keep-Alive以及Tcp的Keepalive
    防止表单重复提交
  • 原文地址:https://www.cnblogs.com/Black-YeJing/p/9131126.html
Copyright © 2020-2023  润新知