一篇文章教你理解--AOP面向切面编程

一、概念

AOP,面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

二、作用

AOP的主要功能:权限控制、事务管理 、日志打印、性能统计、异常处理等

三、案例

面向切面编程,就是将交叉业务逻辑封装成切面,利用AOP的功能将切面织入到主业务逻辑中。所谓交叉业务逻辑是指,通用的,与主业务逻辑无关的代码,如安全检查,事物,日志等。若不使用AOP,则会出现代码纠缠,即交叉业务逻辑与主业务逻辑混合在一起。这样,会使业务逻辑变得混杂不清。

举个例子:银行系统取款会有一个流程查询也会有一个流程

上面那个 验证用户 的方框,我们可以把它当成一块板子,在这块板子上插入一些控制流程,这块板子就可以当成是 AOP 中的一个切面。所以 AOP 的本质是在一系列的纵向的控制流程中,把那些相同的子流程提取成一个横向的面,把纵向流程画成一条直线,而 AOP 相当于把相同的地方连起来了。

这个验证用户的子流程 就成了一条直线,也可以理解成一个切面,这里只插了三个流程,如果其他流程也需要这个子流程,也可以插到其他地方去。

演示案例:

  1. 引入pom依赖,代码如下:

        <!--spring AOP的包-->

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-aspects</artifactId>

            <version>5.2.25.RELEASE</version>

        </dependency>

        //上述spring-aspects或者替换aspectjweaver

        <dependency>

            <groupId>org.aspectj</groupId>

            <artifactId>aspectjweaver</artifactId>

            <version>1.9.6</version>

        </dependency>

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-aop</artifactId>

            <version>5.2.25.RELEASE</version>

        </dependency>

2. 建立aspect包,在此包下建立LogAspect类,我们的业务为TestController类中的hello方法在执行前打印一句话,hello方法在执行后打印一句话(真实场景有判断用户是否登陆、日志添加等)。LogAspect代码如下:

@Aspect

@Component

public class LogAspect {

    @Before("execution(public * com.yxc.controller.HelloWorldController.hello(..))")

    public void before(){

        System.out.print("------------------hello 方法执行前-------------------");

    }

    @After("execution(public * com.yxc.controller.HelloWorldController.hello(..))")

    public void after(){

        System.out.print("------------------hello 方法执行后-------------------");

    }

3.测试,在浏览器访问hello的方法接口,测试结果如下:

四、总结

切入点表达式标准格式:动作关键字(访问修饰符  返回值  包名.类/接口名.方法名(参数)异常名)

execution(* com.yy.service.*Service.*(..))

切入点表达式描述通配符:作用:用于快速描述,范围描述

      * :匹配任意符号(常用)

      .. :匹配多个连续的任意符号(常用)

      +:匹配子类类型

切入点表达式书写技巧

     1.按标准规范开发

     2.查询操作的返回值建议使用*匹配

     3.减少使用..的形式描述包

     4.对接口进行描述,使用*表示模块名,例如UserService的匹配描述为*Service

     5.方法名书写保留动词,例如get,使用*表示名词,例如getById匹配描述为getBy*

     6.参数根据实际情况灵活调整

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值