W
e
l
c
o
m
e
: )

AOP与代理模式详解

底层原理

创建aspectJAdvisorsBuilder

spring容器启动时扫描

在AnnotationAwareAspectJAutoProxyCreator类中,spring容器会扫描所有带有@Aspect注解的类

容器创建代理对象


根据不同的类型选择创建代理的方式(jdk或cglib)

jdk方式创建

cglib方式

创建后如图(cglib)

什么是AOP?

AOP(Aspect-Oriented Programming)是一种编程范式,旨在将横切关注点(cross-cutting concerns)与业务逻辑代码分离。横切关注点是指那些跨越多个模块或方法的通用功能,如日志记录、事务管理、安全检查和性能监控等。通过将这些关注点封装为“切面”(Aspect),AOP可以在不修改业务逻辑代码的情况下,动态地将这些功能添加到程序中

AOP使用的方式

简单aop示例

TestAnnotation

package aop;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

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

TestAspect

package com.example.demo.demos.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class TestAspect {
	 //设置切面点
    @Pointcut("@annotation(testAnnotation)")
    public void loginBefore(aop.TestAnnotation testAnnotation){
    }
    @Before("loginBefore(testAnnotation)")
    public void checkPermission(JoinPoint joinPoint, aop.TestAnnotation testAnnotation) throws Exception {
        String requiredPermission = testAnnotation.value();
        if (requiredPermission.equals("false")) {
            throw new Exception("You do not have permission to execute this operation.");
        }
    }
}

TestController

## 相关示例
package com.example.demo.demos.aop;


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @RequestMapping("/test")
    @aop.TestAnnotation("false")
    public void test(){
        System.out.println("1234");
    }
}

AOP使用场景

日志记录:自动记录方法的调用日志,包括方法的参数、执行时间、返回值和异常等。
权限控制:在方法执行前检查用户权限,确保只有具备权限的用户才能调用某些方法。如@RequirePermission
事务管理:自动在方法执行前开启事务,在方法执行后提交事务或在异常时回滚事务,确保数据一致性。如@Transactional
缓存管理:在方法调用前检查是否有缓存数据,若有则直接返回缓存数据,减少数据库或远程服务的调用频率。
性能监控:监控方法的执行时间,找出性能瓶颈并进行优化。
异常处理:统一处理异常,记录错误日志、通知运维或返回统一的错误信息。

posted @ 2025-02-13 22:52  rmxob  阅读(26)  评论(0)    收藏  举报