spring注解:spring aop注解详解

一、 AOP的基本概念

  1. Aspect(切面): 其实就是我们定义的切面类,里面可以定义切入点表达式和前后通知
  2. Pointcut(切点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
  3. JointPoint(连接点):程序执行过程中被切面拦截的点,这个点可以是方法也可以是类
  4. Advice(通知):AOP在特定的切入点上执行的增强处理:before,after,afterReturning,afterThrowing,around
  5. AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类

切面 = 切点+通知

连接点和切入点的区别:

Jointpoint(连接点) 是具体的某个目标方法
Pointcut(切入点) 用于指定 “连接点” 的一个表达式

通知类型

  1. Before:在目标方法被调用之前做增强处理
  2. AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了可以写切入点表达式,还可以指定一个返回值形参名returning,代表目标方法的返回值
  3. AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了可以写切入点表达式外,还可以指定一个throwing的返回值形参名,可以通过该形参名来访问目标方法中所抛出的异常对象
  4. After:在目标方法完成之后做增强,无论目标方法是否成功完成。@After可以指定一个切入点表达式
  5. Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint

二、使用案例

引入jar

<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjrt</artifactId>
</dependency>
<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjweaver</artifactId>
</dependency>
@EnableAspectJAutoProxy
@Component
@Aspect
public class Operator { //切面类,对应概念里面的Aspect

    @Pointcut("execution(* ...service.*)")  //切点,对应概念里面的Pointcut
    public void pointCut(){
    	//配置切点
    }
    
    @Before("pointCut()")   //切点,对应概念里面的Pointcut
    public void doBefore(JoinPoint joinPoint){
        //通知-在目标方法被调用之前做增强处理
    }
    
    @After("pointCut()")
    public void doAfter(JoinPoint joinPoint){
        //通知-在目标方法完成之后做增强
    }
    
    @AfterReturning(pointcut="pointCut()",returning="returnVal")
    public void afterReturn(JoinPoint joinPoint,Object returnVal){
        //通知-在目标方法正常完成后做增强
    }
    
    @AfterThrowing(pointcut="pointCut()",throwing="error")
    public void afterThrowing(JoinPoint joinPoint,Throwable error){
        //通知-主要用来处理程序中未处理的异常
    }
    
    @Around("pointCut()")
    public void around(ProceedingJoinPoint pjp){
    	//通知-环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知
        System.out.println("AOP Aronud before...");
        pjp.proceed();//执行目标方法
        System.out.println("AOP Aronud after...");
    }
}

三、 编码式实现切面

spring aop常用的就是下面几个注解

  1. @Aspect 标注增强处理类(切面)
  2. @Pointcut 自定义切点位置
  3. @Around 定义增强,环绕通知处理

下面使用编码式如何去实现一个切面

1、定义一个需要被切面处理方法
public class TestMethod {
    public void test(){
        System.out.println("测试方法");
    }
}
2、定义通知方法相当于@Around
@Component
public class TestMethodInterceptor implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
        System.out.println("方法调用前");
        Object proceed = methodInvocation.proceed();
        System.out.println("方法调用后");
        return proceed;
    }
}
3、定义切面编程
public static void main(String[] args) {
    TestMethod delegate = new TestMethod();//目标

    TestMethodInterceptor interceptor = new TestMethodInterceptor();//准备通知

    JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut ();
    pointcut.setPattern("com.example.demo.TestMethod.*");//定义切点

    //切面=切点+通知
    Advisor advisor = new DefaultPointcutAdvisor(pointcut, interceptor);

    //创建一个代理工厂
    ProxyFactory factory = new ProxyFactory();
    factory.addAdvisor(advisor);//给代理工厂一个切面
    factory.setTarget(delegate);//需要被代理的对象

    TestMethod proxy = (TestMethod) factory.getProxy();
    proxy.test();
}
4、输出:
方法调用前
测试方法
方法调用后
AOP(面向切面编程)是一种编程思想,它可以在程序运行期间动态地将代码切入到方法、函数或对象(称为“切面”)中,从而实现不同的功能,如日志记录、性能监测、事务管理等。 在AOP中,我们可以使用异常通知(AfterThrowing)来捕获和处理异常。异常通知是在方法抛出异常后执行的代码块,它可以将异常信息记录下来、发送邮件或短信通知开发人员等。 下面是一些处理异常的AOP示例: 1. 使用@AfterThrowing注解 ```java @Aspect @Component public class ExceptionHandlerAspect { @AfterThrowing(pointcut = "execution(* com.example..*.*(..))", throwing = "ex") public void handleException(Exception ex) { // 处理异常 } } ``` 该代码片段中,@AfterThrowing注解定义了一个切面,在满足指定切入点的方法抛出异常后,会执行handleException方法来处理异常。 2. 使用@Around注解 ```java @Aspect @Component public class ExceptionHandlerAspect { @Around("execution(* com.example..*.*(..))") public Object handleException(ProceedingJoinPoint joinPoint) throws Throwable { try { return joinPoint.proceed(); } catch (Exception ex) { // 处理异常 } } } ``` 该代码片段中,@Around注解定义了一个切面,在满足指定切入点的方法执行前后,会执行handleException方法来处理异常。在方法执行过程中,如果出现异常,会被捕获并处理。 总结: 使用AOP集中处理异常可以提高代码的可维护性和可读性,避免在每个方法中都写相同的异常处理代码。然而,需要注意的是,在处理异常时,需要根据具体情况选择合适的方式来处理异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信仰_273993243

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值