Spring Aop 相关概念 配置 代理模式

Spring AOP是什么?

AOP(Aspect-Oriented Programming), 即 面向切面编程
可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。

通俗易懂的来讲就是,将公共部分和核心代码进行分离。

例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。毕竟多个核心功能不存在继承关系,那么日志代码就会大量重复。

而aop 就可以将日志代码 水平的 像个切面一样 分散在各个核心功能中。

AOP中的术语

  • Aspect(切面)
    aspect 由 pointcount 和 advice 组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义. Spring AOP就是负责实施切面的框架, 它将切面所定义的横切逻辑织入到切面所指定的连接点中.
    AOP的工作重心在于如何将增强织入目标对象的连接点上, 这里包含两个工作:

  • advice(增强)
    由 aspect 添加到特定的 join point(即满足 point cut 规则的 join point) 的一段代码.
    许多 AOP框架, 包括 Spring AOP, 会将 advice 模拟为一个拦截器(interceptor), 并且在 join point 上维护多个 advice, 进行层层拦截.

  • 连接点(join point)
    程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理.
    在 Spring AOP 中, join point 总是方法的执行点, 即只有方法连接点.

  • 切点(point cut)
    匹配 join point 的谓词(a predicate that matches join points).
    Advice 是和特定的 point cut 关联的, 并且在 point cut 相匹配的 join point 中执行.
    在 Spring 中, 所有的方法都可以认为是 joinpoint, 但是我们并不希望在所有的方法上都添加 Advice, 而 pointcut 的作用就是提供一组规则(使用 AspectJ pointcut expression language 来描述) 来匹配joinpoint, 给满足规则的 joinpoint 添加 Advice.

  • 目标对象(Target)
    织入 advice 的目标对象. 目标对象也被称为 advised object.
    因为 Spring AOP 使用运行时代理的方式来实现 aspect, 因此 adviced object 总是一个代理对象(proxied object)
    注意, adviced object 指的不是原来的类, 而是织入 advice 后所产生的代理类.

  • 织入(Weaving)
    将 aspect 和其他对象连接起来, 并创建 adviced object 的过程.
    根据不同的实现技术, AOP织入有三种方式:

    • 编译器织入, 这要求有特殊的Java编译器.

    • 类装载期织入, 这需要有特殊的类装载器.

    • 动态代理织入, 在运行期为目标类添加增强(Advice)生成子类的方式.
      Spring 采用动态代理织入, 而AspectJ采用编译器织入和类装载期织入.

案例讲解:

方式一:XML配置

提前在pom.xml文件中导入好以下依赖:

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.5</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.5</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>

首先在maven项目中的resources资源文件夹下创建spring config 文件
在这里插入图片描述
具体配置如下:
在这里插入图片描述
测试类调用:

//通过ClassPath路径查找XML配置文件
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("xml配置的名字.xml");
//通过getBean方法创建对象
Class<T> getBean(类名.class);
Object getBean("类名");

如图所示:
在这里插入图片描述

方式二:注解配置

首先,了解下相关注解:

  • @Aspect
    切面,配置到切面类上
  • @PointCut(“表达式”)
    配置切入点,加在方法上
  • @Before:
    标识一个前置通知方法,相当于BeforeAdvice的功能.
  • @After:
    final通知,不管是抛出异常或者正常退出都会执行.
  • @AfterReturning:
    后置通知,似于AfterReturningAdvice, 方法正常退出时执行.
  • @AfterThrowing:
    异常抛出通知,相当于ThrowsAdvice.
  • @Around:
    环绕通知,相当于MethodInterceptor.

切面类详细配置 如图所示:
在这里插入图片描述
调用测试类如图所示:
在这里插入图片描述
注意区分的是:
AnnotationConfigApplicationContext 应用在注解配置版
ClassPathXmlApplicationContext 应用在XML配置版

Spring Ioc:参考地址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值