spring AOP概念及应用场景

薄洪涛2年前JAVA5288

概念

面向切面编程,通过预编译和运行期间动态代理实现在不修改源代码的情况下给程序动态统一添加功能的技术

思想就是把很多类中对象中横切问题点,从业务逻辑中分离出来,达到解耦的目的,增加代码的重用性,提高开发效率

image.png

应用场景

日志记录,异常处理,权限校验,缓存梳理,

事物处理,数据持久化,效率检查,内容分发

主要概念理解

aspect

切面,切面有切点和通知组成,即包括横切逻辑的定义和连接点的定义

pointcut

切点,每个类都拥有多个连接点,可以理解是连接点的集合

joinpoint

连接点,程序执行的某个特殊位置,如某个方法调用前后

weaving

织入,将增强添加到目标类的具体连接点的过程

advice

通知,是织入到目标类连接点上的一段代码,就是增强到什么地方?什么内容

image.png

target

目标对象,通知织入的目标类

aop proxy

代理对象,即增强后产生的对象

实现

1. 定义一个切面类Aspect

在声明的类,增加@Component @Aspect注解,springboot中引入是spring-boot-stater-aop依赖包

2. 定义切点Pointcut

定义切点,并声明切点在哪些地方执行

采用@Pointcut 注解 如@Pointcut (public * com.xx.xx.*.*(..) )

规则:修饰符 + 返回类型 + 包.类 + 方法 + 参数 ,* 表示不限,.. 表示参数不限

3. 定义Advice通知

五种注解类型 @Before @AfterReturning @AfterThrowing @Around @After

比如 @Before("xx()") xx为第二部定义的切点

示例

@Aspect
@Component
public class LoggerAspect {

    private final Logger logger = LoggerFactory.getLogger(LoggerAspect.class);

    @Pointcut(value = "execution(* com.choc.boht.controller.*.*(..))")
    public void myPointCut() {

    }

    @Around("myPointCut()")
    public Object applicationLogger(ProceedingJoinPoint pjp) throws Throwable {
        logger.info("乌拉1~");
        String medthodName = pjp.getSignature().getName();
        String className = pjp.getTarget().getClass().toString();
        Object[] args = pjp.getArgs();
        ObjectMapper mapper = new ObjectMapper();
        Object obj = pjp.proceed();
        String requestData = mapper.writeValueAsString(args);
        String reponseData = mapper.writeValueAsString(obj);
        logger.info("medthodName:{},className:{},requestData:{},reponseData:{},args:{}",medthodName,className,requestData,reponseData,args);
        return pjp.proceed();
    }

}


标签: aop

相关文章

centos安装java环境

centos安装java环境

很多工具(比如Lucene )都要依赖java环境,所以我在服务器上装了一个jdk,然后在这篇文章中记录下安装的步骤;当我们修改程序并通过SVN上传到服务器后环境:  &...

redis缓存雪崩,缓存击穿,缓存穿透

redis缓存雪崩,缓存击穿,缓存穿透

缓存雪崩同一时间大量redis缓存数据失效,造成大量请求涌入数据库,数据库压力增大崩掉解决方案缓存过期时间加随机值增加过期表示,缓存过期后,自动更新缓存缓存穿透缓存和数据库中都没有的数据,每次查询都会...

谈谈你对IOC的理解

 ioc容器实际上就是个map(key,value),⾥⾯存的是各种对象(在xml⾥配置的bean节点、 @repository、@service、@controller、@componen...

idea 如何导jar包

idea 如何导jar包

之前一直用的是ecplise,换成了idea后导包的操作就发生了变化,这篇文章详细说明下在idea中如何导入jar包首先在项目根目录建立lib文件夹,把你要导入的jar复制到lib目录下,如果是ecp...

Intellij IDEA实现热部署

Intellij IDEA实现热部署

每次修改代码都需要重新编译,然后重启Tomcat,比较麻烦,我们可以通过Jrebel实现项目的热部署,从而不需要重启Tomcat首先安装plugin如果在线安装时间比较长,可以选择自己下载包(点我自己...

Springboot+Kotlin的搭建

Springboot+Kotlin的搭建

不少公司觉得php的性能较低,于是采用java做逻辑处理,php做表现层的做法,个人觉得对于业务量比较复杂,安全性要求较高的项目,可以采用此类做法;于是我学着搭建了一个基于spring boot的接口...

评论列表

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。