首页 > 其他分享 >Spring-Aop

Spring-Aop

时间:2023-08-17 10:34:02浏览次数:24  
标签:double Aop System result Spring println public out

   1、面向切面编程Aspect,通过预编译方式和运行期间动态代理实现程序的统一维护的一种技术 

   2、AOP应用场景

        (1) 记录日志

        (2) 权限校验

        (3) Spring事务管理

   3、AOP的结构

        AOP要做的三件事,在哪里切入,也就是权限校验,等非业务操作在哪些业务代码中执行;什么时候切入,是业务代码执行前还是执行后;切入后做什么事,比如做权限校验、日志记录等。

          

        (1) Aspect : 切面

        (2) PointCut : 切点  ---方式:1、路径表达式   2、注解形式

        (3) Advice: 处理的时机。

   4、路径表达式使用AOP

       4.1、路径表达式

   

@Aspect//标记该类为切面类
@Component//该类对象的创建交于Spring容器来管理同类有@service @Controller
public class aop1 {
    /**
     * @Pointcut(value = "execution(public double comm.aop.MathServiceImpl.jia(double ,double ))")  
     * 第一个 * :表示任意修饰符   任意返回类型
     * 第二个 * : 表示该包下所有的类
     * 第三个 * : 类下所有的方法
     *  (..)    表示任意参数
     
     */
   @Pointcut(value = "execution(* comm.aop*.*(.. ))")
    private void mypointcut(){}
    @After(value = "mypointcut()")
    public void b(){
        System.out.println("AAAAAAAAA");
    }
}

Service:

public interface Mathservice {
    public double jia(double a, double b);
    public double jian(double a, double b);
    public double Cheng(double a, double b);
    public double chu(double a, double b);
}

ServiceImpl:

@Service
public class MathServiceImpl implements Mathservice {
    @Override
    public double jia(double a, double b) {
        double result=a+b;
        System.out.println("AAA--->The add method result="+result);
        return result;
    }
    @Override
    public double jian(double a, double b) {
        double result=a-b;
        System.out.println("AAA--->The add method result="+result);
        return result;
    }
    @Override
    public double Cheng(double a, double b) {
        double result=a * b;
        System.out.println("AAA--->The add method result="+result);
        return result;
    }
    @Override
    public double chu(double a, double b) {
        double result=a/b;
        System.out.println("AAA--->The add method result="+result);
        return result;
    }
}

测试:

public class Text {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml");
        Mathservice mathServiceImpl =(Mathservice) context.getBean("mathServiceImpl");
        System.out.println(mathServiceImpl.jia(20, 10));
    }
}

    

    4.2、注解表达式

          (1) 自定义注解

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "";
}

          (2) 修改切面类

@Pointcut(value = "@annotation(comm.aop.MyAnnotation)")
private void mypointcut(){}
@After(value = "mypointcut()")
public void b(){
    System.out.println("AAAAAAAAA");
}

    5、AOP切面通知的类型

                

              @Before 前置通知. 被代理的方法执行前--执行

//前置通知:
@Before(value = "mypointcut()")
public void a(){
    System.out.println("方法执行前执行切面的内容,前置通知");
}

 

              @After: 后置通知: 被代理的方法执行完后--执行

//后置返回通知,碰到return,如果方法出现异常;这种通知不会被执行
@After(value = "mypointcut()")
public void b(){
    System.out.println("AAAAAAAAA");
}

              @AfterReturning: 后置返回通知: 被代理的方法碰到return.--才会执行

//后置返回通知,碰见return,如果方法出现异常;这种通知不会被执行
@AfterReturning(value = "mypointcut()",returning = "t")//returning 它会把方法执行的结果赋值给该变量
public void afterReturning(Object t){
    System.out.println("后置返回通知:"+t);
}

     执行结果:

          

              @AfterThrowing: 后置异常通知: 当被代理的方法出现异常时--才会执行。

//异常通知:当被切入的方法出现异常时,才会执行
@AfterThrowing(value = "mypointcut()")
public void afterThrowing(){
    System.out.println("异常通知");
}

      异常执行结果:

         

              @Around: 环绕通知。

//环绕通知
@Around(value = "mypointcut()")
//joinPoint:连接点 理解为被执行的方法对象
public Object around(ProceedingJoinPoint joinPoint){
    System.out.println("业务代码执行前的内容");
    try {
        Object proceed = joinPoint.proceed();//执行的连接点
        System.out.println("方法执行完毕后");
        return proceed;
    } catch (Throwable throwable) {
        throwable.printStackTrace();
        System.out.println("方法出现异常代码执行异常");
    } finally {
        System.out.println("代码都会执行的地方");
    }
    return 0.0;
}

    环绕执行结果:

        

 

标签:double,Aop,System,result,Spring,println,public,out
From: https://www.cnblogs.com/PHOEDE/p/17636226.html

相关文章

  • javaSpring操作事务
    1.什么是事务简单理解你:事务就是将一系列动作看成是一次工作单元,又涉及到套娃了举个栗子:转账操作,张三向李四转账100块钱,在转账途中,突然停电,但是账单已经发出去了,这个时候如果没有事务的话,那么张三向李四转账的100块钱将不翼而飞事务的作用,将张三和李四的的转账看成一个动作,要......
  • SpringBoot3集成RocketMq
    标签:RocketMq5.Dashboard;一、简介RocketMQ因其架构简单、业务功能丰富、具备极强可扩展性等特点被广泛应用,比如金融业务、互联网、大数据、物联网等领域的业务场景;二、环境部署1、编译打包1、下载5.0版本源码包rocketmq-all-5.0.0-source-release.zip2、解压后进入目录,编......
  • Spring事物
    一、什么是事务?事务:一系列执行SQL语句的操作,它被当作一个单独的工作单元,这些操作要么全部完成,要么全部不起作用。二、事务的四大特征1、原子性(Atomicity)一个事务是不可分割的最小工作单位执行事务,要么全部成功,要么回滚到执行事务之前的状态。2、一致性(Consistency)事务......
  • SpringBoot3集成RocketMq
    标签:RocketMq5.Dashboard;一、简介RocketMQ因其架构简单、业务功能丰富、具备极强可扩展性等特点被广泛应用,比如金融业务、互联网、大数据、物联网等领域的业务场景;二、环境部署1、编译打包1、下载5.0版本源码包rocketmq-all-5.0.0-source-release.zip2、解压后进入目录,......
  • java Sping aop 以及Spring aop 的应用事务管理
    1.回顾线程死锁概念和如何避免死锁的发生:线程的通信waitnotify()notify():---Object类线程的状态:NEW--->start()--->就绪状态---CPU时间片---运行状态RUNNABLE]--->sleep()--->TIMED_WAITING--->wait()---->WAITING----sysn---Blocked---->终止状态[T]线程池:常见......
  • 一个新的springboot框架-COLA
    新来个技术总监,给公司项目引入了全新的业务架构,堪称最佳实践!(qq.com)......
  • AOP
    AOP一、什么是AOP?Aop的专业术语(来源百度):在软件业,AOP为AspectOrientedProgramming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范......
  • 详谈 springboot整合shiro
    背景:上文学习了shrio基本概念后,本章将进一步的落地实践学习,在springboot中如何去整合shrio,整个过程步骤有个清晰的了解。 利用Shiro进行登录认证主要步骤:1.添加依赖:首先,在pom.xml文件中添加SpringBoot和Shiro的相关依赖。<!--SpringBoot--><dependency><groupI......
  • SpringBoot项目统一处理返回值和异常
    目录简介前期准备统一封装报文统一异常处理自定义异常信息简介当使用SpringBoot开发Web项目的API时,为了与前端更好地通信,通常会约定好接口的响应格式。例如,以下是一个JSON格式的响应,通过返回码和返回信息告知前端具体的操作结果或错误信息。如果操作成功,前端可以通过"data"字段......
  • javaSpring之AOP
    1.什么是AOP翻译中文为:面向切面编程,可以让你在业务代码与非业务代码隔离,增加新的非业务代码2.AOP使用场景1.我一直遵循着存在即合理的观念,在各大需求中,有一种需求是每当操作时,就会在数据库记录日志,那么在不更改业务代码的情况下应该怎么做,没错,AOP可以解决2.当然,其也可以做权限......