Spring5之AOP

本文详细介绍了Spring5中的AOP(面向切面编程),包括AOP的概念、底层原理,如动态代理(JDK与CGLIB),并阐述了AOP的核心术语,如切面、连接点、通知类型等。此外,还详细讲解了如何通过XML配置和全注解方式在Spring中实现AOP操作,包括切入点表达式的使用。
摘要由CSDN通过智能技术生成

一、什么是AOP?

AOP(Aspect Oriented Programming),即面向切面编程,是OOP的补充,它也提供了模块化。在面向对象编程中,关键的单元是对象,AOP的关键单元是切面,或者说关注点(可以简单地理解为你程序中的独立模块)。一些切面可能有集中的代码,但是有些可能被分散或者混杂在一起,例如日志或者事务。这些分散的切面被称为横切关注点。一个横切关注点是一个可以影响到整个应用的关注点,而且应该被尽量地集中到代码的一个地方,例如事务管理、权限、日志、安全等。

AOP让你可以使用简单可插拔的配置,在实际逻辑执行之前、之后或周围动态添加横切关注点。这让代码在当下和将来都变得易于维护。如果你是使用XML来使用切面的话,要添加或删除关注点,你不用重新编译完整的源代码,而仅仅需要修改配置文件就可以了。

二、AOP底层原理

1. AOP底层使用动态代理

有两种情况动态代理
第一种:有接口情况,使用JDK动态代理
在这里插入图片描述

第二种:没有接口情况,使用CGLIB动态代理
在这里插入图片描述

2. JDK动态代理(工厂模式的内容)

需求:需要对一个实现了Human接口的Superman类进行功能的增强。

interface Human{
   
    String belief();
    void eat(String food);
}

//被代理类
class Superman implements Human{
   
    @Override
    public String belief() {
   
        return "I BELIEVE I CAN FLY";
    }

    @Override
    public void eat(String food) {
   
        System.out.println("I like eating "+food);
    }
}

要想实现动态代理,需要解决以下问题:

  • 如何根据加载到内存中的被代理类,动态的创建一个代理类及其对象?
  • 当通过代理类的对象调用方法时,如何动态的去调用被代理类中的同名方法?
//代理工厂
class ProxyFactory{
   
    public static Object getProxyInstance(Object obj){
   //obj:被代理的类对象,类型为Object方便扩展
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(),
                new InvocationHandler() {
   
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   
                        System.out.println("方法前增强"+method.getName()+"...."+ Arrays.toString(args));
                        Object res = method.invoke(obj,args);
                        System.out.println
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值