首页 > 其他分享 >AOP

AOP

时间:2024-03-20 18:44:40浏览次数:11  
标签:pickle void MathCalculator AOP import com public

AOP(Aspect Oriented Programming):动态代理

在程序运行期间将某段代码切入到指定方法指定位置进行运行的编程方式。

通知方法

  • 前置通知:在目标方法运行之前运行
  • 后置通知:在目标方法结束之后运行
  • 返回通知:在目标方法正常返回之后运行
  • 异常通知:在目标方法异常返回之后运行
  • 环绕通知:动态代理,手动推进目标方法运行

AOP使用

逻辑类

package com.pickle.aop;

/**
 * @author Pickle
 * @version V1.0
 * @date 2024/3/20 17:36
 */
public class MathCalculator {
    public int div(int i, int j){
        return i/j;
    }
}

切面类

package com.pickle.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;

import java.util.Arrays;

/**
 * 切面类
 *
 * @author Pickle
 * @version V1.0
 * @date 2024/3/20 17:47
 */
@Slf4j
@Aspect
public class LogAspects {
    //抽取公共的切入点表达式
    @Pointcut("execution(public * com.pickle.aop.MathCalculator.*(..))")
    public void pointCut() {
    }

    //切入点表达式
    @Before("pointCut()")
    public void logStart(JoinPoint joinPoint) {
        log.info(joinPoint.getSignature().getName() + "除法运行,参数列表{}", Arrays.asList(joinPoint.getArgs()));
    }

    @After("pointCut()")
    public void logEnd(JoinPoint joinPoint) {
        log.info(joinPoint.getSignature().getName() +"除法结束");
    }

    @AfterReturning(value = "pointCut()",returning = "result")
    public void logReturn(Object result) {
        log.info("除法正常返回,运行结果: {}",result);
    }

    @AfterThrowing(value = "pointCut()", throwing = "exception")
    public void logException(Exception exception) {
        log.info("除法异常返回,异常信息: {}",exception.getMessage());
    }


}

加入IOC容器中

package com.pickle.config;
import com.pickle.aop.LogAspects;
import com.pickle.aop.MathCalculator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * @author Pickle
 * @version V1.0
 * @date 2024/3/20 11:30
 */
@Configuration
@EnableAspectJAutoProxy
public class PickleConfig {
    //业务逻辑类添加到容器中
    @Bean
    public MathCalculator calculator() {
        return new MathCalculator();
    }

    // 切面类加入容器中
    @Bean
    public LogAspects logAspects() {
        return new LogAspects();
    }

}

测试

    @Test
    void contextLoads() {
        final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(PickleConfig.class);
        log.info("容器创建完成");
        final MathCalculator calculator = (MathCalculator)context.getBean(MathCalculator.class);
        calculator.div(1,1);
        System.out.println(calculator);
    }

结果

标签:pickle,void,MathCalculator,AOP,import,com,public
From: https://www.cnblogs.com/poteitoutou/p/18085778

相关文章

  • 使用AOP记录feign调用日志
    文章目录业务场景使用DemoClientFeignDemlFeignFallBack主要代码DockLogAspectDockLogDockLogServiceDockLogAddDTOJacksonUtils业务场景记录请求第三方接口的情况。@DockLog可以用在类上也可以用在方法上使用DemoClientFeignimportorg.springframework.cloud......
  • Java-SpringAop 编程式事物实现
    SpringAop编程式事物实现1.数据库事物特性原子性多个数据库操作是不可分割的,只有所有的操作都执行成功,事物才能被提交;只要有一个操作执行失败,那么所有的操作都要回滚,数据库状态必须回复到操作之前的状态一致性事物操作成功后,数据库的状态和业务规则必须一致。例如:从A......
  • Spring-AOP面相切面编程示例(有详细注释)
    前提知识Spring-IOC容器注解方式使用https://blog.csdn.net/m0_61160520/article/details/136784799?spm=1001.2014.3001.5501切点表达式https://blog.csdn.net/m0_61160520/article/details/136782885?spm=1001.2014.3001.5501案例 1.创建项目2.导入依赖<dependenci......
  • Spring AOP之源码分析
    在研究@Enable*注解的应用之:声明式事务@EnableTransactionManagement详解源码时,配置中context装置了一个TransactionInterceptor的bean。对这个类比较好奇因为Interceptor,因为MyBatis功能点之二(1):MyBatis提供的拦截器平台中也分析过interceptor的使用,这个SpringInterceptor是......
  • 【Java】i18n国际化解决方案:通过AOP切面实现多语言的配置
    需求背景国际化多语言配置。相较于常规的方法,这次采取了切面的方式,来完成所有字段->不同语言的映射。大致逻辑:按常规的国际化,写一个获取语言的方法:getMsg(Stringcode);写一个深层遍历对象的方法traverseObject(Objectobj),通过反射,获取所有类型为字符串的字段,并实现对字......
  • 通俗易懂理解Spring空间的AOP
    在SpringAOP(面向切面编程)中,有几个核心概念:切点、切面、以及织入。我们用一个简单的比喻来理解这些概念。想象你是一名导演,正在拍摄一部电影。在这个比喻中:切点(Pointcut)对应于你决定在电影的哪些场景中插入特定的特效或音乐。在上面的代码中,@Pointcut("execution(public*com.......
  • Spring 5.x 源码之旅-59AOP事务的初始化流程一
    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!阶段1、深入多线程阶段2、深入多线程设计模式阶段3、深入juc源码解析阶段4、深入jdk其余源码解析......
  • Spring 5.x 源码之旅-59AOP事务的初始化流程二
    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!阶段1、深入多线程阶段2、深入多线程设计模式阶段3、深入juc源码解析阶段4、深入jdk其余源码解析......
  • SpringAOP介绍与简单实现
    AOP简介AOP(AspectOrientedProgarmming)意为:面向切面编程,可以通过预编译的方式和运行期动态代理实现在不修改源代码的情况下给程序动态同一添加功能的一种技术。AOP的编程思想就是把很多类对象重的横切问题点,从业务逻辑中分离出来,从而达到解耦的目的,增加代码的重用性,提高开......
  • Spring核心思想之 AOP:如何影响DI并引入三级缓存解决DI中涉及代理的问题
    Spring中AOP的实现与在Spring核心思想之AOP:在自定义容器基础上实现AOP功能中实现的自定义AOP一样,采用后置处理器方式。在Spring的核心思想之DI:详解SpringDI循环依赖实现机制文中末尾提到了一个问题,为什么是三级缓存而不是二级。下面示例AOP是如何影响DI的?......