spring AOP

Spring AOP 面向切面 阅读详情

      spring 的2大核心IOC和AOP,今天就来介绍一下AOP吧。。。

      AOP,即是Aspect-Oriented—Programming,面向切面编程。面向方面编程(AOP)是面向对象编程(OOP)的一种扩展技术,能够很好的解决横切关注点问题以及相关的设计难题来实现松散耦合。AOP(Aspected Oriented Programming)是一种新兴的编程技术。它可以解决OOP和过程化方法不能够很好解决的横切(crosscut)问题,如:事务、安全、日志等横切关注。当未来系统变得越来越复杂,横切关注点就成为一个打问题的时候,AOP就可以很轻松的解决横切关注点这个问题,使得AOP编程成为。Spring 是基于J2EE的轻量级开源开发框架,其中Spring AOP组件实现了面向方面编程。

      首先来介绍一下AOP的几个概念。

     连接点(JoinPoint)是程序运行中某个阶段的点。如某个方法调用异常抛出等。

     切入点(Pointcut)是连接点的集合,它是程序中需要注入的advice位置的集合。

     通知(Advice)是某个连接点搜采用的处理逻辑。也就是向连接点注入的代码。

     Spring的AOP主要是通过代理方式实现的。有2种代理机制:

    1.基于jdk的动态代理。

    2.基于CGLIB的动态代理。

    这里先说一下代理的概念吧。

    代理模式:给某一个对象提供代理对象,并由代理对象控制具体对象的引用。举个例子吧。我们买酒,不是直接从生产酒的工厂买的,而是通过代理商买的,这个代理的概念是差不多的。

    下面来举个例子说明一下基于jdk的动态代理。

     例子是从网上找的一个简单的。

 

     public interface Hello {
         Public void hello();
     }

     

 .import java.lang.reflect.InvocationHandler;  
import java.lang.reflect.Method;  
.import java.lang.reflect.Proxy;   
 
.import org.Hello;  
.public class SayHello implements Hello{   
    @Override  
   public void hello() {   
      // TODO Auto-generated method stub   
      System.out.println("hello");   
    }   
       
   static class MyInvocationHandler implements InvocationHandler{   
       private Object target;   
       public MyInvocationHandler(Object target){   
           this.target=target;   
       }   
           
      @Override  
      public Object invoke(Object proxy, Method method, Object[] args)   
              throws Throwable {   
          // TODO Auto-generated method stub   
          System.out.println(method.getName()+"-------start");   
          Object result=method.invoke(target, args);   
          System.out.println(method.getName()+"--------end");   
           return result;   
       }   
    }   
       
   static class ProxyFactory{   
       InvocationHandler h;   
      Class cls;   
       public ProxyFactory(String className,InvocationHandler h) throws ClassNotFoundException{   
         cls=Class.forName(className);   
          this.h=h;   
       }   
         
        public Object create(){   
          return Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), h);   
      }   
    }   
       
   public static void main(String[] args) throws ClassNotFoundException {   
       Hello s=new SayHello();   
        InvocationHandler h=new MyInvocationHandler(s);   
        ProxyFactory proxyFactory=new ProxyFactory(SayHello.class.getName(), h);   
       Hello sf=(Hello) proxyFactory.create();   
       sf.hello();   

   }   
 
}   
 
----------------会输出  
hello-------start  
hello--------end 

 

 

jdk 的动态代理是用java.lang.reflect.proxy 下的类的。不懂可以查一下api文档。

有上面的例子可以看到这种代理被代理的类一定要实现一个接口的。但是如果一个类没有接口的话。那要怎么实现代理呢?这个时候spring就会采用CGLIB代理

   

 

 

     下面来介绍一个CGLIB代理

    cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
 cglib封装了asm,可以在运行期动态生成新的class。
cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。

 cglib 包是通过动态的生生一个子类去覆盖搂腰代理类的不是finale的方法。并设置好callback,则原有类的每个方法调用就会转变成调用用户定义的拦截方法。

    同样下面也举个例子吧。同样例子也是从网上找的。

    

 

    public class MyClass {
    public void method() {
        System.out.println("MyClass.method()");
    }
}

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.MethodInterceptor;
 
public class Test {
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(MyClass.class);
        enhancer.setCallback( new MethodInterceptorImpl() );
        MyClass my = (MyClass)enhancer.create();
        my.method();
    }
 
    private static class MethodInterceptorImpl implements MethodInterceptor {
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
            System.out.println(method);
            proxy.invokeSuper(obj, args);
            return null;
        }
    }
}

/*
javac -cp .;cglib-2.1.3.jar;asm-1.5.3.jar *.java
pause
java -cp .;cglib-2.1.3.jar;asm-1.5.3.jar  Test
pause
*/

 

 

     简单来说是使用cglib代理某个类,需要在Enhance对象中设置好基类,以及一系列回调函数。

 

 

     关于springAOP的两种代理就先介绍到这里,至于在spring中怎么用?怎么配置?我们下次再探讨!

【智能体】零代码实战:Coze多智能体协作开发全流程解析 本文详细解析了Coze平台的多智能体协作开发全流程,从入门指南到实战技巧,帮助用户零代码构建高效AI团队。通过模块化设计和专业分工,多智能体系统能显著提升任务处理速度和准确率,适用于客服、内容创作、教育培训等多个场景。文章还提供了性能优化和常见问题解决方案,助力开发者快速掌握Multi-Agent技术。 阅读详情

相关推荐

【Python】torch_npu

Ascend AI处理器核心计算范式与PyTorch的桥接艺术:深入探索torch_npu的基石要真正理解,我们必须首先超越其作为PyTorch后端库的表面认知,深入其所服务的硬件——华为昇腾(Ascend)AI处理器的核心计算范式。这不仅仅是关于如何在NPU上运行PyTorch模型,更是关于NPU如何设计其计算,以及如何巧妙地将这种硬件特性映射到PyTorch的抽象层之上。1. 昇腾AI处理器的达芬奇架构:极致算力的源泉昇腾AI处理器并非传统的CPU或GPU。它采用了华为独创的达芬奇(Da Vinci)架

宅男很神经 5368

【Spring】AOP

AOP(Aspect Oriented Programming) 是一种编程范型,即面向切面编程。什么是面向切面编程?切面就是指某一类特定问题,所以AOP也可以理解为面向特定方法编程。面向编程旨在通过分离横切关注点来提高代码的模块化和可维护性,允许开发者将那些与业务逻辑无关,但又需要在多个地方使用的功能(如日志记录、事务管理、安全性等)从业务逻辑中分离出来。在前面我们的登录校验,用了拦截器,其实也是对AOP思想的一种实现。统一数据返回格式和统一异常处理也是AOP的一种实现。

zhyhgx的博客 1912

Transformer-Based Attention Networks for Continuous Pixel-Wise Prediction 基于Transformer注意力网络连续像素级与估计

Transformer-Based Attention Networks for Continuous Pixel-Wise Prediction 基于Transformer注意力网络的连续的像素级的

MengYa_Dream的博客 4716

【Spring】Spring AOP

SpringAOP 认识和实现原理

bit me的博客 1947

把STM32MP135当单片机玩:实战SD卡脱机运行LED程序(基于MP135DK开发板)

本文详细介绍了如何在STM32MP135开发板上实现SD卡脱机运行LED程序,通过裸机开发方式(Bare Metal)利用HAL库完成GPIO控制,并解析了SD卡启动流程。内容涵盖工程创建、代码编写、SD卡烧录及常见问题排查,为开发者提供了一种高性能单片机开发方案。

weixin_33734785的博客 242

《软件工程——实践者的研究方法》重难点复习笔记(第八章——理解需求)

8项需求工程任务 inception 开始 8.1.1 identify stakeholders 定义:从软件开发中收益 例如:市场人员、销售经理、顾客、顾问、维护团队等(P139) 8.1.2 这个阶段的问题是context-free的。有三套(P140) 8.1.3 提到NFR(nonfunctional requirement)和QFD(quality

whooiif的博客 1814

详解Spring AOP

Aspect Oriented Programming(面向切面编程),OOP是面向对象编程(开发的时候把一个个都抽象成对象来开发),两者的维度不同,处理的事情不同切⾯就是指某⼀类特定问题, 所以AOP也可以理解为⾯向特定⽅法编程。面向切面编程就是针对某一类特定问题统一进行编程比如people类有自己的属性和行为,但是有小一部分人生病要去医院看病,看病这个业务逻辑就不属于哪一个类,因为people泛指所有人,所有人不会都看病。

N_0050的博客 2030

21天教你学会PCIe专栏(17)--多功能设备

1.1 定义多功能PCIe设备:多功能PCIe设备是指在一个物理设备中集成了多种功能的设备。这些功能可以通过不同的PCIe功能(Function)来实现,每个功能可以独立配置和管理。1.2 优点资源利用率:通过集成多种功能,减少物理设备的数量,提高资源利用率。成本效益:减少硬件成本和功耗,提高系统的经济性。灵活性:用户可以根据需要启用或禁用不同的功能,提高系统的灵活性。可扩展性:通过增加新的功能,扩展设备的功能,提高系统的可扩展性。1.3 应用场景网络设备。

xiaoheshang_123的博客 531

Spring AOP 详解

AOP

2301_79184547的博客 1129

【VTK】VTK中的光标样式

本文分享VTK中的光标设置相关内容技术,希望对各位小伙伴有所帮助!

qq_40041064的博客 1928

真正的工业级环形缓冲区(Circular Buffer)完整实现细节

永远不要永远不要ToArray()或AddRange()永远返回或两段Span永远用_head_tail% Capacity实现环形照着上面这套代码改,你的系统将彻底告别内存爆炸,从“实验室玩具”变成“产线战神”!需要我给你一个支持两段绘制的完整实现吗?

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 127

Spring 配置AOP Spring注解配置AOP Spring XML 配置AOP Spring Aspect AOP

Spring 配置AOP Spring注解配置AOP Spring XML 配置AOP Spring Aspect AOP

HaHa_Sir的博客 1109

SAP-ABAP: BP主数据完全指南:从基础到高阶应用

SAP-ABAP: BP主数据完全指南:从基础到高阶应用

baidu_35680696的博客 1647

[Spring AOP 8] Spring AOP 源码全流程总结

Spring AOP 源码全流程详细梳理

2503_91769056的博客 1404

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【Spring】spring AOP的总结

目录 一、AOP的概念 1.1 术语 1.2 AspectJ 1.3 AOP和spring AOP有什么关系 二、spring AOP的使用 0、首先要引用AspectJ语法依赖 1、spring AOP开启AspectJ语法支持 2、声明一个切面(Aspect) 2.1、声明一个Pointcut切点 2.2 声明一个advice通知 四、advice通知的位置 一、A...

小七的博客 614

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: 培训篇一之数据库(luffy)
QGJava
博客等级 码龄16年 14粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值