Spring注解驱动开发(六)

本文介绍了如何在Spring Boot项目中使用AOP(面向切面编程)实现业务逻辑的动态日志监控,包括前置、后置、环绕通知的应用,以及如何通过@EnableAspectJAutoProxy配置自动代理。通过一个MathCalculator类的示例,展示了切点表达式和通知方法的结合使用。
摘要由CSDN通过智能技术生成

AOP. 配置类

package com.example.paymentdemo.config;

import com.example.paymentdemo.aop.LogAspects;
import com.example.paymentdemo.main.MathCalculator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * @author xushuai
 * @date 2022年03月22日 20:02
 */
/**
 *
 * @author xushuai
 * @date 2022/3/22 20:03
 * @param
 * @return null
 * AOP 在程序运行期间动态的将某些代码切入到指定位置进行运行的编程方式
 * 1。导入AOP;Spring AOP spring-aspects
 *
 * 2。定义一个业务逻辑类
 * 业务逻辑运行的时候打印日志(在方法之前,运行之后,异常时)
 *
 * 3。定义一个日志切面类 切面里的类方法需要动态感知所需方法运行到哪一步
 *  通知方法:前置@Before,方法运行前运行
 *          后置 @After:方法运行结束后运行 无论正常结束还是异常结束
 *          返回@AfterReturning,在目标方法正常返回之后运行
 *          异常通知@AfterThrowing, 方法异常返回
 *
 *          环绕通知 @Around:动态代理,手动推进目标方法运行JoinPoint.procced
 *
 *  4。给切面类的目标方法标注何时何地的运行(通知注解)
 *
 *  5.将切面类和业务逻辑类(目标方法所在类都加入到容器中)
 *
 *  6.告诉SPring哪个是切面类(给切面类上加一个注解) @Aspect
 *
 *  7.给配置类中加@EnableAspectJAutoProxy[开启自动代理] 在spring中有很多xxxJAutoProxy
 *
 *  joinPoint参数一定要出现在参数第一位
 */
@Configuration
@EnableAspectJAutoProxy
public class MainConfigAop {
    //业务逻辑类加入到容器里
    @Bean
    public MathCalculator mathCalculator(){
        return new MathCalculator();
    }
    //切面类加入到容器中
    @Bean
    public LogAspects logAspects(){
        return new LogAspects();
    }

}

属性类

package com.example.paymentdemo.main;

/**
 * @author xushuai
 * @date 2022年03月22日 20:09
 */
public class MathCalculator {
    public int div(int i,int j){
        return i/j;

    }
}

切点,切面

package com.example.paymentdemo.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;

/**
 * @author xushuai
 * @date 2022年03月22日 20:14
 */
@Aspect
public class LogAspects {

    //抽取公共的切入点表达式
    //本类引用
    //其他切面引用
    @Pointcut("execution(public int com.example.paymentdemo.main.MathCalculator.*(..))")
    public void pointCut(){

    }
    //目标方法切入 切入点表达式 指定在哪个方法
    @Before("pointCut()")
    public void logStart(){
        System.out.println("开始运行=====");
    }
    @Around("pointCut()")
    public void logAround(){
        System.out.println("开始运行=====");
    }
    @After("pointCut()")
    public void logEnd(JoinPoint joinPoint){
        System.out.println("运行结束=====");
    }
    @AfterReturning(value = ("pointCut()"),returning = "result")
    public void logReturn(Object result){
        System.out.println("运行结束返回=====");
    }
    @AfterThrowing(value = "pointCut()",throwing = "exception")
    public void logException(Exception exception){
        System.out.println("运行异常=====");
    }
}

测试类

package com.example.paymentdemo.main;

import com.example.paymentdemo.config.MainConfigAop;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * @author xushuai
 * @date 2022年03月22日 20:53
 */
public class AopTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigAop.class);
        //不要自己New对象,要使用spring容器里的
        //MathCalculator mathCalculator = new MathCalculator();
        MathCalculator bean = applicationContext.getBean(MathCalculator.class);
        int div = bean.div(1, 2);
        System.out.println("=======");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值