面向切面编程AOP

本文详细介绍了Spring的面向切面编程(AOP),包括AOP的作用、优势,以及底层实现的动态代理技术,如JDK和cglib代理。此外,还详细阐述了基于XML和注解的AOP开发,包括切入点表达式、通知类型、织入关系的配置等,旨在帮助读者深入理解并掌握AOP在实际开发中的应用。
摘要由CSDN通过智能技术生成

目录

Spring 的 AOP 简介

什么是 AOP

AOP 的作用及其优势

AOP 的底层实现

AOP 的动态代理技术

​JDK 的动态代理

cglib 的动态代理

AOP 相关概念

AOP 开发明确的事项

 1. 需要编写的内容

2. AOP 技术实现的内容

3. AOP 底层使用哪种代理方式

基于 XML 的 AOP 开发

快速入门

1.导入AOP相关坐标 

2.创建目标接口和目标类(内部有切点)

3.创建切面类(内部有增强方法)

4.将目标类和切面类的对象创建权交给 spring

5.在 applicationContext.xml 中配置织入关系

6.测试代码

XML 配置 AOP 详解

1. 切点表达式的写法

 2. 通知的类型

 3. 切点表达式的抽取

基于注解的 AOP 开发

快速入门

1.创建目标接口和目标类(内部有切点)

2.创建切面类(内部有增强方法)

3.将目标类和切面类的对象创建权交给 spring

4.在切面类中使用注解配置织入关系

5.在配置文件中开启组件扫描和 AOP 的自动代理

6.测试代码

注解配置 AOP 详解 

 1. 注解通知的类型

 2. 切点表达式的抽取


Spring 的 AOP 简介

什么是 AOP

AOP Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

AOP 是 OOP 的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

AOP 的作用及其优势

  • 作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强
  • 优势:减少重复代码,提高开发效率,并且便于维护

AOP 的底层实现

实际上,AOP 的底层是通过 Spring 提供的的动态代理技术实现的。在运行期间,Spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能的增强。

AOP 的动态代理技术

常用的动态代理技术

  • JDK 代理 : 基于接口的动态代理技术
  • cglib 代理:基于父类的动态代理技术

JDK 的动态代理

目标类接口

public interface TargetInterface {
    public void save();
}

 ②目标类

public class Target implements TargetInterface{
    public void save(){
        System.out.println("save running...");
    }
}

 ③动态代理代码

        //创建目标对象
        final Target target = new Target();
        //增强对象
        final Advice advice = new Advice();
        //返回值就是动态生成的代理对象 基于jdk
        TargetInterface proxy =(TargetInterface) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),//目标对象类加载器
                target.getClass().getInterfaces(),//目标对象相同的接口字节码对象数组
                new InvocationHandler() {
                    //调用代理对象的任何方法,实质执行的都是invoke方法
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        advice.before();
                        Object invoke = method.invoke(target, args);//执行目标方法
                        advice.after();
                        return invoke;
                    }
                }
        );

 ④  调用代理对象的方法测试

    //调用代理对象的方法
        proxy.save();

cglib 的动态代理

目标类

public class Target  {
    public void save(){
        System.out.println("save running...");
    }
}

 ②动态代理代码

package com.shengda.proxy.cjlib;

import com.shengda.proxy.jdk.TargetInterface;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyTest {
    public static void main(String[] args) {


        //创建目标对象
        final Target target = new Target();
        //增强对象
        final Advice advice = new Advice();

        //返回值就是动态生成的代理对象 基于cglib
        //1、创建增强器
        Enhancer enhancer = new Enhancer();
        //2、设置父类(目标)
        enhancer.setSuperclass(Target.class);
        //3、设置回调函数
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                //执行前置
                advice.before();
                //执行目标
                Object invoke = method.invoke(target, args);
                //执行后置
                advice.after();
                return invoke;
            }
        });
        //4、创建代理对象
        Target proxy = (Target) enhancer.create();
        proxy.save();
    }
}

 ③调用代理对象的方法测试

proxy.save();

AOP 相关概念

Spring AOP 实现底层就是对上面的动态代理的代码进行了封装,封装后我们只需要对需要关注的部分进行代码编写,并通过配置的方式完成指定目标的方法增强。

在正式讲解 AOP 的操作之前,我们必须理解 AOP 的相关术语,常用的术语如下:

  • Target(目标对象):代理的目标对象
  • Proxy (代理):一个类被 AOP 织入增强后,就产生一个结果代理类
  • Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring,这些点指的是方法,因为spring只支持方法类型的连接点(可以被增强的方法叫连接点
  • Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义(选中了的连接点
  • Advice(通知/ 增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知
  • Aspect(切面):是切入点和通知(引介)的结合(目标方法+增强=切面)
  • Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程。spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入(将切点和通知结合的过程)

AOP 开发明确的事项

 1. 需要编写的内容

  • 编写核心业务代码(目标类的目标方法)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值