AspectJ学习笔记

  1. 介绍

    1. AspectJ是一个基于Java语言的AOP框架
    2. Spring2.0以后新增了对AspectJ切点表达支持
    3. @AspectJ是AspectJ1.5新增功能,通过JDK5注解技术,允许Bean类中定义切面,新版本Spring框架,建议使用AspectJ方式来开发AOP
    4. 主要用途:自定义开发
  2. 切入点表达式

    1. execution() 用于描述方法

      <!--创建目标类-->
      <bean id="userService" class="com.adolph.AOP.jdk.UserServiceImpl"></bean><!--创建切面类-->
      <bean id="myAspect" class="com.adolph.AOP.jdk.MyAspect"></bean><!--aop编程使用<aop:config>进行配置proxy-target-class="true":使用cglib代理<aop:pointcut>切入点,从目标对象获得具体方法<aop:advisor> 特殊的切面,只有一个通知和一个切入点advice-ref:通知引用pointcut-ref:切入点引用切入点表达式:execution(* com.adolph.AOP.jdk.*.*(..))选择方法 返回值任意  包 类名任意 方法名任意 参数任意
      -->
      <aop:config proxy-target-class="true"><aop:pointcut id="myPointCut" expression="execution(* com.adolph.AOP.jdk.*.*(..))"/><aop:advisor advice-ref="myAspect" pointcut-ref="myPointCut"/>
      </aop:config>
      复制代码
      1. 语法:execution(修饰符 返回值 包.类.方法(参数) throws 异常)

        1. 修饰符:一般省略
        2. 返回值:*(任意)
          1. 省略
            1. con.adolph.cn 固定包
            2. com.adolph. adolph包下面子包任意*
            3. com.adolph.. adolph包下面的所有子包(含自己)
          1. 省略
          2. UserServiceImpl 指定类
          3. *Impl 以Impl结尾
          4. User 以User开头*
          5. *. 任意
        3. 方法名
          1. 不能省略
          2. addUser 固定方法
          3. add 以add开头*
          4. *Do 以Do结尾
          5. *. 任意
        4. 参数
          1. () 无参
          2. (int) 一个整型
          3. (int,int) 两个
          4. (..) 参数任意
        5. throws
          1. 可省略,一般不写
      2. 综合

           `execution(* com.adolph.AOP.jdk.*.*(..))`
        复制代码
  3. AspectJ通知类型

    1. aop联盟定义通知类型,具有特性接口,必须实现,从而确定方法名称
    2. aspectj 通知类型,只定义类型名称。以及方法格式
    3. 个数:6种,知道5种,掌握一种
      1. before:前置通知
      2. afterReturning:后置通知(应用:常规数据处理)
      3. around:环绕通知(应用:十分强大,可以做任何事情)
        1. 方法执行前后分别执行、可以阻止方法的执行
        2. 必须手动执行目标方法
      4. afterThrowing:抛出异常通知(应用:包装异常信息)
      5. after:最终通知(应用:清理现场)
  4. 基于XML

    1. 目标类:接口+实现

    2. 切面类:编写多个通知,采用aspectJ通知名称任意(方法名任意)

    3. aop编程:将通知应用到目标类

    4. 测试

    5. 目标类

      public class UserServiceImpl {public void addUser() {System.out.println("addUser");}public void updateUser() {System.out.println("updateUser");}public void deleteUser() {System.out.println("deleteUser");}
      }
      复制代码
    6. 切面类

      /*** 切面类,含有多个通知*/
      public class MyAspect {public void myBefore(JoinPoint joinPoint) {System.out.println("前置通知" + joinPoint.getSignature().getName()); //获得目标方法名}public void myAfterReturning(JoinPoint joinPoint, Object ret) {System.out.println("后置通知" + joinPoint.getSignature().getName() + "____" + ret); //获得目标方法名}public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable{System.out.println("前");//手动执行目标方法Object proceed = joinPoint.proceed();System.out.println("后");return proceed;}public void MyAfterThrowing(JoinPoint joinPoint,Throwable e){System.out.println("抛出异常通知:");}public void after(JoinPoint joinPoint){System.out.println("最终");}
      }
      复制代码
    7. xml

      <!--创建目标类-->
      <bean id="userService" class="com.adolph.AOP.jdk.UserServiceImpl"></bean><!--创建切面类-->
      <bean id="myAspect" class="com.adolph.AOP.jdk.MyAspect"></bean>
      <!--aop编程
      -->
      <aop:config><!--将切面类 声明成切面,从而获得通知(方法),ref:切面类引用--><aop:aspect ref="myAspect"><!--声明一个切入点,所有的通知都可以使用expression:切入点表达式id:名称用于其他通知引用--><aop:pointcut id="myPointcut" expression="execution(* com.adolph.AOP.jdk.UserServiceImpl.*(..))"></aop:pointcut><!--前置通知method:通知,及方法名pointcut:切入点表达式,此表达式只能当前通知使用pointcut-ref:切入点引用,可以与其他通知点共享切入点通知方法格式:public void myBefore(JoinPoint joinPoint)参数JoinPoint 用于描述连接点(目标方法),获得目标方法名称等--><aop:before method="myBefore" pointcut-ref="myPointcut"></aop:before><!--后置通知,目标方法执行,获得返回值public void myAfterReturning(JoinPoint joinPoint,Object ret)参数1:连接点描述参数2:类型Object,参数名returning配置的--><aop:after-returning method="myAfterReturning" pointcut-ref="myPointcut" returning="ret"></aop:after-returning><!--环绕通知public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable返回值:Object方法名:任意参数:Proceeding JoinPoint抛出异常--><aop:around method="myAround" pointcut-ref="myPointcut"></aop:around><!--异常通知throwing:通知方法的第二个参数名称--><aop:after-throwing method="MyAfterThrowing" pointcut-ref="myPointcut" throwing="e"></aop:after-throwing><!--最终通知--><aop:after method="after" pointcut-ref="myPointcut"></aop:after></aop:aspect>
      </aop:config>
      复制代码
  5. 基于注解

    1. 替换bean

      
      <!--扫描-->
      <context:component-scan base-package="com.adolph.AOP"></context:component-scan>
      复制代码
      @Component
      public class MyAspect
      复制代码
    2. 必须进行aspectj自动代理

      <!--确定aop注解生效-->
      <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
      复制代码
    3. 声明切面

      @Component
      @Aspect
      public class MyAspect
      复制代码
    4. 设置前置通知

         @Before("execution(* com.adolph.AOP.jdk.UserServiceImpl.*(..))")public void myBefore(JoinPoint joinPoint) {System.out.println("前置通知" + joinPoint.getSignature().getName()); //获得目标方法名}
      复制代码
    5. 替换公共切入点

      @Pointcut("execution(* com.adolph.AOP.jdk.UserServiceImpl.*(..))")
      private void myPointCut(){}
      复制代码
    6. 设置后置通知

      @AfterReturning(value = "myPointCut()",returning = "ret")
      public void myAfterReturning(JoinPoint joinPoint, Object ret) {System.out.println("后置通知" + joinPoint.getSignature().getName() + "____" + ret); //获得目标方法名
      }
      复制代码
    7. 设置环绕通知

      @Around(value = "myPointCut()")
      public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable{System.out.println("前");//手动执行目标方法Object proceed = joinPoint.proceed();System.out.println("后");return proceed;
      }
      复制代码
    8. 设置抛出异常

      @AfterThrowing(value = "myPointCut()",throwing = "e")
      public void MyAfterThrowing(JoinPoint joinPoint,Throwable e){System.out.println("抛出异常通知:");
      }
      复制代码
    9. 最终通知

      @AfterThrowing(value = "myPointCut()",throwing = "e")
      public void MyAfterThrowing(JoinPoint joinPoint,Throwable e){System.out.println("抛出异常通知:");
      }
      复制代码

转载于:https://juejin.im/post/5ca23972e51d453c0f7d8e93

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows10访客_如何在Windows 10中创建访客帐户

windows10访客If you find that your guests are asking fairly often to use your computer temporarily to check their email or look something up on the web, you don’t have to let them use your personal account or create a special account for each guest. 如果发…

C#使用 System.Net.Mail发送邮件功能

介绍System.Net.Mail命名空间是在.NET Framework中新增的&#xff0c;该命名空间提供了发送电子邮件的功能。通过对本章的学习&#xff0c;读者可以轻松地使用.NET Framework提供的类库来发送电子邮件。System.Net.Mail 命名空间包含用于将电子邮件发送到SMTP服务器的类&#x…

初识smarty

个人体会(不完全正确)&#xff1a;就是smarty就是为了更好的使得php/html结合做出来的一个框架。 , 转载于:https://www.cnblogs.com/nul1/p/9357694.html

几个有趣的算法题目

本文首发 http://svtter.cn最接近的数字 题目 一个K位的数N $$ (K\leq2000&#xff0c;N\leq10^{20}) $$ 找出一个比N大且最接近的数&#xff0c;这个数的每位之和与N相同&#xff0c;用代码实现之。 例如&#xff1a;0050 所求书数字为0104&#xff1b;112 所求数为121&#x…

获取一篇新闻的全部信息

给定一篇新闻的链接newsUrl&#xff0c;获取该新闻的全部信息 标题、作者、发布单位、审核、来源 发布时间:转换成datetime类型 点击&#xff1a; newsUrlnewsId(使用正则表达式re)clickUrl(str.format(newsId))requests.get(clickUrl)newClick(用字符串处理&#xff0c;或正则…

上twitter_如何在Twitter上更改您的显示名称

上twitterUnlike Facebook, Twitter has never insisted people user their real names. In fact, there’s a long tradition of people changing their names to a joke or pun because it’s Christmas or Halloween, or just for no reason at all. 与Facebook不同&#xf…

技术走向管理一些思考(1)-性格特质和自我管理

技术走向管理一些思考-文件夹 1&#xff0c;管理需具备的性格特质 赞赏他人&#xff1a;以一种不以自我为中心的合作的方式和他人相处&#xff0c;能平静和客观地接受不同的人。放下自己的性格、喜好&#xff0c;去赞赏不同类型的人。不是通过个人友谊或者熟悉程度。而是通过某…

网桥

配置实现网桥 网桥&#xff1a;即桥接 把一套机器上的若干个网络接口 “连接” 起来&#xff0c;其结果是&#xff0c;其中一个网口收到的报文会被复制给其他网口并发送出去。以使得网口之间的报文能够互相转发。网桥就是这样一个设备&#xff0c;它有若干个网口&#xff0c;并…

Newtonsoft.Json Deserialize Type 或者 同类型 变量 反序列化

Newtonsoft.Json 经常再用 这样的需求 还是很少用 场景 方法一&#xff1a;根据 Type 反序列化 int demo 0; string jsongString JsonConvert.SerializeObject(demo); int jsonDemo JsonConvert.DeserializeObject(jsongString, demo.GetType()); 方法二 根据 同类型变量 序…

raspberry pi_在月光下将Raspberry Pi变成蒸汽机

raspberry piValve’s Steam Machines aim to bring your Steam game library right into your living room (but at a rather steep premium). Today we’ll show you how to bring your Steam library (plus all your other computer games) to your living room for a fract…

文档测试【转载】

原文来自&#xff1a;51Testing软件测试网采编 作者&#xff1a; 仙灵测试(sinablog) 原文链接&#xff1a;http://www.51testing.com/html/61/n-237961.html 1、文档的种类 ● 联机帮助文档或用户手册 这是人们最容易想到的文档。用户手册是随软件发布而印制的小册子…

NOI2019省选模拟赛 第三场

传送门 明明没参加过却因为点进去结果狂掉\(rating\)…… \(A\) 集合 如果我们记 \[f_k\sum_{i1}^nT^i{n-i\choose k}\] 那么答案显然就是\(f_{k-1}\) 然后就可以开始推倒了 \[ \begin{aligned} f_k &\sum_{i1}^nT^i{n-i\choose k}\\ &\sum_{i1}^nT^i{n-i-1\choose k}\…

MySql数据库出现 1396错误

1、安装MySql数据库后。创建新的用户。有可能会出现 1396这个错误&#xff0c; 2、解决的办法如下&#xff1a;假装有你需要创建的这个用户、先删了。再创建。 3、这样就可以解决用户创建不成功的问题了。 转载于:https://www.cnblogs.com/chifa/p/9362882.html

如何使用wink框架_如何解决Wink Hub的Z-Wave连接问题

如何使用wink框架Overall, the Wink hub works extremely well…but sometimes the devices you have connected to it can act a little wonky. Here are some things you can do in order to fix any connection issues with all of those Z-Wave sensors and devices connec…

Tomcat服务器启动错误之Offending class: javax/servlet/Servlet.class

引子 最近在基于Wex5项目开发中&#xff0c;遇到使用过程中与Tomcat功能有关的错误提示&#xff0c; 如题所示。最终的解决方法就是删除掉项目上与tomcat冲突的jar包。 org.apache.catalina.loader.WebappClassLoader validateJarFile ??: validateJarFile(/Users/zxzpc/…

面向对象进阶(二)----------类的内置方法

一、isinstance(obj,cls)和issubclass(sub,super) 1. isinstance(obj,cls): 检查是否obj是否是类 cls 的对象 class Player:passp Player()print(isinstance(p, Player))>>> Ture 2. issubclass(sub, super): 检查sub类是否是 super 类的派生类 class Player:passcla…

BZOJ.3265.志愿者招募加强版(费用流SPFA)

题目链接 见上题。 每类志愿者可能是若干段&#xff0c;不满足那个...全幺模矩阵(全单位模矩阵)的条件&#xff0c;所以线性规划可能存在非整数解。 于是就可以用费用流水过去顺便拿个rank2 233. //20704kb 300ms #include <queue> #include <cstdio> #include &…

谷歌相册_Google相册中的新存档功能是什么?

谷歌相册If you’re a Google Photos user, you’ve may have seen a new feature called “Archive” show up in the app’s sidebar. if not, don’t stress—it’s just now rolling out and not everyone has it yet. Since it’s new, here’s a quick look at what it i…

CenterOS 7安装Nginx

1.wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm下载对应当前系统版本的nginx包(package) 2.rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm建立nginx的yum仓库 3.yum install nginx 下载并安装nginx systemctl s…

Java的组合排列问题

从4个人中选2个人参加活动&#xff0c;一共有6种选法。 从n个人中选m个人参加活动&#xff0c;一共有多少种选法&#xff1f;C(m/n)C((m-1)/(n-1))C(m/(n-1))数学算法 public class Main {public static void main(String[] args) {System.out.println("请输入总人数:&quo…