SpringBoot AOP AspectJ切面技术介绍与实现方式

目录
  • AspectJ简介
  • 什么是AspectJ
  • 实现AOP的方式
    • 原生使用切面
  • 通过注解使用切面

AspectJ简介

  • 它不属于spring;
  • AspectJ是一个AOP的框架;
  • 定义了AOP语法;
  • 有一个专门的编译器用来生成遵守Java字节编码规范的Class文件

Spring AOP 回顾

什么是AspectJ

  • AspectJ是使用面向切面的一个框架
  • 它扩展了Java语言(它本身也是一种语言)
  • 支持原生Java代码 有自己的编译器
  • 将代码翻译成Java字节码文件
  • 是为了方便编写AOP代码而出现的
  • 使用AOP编程的三个重点 通知 切点 织入

实现AOP的方式

原生使用切面

添加AOP坐标

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

创建增强类MyAOP

对service层下的所有类的所有方法进行增强

@Component
@Aspect
public class MyAOP {
    //定义切点
    @Pointcut("execution(* com.moming.service.*.*(..))")
    public void point(){}
    @Before("point()")
    public void before(){
        System.out.println("===>前置通知");
    }
    @After("point()")
    public void after(){
        System.out.println("===>后置通知");
    }
    @Around("point()")
    public Object arround(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("===>环绕前");
        Object resules = pjp.proceed();
        System.out.println("===>环绕后");
        return resules;
    }
    @AfterReturning(value = "point()",returning = "ret")
    public void returning(JoinPoint jp, String ret){
        Object[] args = jp.getArgs();
        System.out.println("返回后通知获取参数: "+Arrays.toString(args));
        System.out.println("===>返回后通知,返回值: "+ret);
    }
    @AfterThrowing("point()")
    public void throwing(){
        System.out.println("===>异常通知");
    }
}

service/OrderService

@Service
public class OrderService {
    public String order(int id){
        System.out.println("===>目标方法:订单业务ID:"+id);
        return "001202210121010";
    }
}

启动类测试

@SpringBootApplication
public class App2 {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(App2.class, args);
        OrderService bean = context.getBean(OrderService.class);
        System.out.println(bean.order(1));
    }
}

无异常时

有异常时,后续代码就不再执行了

补充配置说明

//两种占位符
//* 代表的是一个单词,b* 代表的是以b开头的单词。 例如 bds
//.. 通配符 ,代表的是0个或者多个匹配项

通过注解使用切面

声明注解NeedCut

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface NeedCut {
}

切换注解

@Component
@Aspect
public class MyAOP {
    //定义切点
    @Pointcut("@annotation(com.moming.annotation.NeedCut)")
    public void point(){}
    @Before("point()")
    public void before(){
        System.out.println("===>前置通知");
    }
    @After("point()")
    public void after(){
        System.out.println("===>后置通知");
    }
    @Around("point()")
    public Object arround(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("===>环绕前");
        Object resules = pjp.proceed();
        System.out.println("===>环绕后");
        return resules;
    }
    @AfterReturning(value = "point()",returning = "ret")
    public void returning(JoinPoint jp, String ret){
        Object[] args = jp.getArgs();
        System.out.println("返回后通知获取参数: "+Arrays.toString(args));
        System.out.println("===>返回后通知,返回值: "+ret);
    }
    @AfterThrowing("point()")
    public void throwing(){
        System.out.println("===>异常通知");
    }
}

使用注解@NeedCut

@Service
public class OrderService {
    @NeedCut
    public String order(int id){
        System.out.println("===>目标方法:订单业务ID:"+id);
        return "001202210121010";
    }
    public void add(){
        System.out.println("===>添加订单");
    }
}

测试

@SpringBootApplication
public class App2 {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(App2.class, args);
        OrderService bean = context.getBean(OrderService.class);
        System.out.println(bean.order(01));
        System.out.println("-------------------");
        bean.add();
    }
}

使用@NeedCut注解的方法才进行增强

到此这篇关于SpringBoot AOP AspectJ切面技术介绍与实现方式的文章就介绍到这了,更多相关SpringBoot AOP AspectJ切面内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring基于常用AspectJ切点表达式使用介绍

    execution (常用,方法级别的匹配) 语法: execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?) modifiers-pattern:方法的访问符,如public.protected.default,不能匹配private方法 ret-type-pattern:方法的返回值类型,例:java.util.List.j

  • Spring AspectJ 实现AOP的方法你了解吗

    目录 1.什么是 AspectJ? 2.切入点表达式 AOP 切入点表达式支持多种形式的定义规则: 2.Aspect 通知类型 3.AOP具体实例 ①.创建接口 ②.创建实现类 ③.创建切面类(包含各种通知) ④.创建spring配置文件applicationContext.xml ⑤.测试 4.测试异常通知 5.测试环绕通知 总结 1.什么是 AspectJ? AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,也可以说 AspectJ 是一个基于 Jav

  • Aspectj与Spring AOP的对比分析

    1.简介 今天有多个可用的 AOP 库, 它们需要能够回答许多问题: 1.是否与用户现有的或新的应用程序兼容? 2.在哪里可以实现 AOP? 3.与自己的应用程序集成多快? 4.性能开销是多少? 在本文中, 我们将研究如何回答这些问题, 并介绍 Spring aop 和 AspectJ, 这是 Java 的两个最受欢迎的 aop 框架. 2.AOP概念 在开始之前, 让我们对术语和核心概念进行快速.高层次的审查: Aspect -- 一种标准代码/功能, 分散在应用程序中的多个位置, 通常与实际

  • Spring学习通过AspectJ注解方式实现AOP操作

    目录 Spring注解AspectJ操作AOP 一.被增强类 二.增强类 三.进行通知的配置 1. spring 配置文件中,开启扫描. 2. 使用注解创建 User 和 UserProxy 对象 3. 在增强类上使用注解 @Aspect 4. spring配置,开启生成代理对象 5. 配置不同类型的通知 四.抽取相同切入点 五.多个增强类的优先级 Spring注解AspectJ操作AOP 一.被增强类 新建一个被增强的类 User,下面有个 add() 方法. package com.ping

  • Spring基于AspectJ的AOP开发案例解析

    目录 AspectJ简介 注解开发 环境准备 不同的通知类型 最通知中通过value属性定义切点 入门案列 @Before前置通知 @AfterReturning后置通知 @Around环绕通知 @AfterThrowing 异常抛出通知 @After 最终通知 通过@Pointcut为切点命名 AspectJ的XML方式的AOP开发 使用AspectJ实现AOP 注解方式 XML方式 AspectJ简介 AspectJ是一个基于Java语言的AOP框架 Spring2.0以后新增了对Aspec

  • SpringBoot AOP AspectJ切面技术介绍与实现方式

    目录 AspectJ简介 什么是AspectJ 实现AOP的方式 原生使用切面 通过注解使用切面 AspectJ简介 它不属于spring: AspectJ是一个AOP的框架: 定义了AOP语法: 有一个专门的编译器用来生成遵守Java字节编码规范的Class文件 Spring AOP 回顾 什么是AspectJ AspectJ是使用面向切面的一个框架 它扩展了Java语言(它本身也是一种语言) 支持原生Java代码 有自己的编译器 将代码翻译成Java字节码文件 是为了方便编写AOP代码而出现

  • SpringBoot AOP @Pointcut切入点表达式排除某些类方式

    目录 SpringBoot AOP @Pointcut切入点表达式排除某些类 场景 使用以下方法满足了开发需求 AOP排除某些类型不拦截 SpringBoot AOP @Pointcut切入点表达式排除某些类 场景 希望给service包下的所有public方法添加开始和结束的info log,但是需要排除和数据库相关的service 其他博文都推荐了 @Pointcut("execution(* com.demo.service.*.*(..)) && !execution(*

  • Springboot如何使用Aspectj实现AOP面向切面编程

    目录 要在 Springboot中声明 AspectJ 切面 引入jar包 网上也有说要在application.properties中添加 最后补充一点小知识 AspectJ 支持 5 种类型的通知注解 下面是我写的一些通知的实例 大家可以参考一下 要在 Springboot中声明 AspectJ 切面 需在 IOC 容器中将切面声明为 Bean 实例 即加入@Component 注解;当在 Spring IOC 容器中初始化 AspectJ 切面之后, Spring IOC 容器就会为那些与

  • Spring使用AspectJ的注解式实现AOP面向切面编程

    1.认识Spring AOP 1.1 AOP的简介 AOP:面向切面编程,相对于OOP面向对象编程. Spring的AOP的存在目的是为了解耦.AOP可以让一组类共享相同的行为.在OOP中只能通过继承类和实现接口,来使代码的耦合度增强,而且类的继承只能为单继承,阻碍更多行为添加到一组类上,AOP弥补了OOP的不足. 1.2 AOP中的概念 切入点(pointcut): 切入点(pointcut):在哪些类.哪些方法上切入. 通知(advice):在方法前.方法后.方法前后做什么. 切面(aspe

  • SpringBoot整合aop面向切面编程过程解析

    这篇文章主要介绍了SpringBoot整合aop面向切面编程过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通过对既有程序定义一个切入点,然后在其前后切入不同的执行内容,比如常见的有:打开数据库连接/关闭数据库连接.打开事务/关闭事务.记录日

  • MVC AOP面向切面编程简单介绍及实例

    MVC AOP面向切面编程 AOP这个词相信大家都没有接触太多过,但是实际上你们已经有所接触了,就在设计模式中.AOP所用的思想其实和设计模式是一样的,即在不修改原代码的情况下统一增加或者修改功能.还有,AOP大多用在spring里面,但是本文所写的只是在MVC中的应用,要注意. 一.简介 所谓AOP(Aspect Oriented Programming的缩写)意为面向切面的编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是

  • springboot实现基于aop的切面日志

    本文实例为大家分享了springboot实现基于aop的切面日志的具体代码,供大家参考,具体内容如下 通过aop的切面方式实现日志 通切面拦截所有指定包下的所有方法 @Aspect @Component @EnableAspectJAutoProxy public class LogAspect1{     Logger logger = LoggerFactory.getLogger(LogAspect.class);      /**  * 拦截切点  */     @Pointcut("e

  • SpringBoot Aop 详解和多种使用场景解析

    前言 aop面向切面编程,是编程中一个很重要的思想本篇文章主要介绍的是SpringBoot切面Aop的使用和案例 什么是aop AOP(Aspect OrientedProgramming):面向切面编程,面向切面编程(也叫面向方面编程),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 使用场景 利用AOP可以对我们边缘业务进行隔离,降低无关业务逻辑耦

  • 使用springboot aop来实现读写分离和事物配置

    什么事读写分离 读写分离,基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE),而从数据库处理SELECT查询操作.数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库. 为什么要实现读写分离 增加冗余 增加了机器的处理能力 对于读操作为主的应用,使用读写分离是最好的场景,因为可以确保写的服务器压力更小,而读又可以接受点时间上的延迟. 实现 本文介绍利用spring aop来动态切换数据源来实现读写分离. 先建一个maven项目,导入springBo

  • 使用SpringBoot AOP 记录操作日志、异常日志的过程

    平时我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能:我们在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因我们都要到服务器去查询日志才能找到,而且也不能对发生的异常进行统计,从而改进我们的项目,要是能做个功能专门来记录操作日志和异常日志那就好了, 当然我们肯定有方法来做这件事情,而且也不会很难,我们可以在需要的方法中增加记录日志的代码,和在每个方法中增加记录异常的代码,最终把记录的日志存到数据库中.听起来好像很容易,但是我们做起来会发现,做这项工作很繁

随机推荐