zoukankan      html  css  js  c++  java
  • aop注解 自定义切面的注解写法

    spring.xml中

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:context="http://www.springframework.org/schema/context"
     5     xmlns:aop="http://www.springframework.org/schema/aop"
     6     xmlns:tx="http://www.springframework.org/schema/tx"
     7     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     8                          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     9                          http://www.springframework.org/schema/context
    10                          http://www.springframework.org/schema/context/spring-context-3.0.xsd
    11                          http://www.springframework.org/schema/tx
    12                          http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    13                          http://www.springframework.org/schema/aop 
    14                          http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
    15 <!--      扫描注解bean -->
    16      <context:component-scan base-package="cn.us.aspect"/>
    17 <!--      开启切面代理 使得spring认识 @Aspect -->
    18      <aop:aspectj-autoproxy/>

     java文件中   无参数的

     1 package cn.us.aspect;
     2 
     3 
     4 import org.aspectj.lang.annotation.AfterReturning;
     5 import org.aspectj.lang.annotation.Aspect;
     6 import org.aspectj.lang.annotation.Before;
     7 import org.aspectj.lang.annotation.Pointcut;
     8 import org.springframework.stereotype.Component;
     9 
    10 import cn.us.domain.User;
    11 
    12 @Component("logAspect")
    13 @Aspect
    14 public class LogAspect {
    15     // @Pointcut("execution(* cn.us.service.impl.UserServiceImpl.addUser(cn.us.domain.User)) and args(user)")   以下是无参数的写法
    16      @Pointcut("execution(* cn.us.service.impl.UserServiceImpl.*(..))")
    17      public void pointcut()
    18      {}
    19     // @Before("pointcut(user)")
    20       @Before("pointcut()")
    21     // public void startRecordLog(User user)
    22        public void startRecordLog()
    23      {
    24          System.out.println("Before log  has started");
    25          System.out.println();
    26      }
    27 
    28      @AfterReturning(value="pointcut()",returning="val")
    29      public void endRecordLog(Object val)
    30      {
    31          System.out.println("@AfterReturning log  has end");
    32          System.out.println(val);
    33      }
    34 }

    有参数的 利用 @Before和@After写法

    有参数 传递的写法 @Before和 @After 的形参都要写上 参数

     1 package cn.us.aspect;
     2 
     3 
     4 import org.aspectj.lang.ProceedingJoinPoint;
     5 import org.aspectj.lang.annotation.AfterReturning;
     6 import org.aspectj.lang.annotation.Around;
     7 import org.aspectj.lang.annotation.Aspect;
     8 import org.aspectj.lang.annotation.Before;
     9 import org.aspectj.lang.annotation.Pointcut;
    10 import org.springframework.stereotype.Component;
    11 
    12 import cn.us.domain.User;
    13 
    14 @Component("logAspect")
    15 @Aspect
    16 public class LogAspect {
    17     // @Pointcut("execution(* cn.us.service.impl.UserServiceImpl.*(cn.us.domain.User)) and args(user)")
    18     @Pointcut(value="execution(* cn.us.service.impl.UserServiceImpl.addUser(cn.us.domain.User)) && args(user) ")
    19      public void pointcut(User user)
    20      {}
    21     //     @Before(value="pointcut(user)")
    22     //     public void startRecordLog(cn.us.domain.User user)
    23      // @Before("pointcut()")
    24      // public void startRecordLog()
    25      @Before(value="pointcut(user)")
    26      public void startRecordLog(User user)
    27      {
    28          System.out.println("Before log  has started");
    29          System.out.println(user);
    30      }
    31 
    32      @AfterReturning(value="pointcut(user)",returning="val")
    33      public void endRecordLog(User user,Object val)
    34      {
    35          User u=(User) val;                          //这里要强制类型转换,否则输出的位null ,没有强转调用object的,所以就为null了
    36          System.out.println("@AfterReturning log  has end");
    37          System.out.println(u);
    38      }
    39      
    40      @Around(value = "pointcut(user)")
    41      public void aroundRecordLog(ProceedingJoinPoint pjp,User user) throws Throwable
    42      {
    43          System.out.println("around before");
    44          //获取参数
    45          Object [] objs=pjp.getArgs();
    46          for(Object obj :objs)
    47          {
    48              System.out.println(obj);
    49          }
    50          //返回值
    51          Object oo=pjp.proceed();
    52         
    53          System.out.println("around after"  +oo);
    54      }
    55 }

     无参数的写法,利用环绕通知

    可以再环绕通知里 利用getArgs()方法获取参数。并且输出

     1 package cn.us.aspect;
     2 
     3 
     4 import org.aspectj.lang.ProceedingJoinPoint;
     5 import org.aspectj.lang.annotation.AfterReturning;
     6 import org.aspectj.lang.annotation.Around;
     7 import org.aspectj.lang.annotation.Aspect;
     8 import org.aspectj.lang.annotation.Before;
     9 import org.aspectj.lang.annotation.Pointcut;
    10 import org.springframework.stereotype.Component;
    11 
    12 import cn.us.domain.User;
    13 
    14 @Component("logAspect")
    15 @Aspect
    16 public class LogAspect {
    17     // @Pointcut("execution(* cn.us.service.impl.UserServiceImpl.*(cn.us.domain.User)) and args(user)")
    18      @Pointcut(value="execution(* cn.us.service.impl.UserServiceImpl.addUser(..)) ")
    19      public void pointcut()
    20      {}
    21 
    22      @Around(value = "pointcut()")
    23      public void aroundRecordLog(ProceedingJoinPoint pjp) throws Throwable
    24      {
    25          System.out.println("around before");
    26          //获取参数
    27          Object [] objs=pjp.getArgs();
    28          for(Object obj :objs)
    29          {
    30              System.out.println(obj);
    31          }
    32          //返回值
    33          Object oo=pjp.proceed();
    34         
    35          System.out.println("around after"  +oo);
    36      }
    37 }
  • 相关阅读:
    [算法] 选择排序和插入排序
    [Machine-Learning] 机器学习中的几个度量指标
    [SDN] What is SDN?
    SpringBoot注解大全*(转发:http://www.cnblogs.com/ldy-blogs/p/8550406.html)
    java定时器的使用(Timer)(转发:https://blog.csdn.net/ecjtuxuan/article/details/2093757)
    Quartz使用总结(转发:http://www.cnblogs.com/drift-ice/p/3817269.html)
    Spring IOC/DI和AOP原理(转发:https://www.cnblogs.com/techroad4ca/p/5770073.html)
    Java设计模式之《单例模式》及应用场景(转发:http://www.cnblogs.com/V1haoge/p/6510196.html)
    JDBC注册驱动程序的三种方式
    数据库三范式的简单理解
  • 原文地址:https://www.cnblogs.com/friends-wf/p/3832876.html
Copyright © 2011-2022 走看看