行业资讯 2025年08月6日
0 收藏 0 点赞 517 浏览 2525 个字
摘要 :

文章目录 1.什么是AOP? 2.AOP的作用及优势 3.AOP的实现方式 4.动态代理的特点: 5.动态代理的常用两种方式 6.Spring中的AOP 7.Spring AOP中的一些术语 8.学习Spring的A……




  • 1.什么是AOP?
  • 2.AOP的作用及优势
  • 3.AOP的实现方式
  • 4.动态代理的特点:
  • 5.动态代理的常用两种方式
  • 6.Spring中的AOP
  • 7.Spring AOP中的一些术语
  • 8.学习Spring的AOP需要明确的事:
  • 9.通知类型
  • 10.模拟基于接口方式的动态代理实现AOP

1.什么是AOP?

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。——摘自百度百科

简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。

2.AOP的作用及优势

1)作用:

在程序运行期间,不修改源码对已有方法进行增强。

2)优势:

  • 减少重复代码
  • 提高开发效案
  • 维护方便

3.AOP的实现方式

使用动态代理技术

4.动态代理的特点:

1)字节码随用随创建随用随加载。
2)它与静态代理的区别也在于此。因为静态代理是字节码一上来就创建好,并完成加载。
3)装饰者模式就是静态代理的一种体现。

5.动态代理的常用两种方式

1)基于接口的动态代理

提供者: JDK官方的Proxy类。
要求:被代理类最少实现一个接口

2)基于子类的动态代理

提供者:第三方的CGLib,如果报asmxxx异常,需要导入asm.jar
要求:被代理类不能用final修饰的类( 最终类)

6.Spring中的AOP

spring中框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。

7.Spring AOP中的一些术语

Joinpoint (连接点):

所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点。

Pointcut (切入点):

所谓切入点是指我们要对哪些Joinpoint进行拦截的定义。

Advice (通知/增强) :

所谓通知是指拦截到Joinppint之后所要做的事情就是通知。
通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。

Introduction(引介):

引介是一种特殊的通知在不修改类代码的前提下,Introduction 可以在运行期为类动态地添加一些方法或Fields

Target (目标对象) :

代理的目标对象。

Weaving (织入):

是指把增强应用到目标对象来创建新的代理对象的过程。
spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。

Proxy (代理) :

一个类被AOP织入增强后:就产生一个结果代理类。

Aspect (切面):

是切入点和通知(引介)的结合。

8.学习Spring的AOP需要明确的事:

1)开发阶段(我们做的)
a)编写核心业务代码(开发主线) :大部分程序员来做,要求熟悉业务需求。
b)把公用代码抽取出来制作成通知。( 开发阶段最后再做) : AOP编程人员来做。
c)在配置文件中声明切入点与通知间的关系,即切面。: AOP 编程人员来做。
2)运行阶段( Spring框架完成的)
Spring框架监控切入点方法的执行。一旦 监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行。

9.通知类型

AOP概述、作用、优势及实现方式——Spring框架系列教程(11)

10.模拟基于接口方式的动态代理实现AOP

public interface PersonDao {
    void speak();
}
/**
 * 模拟基于接口的动态代理技术
 * 要求在调用speak方法之前后之后,都有一些增强方法执行
 * 比如:在执行之前,我们输出“理清思路,准备发言....”
 *       在执行之后,我们输出“结束发言...”    
 */
public class PersonDaoImpl implements PersonDao {

    //连接点
    @Override
    public void speak() {
        System.out.println("我正在说话....");
    }

}
public class PersonProxy implements InvocationHandler {

    private Object obj;
    
    public PersonProxy(Object obj) {
        super();
        this.obj = obj;
    }

    //重写invoke方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        try {
            System.out.println("理清思路,准备发言....");//前置通知
            result = method.invoke(obj, args);//切入点方法
            //int i=1/0;
            System.out.println("结束发言...");//后置通知
        }catch (Exception e) {
            System.out.println("发言出错..");//异常通知
        }finally {
            System.out.println("结束语....");//最终通知
        }
        return result;
    }

}
public class TestProxy {
    public static void main(String[] args) {
        //创建PersonDaoImpl对象赋值给父类接口
        PersonDao pd = new PersonDaoImpl();
        //将对象交给PersonProxy代理
        PersonProxy proxy = new PersonProxy(pd);
        //获取新的代理对象
        PersonDao proxypd = (PersonDao)Proxy.newProxyInstance(
                                pd.getClass().getClassLoader(), 
                                pd.getClass().getInterfaces(),proxy);
        //调用speak
        proxypd.speak();
    }

}

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/7478.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号