动态代理AOP(面向切面编程)

一篇文章搞懂spring aop,什么是AOP,什么是面向切面编程,动态代理实现AOP,Spring boot 实现Aop,spring 实现aop,附代码图文演示(保姆级教程) spring、aop、oop、java 阅读详情
AOP介绍

  什么是AOP
    在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
     AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码
     经典应用:事务管理、性能监视、安全检查、缓存 、日志等
     Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码
     AspectJ是一个基于Java语言的AOP框架,Spring2.0开始,Spring AOP引入对Aspect的支持,AspectJ扩展了Java语言,提供了一个专门的编译器,在编译时提供横向代码的织入


AOP的实现原理
原理一:在有接口+实现类的情况下,spring采用的是jdk的动态代理Proxy
原理二:在只有实现类的情况下,spring采用cglib字节码增强


AOP术语:
target:需要被代理的类
joinpoint(连接点):指那些可能被拦截的方法,一般情况就是指target的所有方法
pointCut(切入点):已经被增强的连接点
advice(增强):增强的代码,即拦截了连接点之后所做的那些事
weaving(织入)::是指把增强advice应用到目标对象 target来创建新的代理对象proxy的过程 .
proxy :代理类
 Aspect(切面): 是切入点 pointcut和通知advice 的结合



步骤一:编写目标类

package com.wency.service;
/**
 * 父类接口
 * @author zhangwen
 *
 */
public interface UserService {
     public void addUser();
     public void deleteUser();
     public void findUser();
}

package com.wency.service;
/**
 * 实现类
 * @author zhangwen
 *
 */
public class UserServiceImpl implements UserService{

     @Override
     public void addUser() {
         // TODO Auto-generated method stub
        System. out .println("添加用户" );
    }

     @Override
     public void deleteUser() {
         // TODO Auto-generated method stub
        System. out .println("删除用户" );
    }

     @Override
     public void findUser() {
         // TODO Auto-generated method stub
        System. out .println("查找用户" );
    }

}


步骤二:编写切面类



package com.wency.aspect;
/**
 * 切面类
 * @author zhangwen
 *
 */
public class MyAspect {
     public void before(){
        System. out .println("执行前方法" );
    }
     public void after(){
        System. out .println("执行后方法" );
    }
}

步骤三:编写代理类

package com.wency.factory;

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


import java.lang.reflect.Proxy;

import com.wency.aspect.MyAspect;
import com.wency.service.UserService;
import com.wency.service.UserServiceImpl;

public class MyProxyFactory {
     public UserService createUserService(){
                 //创建目标类
                 final UserService userService =new UserServiceImpl();
                 //创建切面类
                 final MyAspect myAspect = new MyAspect();
            
                 /* 创建代理类:将目标类(切入点)和 切面类(通知) 结合 --> 切面
                 *  Proxy.newProxyInstance
                 *      参数1:loader ,类加载器,动态代理类 运行时创建,任何类都需要类加载器将其加载到内存。
                 *          一般情况:当前类.class.getClassLoader();
                 *                  目标类实例.getClass().get...
                 *      参数2:Class[] interfaces 代理类需要实现的所有接口
                 *          方式1:目标类实例.getClass().getInterfaces()  ;注意:只能获得自己接口,不能获得父元素接口
                 *          方式2:new Class[]{UserService.class}  
                 *          例如: jdbc 驱动  --> DriverManager  获得接口 Connection
                 *      参数3:InvocationHandler  处理类,接口,必须进行实现类,一般采用匿名内部
                 *          提供 invoke 方法,代理类的每一个方法执行时,都将调用一次invoke
                 *              参数31:Object proxy :代理对象
                 *              参数32:Method method : 代理对象当前执行的方法的描述对象(反射)
                 *                  执行方法名:method.getName()
                 *                  执行方法:method.invoke(对象,实际参数)
                 *              参数33:Object[] args :方法实际参数
                 *
                 */

                UserService proxyService =(UserService) Proxy.newProxyInstance(MyProxyFactory. class .getClassLoader(),
                         userService .getClass().getInterfaces(), new InvocationHandler() {
                            
                             @Override
                             public Object invoke(Object proxy , Method method , Object[] args )
                                     throws Throwable {
                                 // TODO Auto-generated method stub
                                 //执行前方法
                                 myAspect.before();
                                 //执行代理类的方法
                                Object obj = method .invoke(userService , args );
                                 //执行后方法
                                 myAspect.after();
                                 return obj ;
                            }
                        });
                 return proxyService ;
            
    }

}


步骤四:编写测试类



package com.wency.test;


import org.junit.Test;

import com.wency.factory.MyProxyFactory;
import com.wency.service.UserService;


public class TestProxy {
     @Test
     public void testProxy(){
        MyProxyFactory proxyFactory =new MyProxyFactory();
        UserService userService = proxyFactory .createUserService();
         userService .addUser();
         userService .deleteUser();
         userService .findUser();
    }

}





Spring AOP(面向切面编程)jdk动态代理 基于AspectJ注解开发 Spring AOP(面向切面编程) AOP 的全称是“Aspect Oriented Programming”,即面向切面编程,和 OOP(面向对象编程)类似,也是一种编程思想。 AOP 采取横向抽取机制(动态代理),取代了传统纵向继承机制的重复性代码,其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。主要作用是分离功能性需求和非功能性需求,使开发人员可以集中处理某一个关注点或者横切逻辑,减少对业务代码的侵入,增强代码的可读性和可维护性。 简单的说,AOP 的作用就是保证开发者在不修改源代码的 阅读详情

相关推荐

Java之AOP面向切面编程(手动动态代理实现)

1、什么是AOP? AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 可能现在就开始懵B了,什么是面向切面编程?动态代理又是什么? 所以我不打算先解释概念了,直接举个栗子先!接着往下看哈! 2、什么是面向切面编程? 对于面向对象编程,相信大家都比较熟悉吧,直白的讲就是将数据与数据相应的操作进行...

hestyle的博客 1246

深入理解:动态代理的底层原理(即,深入理解:Spring框架中的面向切面编程(AOP))

一·代理设计模式的原理: 使用一个代理将对象包装起来, 然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。 二·为什么需要动态代理: 从作用上来说,使用静态代理也可以完成,在不改变源码的情况下,对已有的方法,进行增强(运行期增强)功能的代理作用。但是静态代理特征是,代理类和目标对象的类都是在编译期间确定下来,不利于程序的扩展。同时,每一个代理类只能为一个接口服务,这样一来程序开发中必然产生过多的代理。最好可以通过一个代理类完成全部的代理功能。

weixin_48033662的博客 1225

使用动态代理面向切面编程(AOP)

NULL 博文链接:https://cdxs2.iteye.com/blog/1942117

使用代理模式实现Spring AOP的面向切面编程,动态代理的四种增强处理

Java面试核心知识点一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!Java面试核心知识点Java面试核心知识点一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间![外链图片转存中…(img-EgPojyC6-1711491548344)]Java面试核心知识点点击传送门,即可免费领取!

2401_83641360的博客 525

通俗解析:霍尔编码器、光电编码器、电位计、磁编码器和旋转变压器的实战选型指南

本文深入解析了霍尔编码器、光电编码器、电位计、磁编码器和旋转变压器五大主流编码器的工作原理与核心特性。通过对比精度、环境耐受性、成本及寿命等关键维度,并结合消费电子、工业自动化、汽车电子及极端环境等典型应用场景,提供了一份清晰的实战选型指南,旨在帮助工程师根据具体需求,在性能、可靠性与成本间做出最优决策。

weixin_29216353的博客 254

测站坐标系、地心非惯性系、经纬高互转

目录 一、经纬高转直角坐标系互转 1.1 python代码 二、wgs84转cgcs2000的转换矩阵如下 虽然cgcs2000与wgs84差别很小,但是我比较较真,还是做了两个坐标系的转换。 一、经纬高转直角坐标系互转 此处可参考链接(百度文库用手机浏览器可以打开看全部的): (1)第四章地球椭球及其数学详解 (2)第四章椭球数学变换16节 (3)大地测量学基础[1](7)(控制) 转换公式如下: LBH转XYZ: a为半长轴,e为偏心率 XYZ转LBH: a为半长轴

${王小贱}的博客 2万+

动态代理就是面向切面?

动态代理就是面向切面?

liuruiaaa的博客 303

芯片设计中的“隐形杀手”:手把手教你理解并优化互连寄生参数(以SPEF/DSPF为例)

本文深入探讨了芯片设计中互连寄生参数的影响及优化策略,特别关注SPEF/DSPF文件解析与静态时序分析。通过实际案例展示了耦合电容对时序收敛的关键影响,并提供从定位到优化的完整解决方案,助力工程师应对先进工艺下的设计挑战。

weixin_30687051的博客 598

AOP&SpringAOP&两种动态代理

本文介绍AOP思想及其底层两种动态代理实现方式

逐梦苍穹的博客 1087

完整复盘【避雷jd文职某岗位】潍坊青州hhj(据说未来搬到天津),助理实验师岗位,三人进面,面试全部不及格,空头岗位!像这种情况,该单位很多 | 附个人完整备考背诵题目 | 世间一场梦,不会再考这个了

本文以博主本人报考jun dui文职,从报考、备考、考试、查成绩到资格审查、面试,全程亲身经历,给想要报考该内容的朋友们一些小的参考。祝你顺利上岸!完整复盘【避雷jd文职某岗位】潍坊青州hhj(据说未来搬到天津),助理实验师岗位,三人进面,面试全部不及格,空头岗位!像这种情况,该单位很多 | 附个人完整备考背诵题目 | 世间一场梦,不会再考这个了

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 247

Windows10下安装VMware16虚拟机

由于本人系统为Windows 10 家庭中文版,无法安装Linux子系统WSL,虽然网上也有强制安装的方法,但为保险起见,还是把之前的VMware虚拟机重新进行安装,并浅浅记录一下安装过程。

沉香best的博客 863

【Spring AOP 面向切面编程 和动态代理技术】

春招复习整理 一、动态代理 我们以生产商家和消费者为栗,我们知道我们平时购物,并不是直接从生产厂家手中购买东西,而是从某猫,某宝,某东这些中间商进行购买,生产厂家找了一个中间代理来完成自己的功能实现。 我们假设这个代理从中抽取20%的钱,那就是顾客支付10000,代理拿走了2000,生产商拿走8000 Spring中AOP的有两种实现方式: 1、JDK动态代理 2、Cglib动态代理 下面我们分别以上述两种方式来实现我们的案例 1.JDK动态代理 * 动态代理: * 特点:字.

qq_44682003的博客 282

L2正则化与Ridge回归的关系

非常感谢您提供的详细任务描述和要求。我会尽力按照您的指引来撰写这篇技术博客文章。 L2正则化与Ridge回归的关系 1. 背景介绍 机器学习模型在训练过程中容易出现过拟合的问题,这会导致模型在训练集上表现很好但在测试集上泛化性能较差。为了解决这一问题,正则化技术应运而生。其中

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 659

华为OD机试 - 比赛的冠亚季军(Python/JS/C/C++ 双机位C卷 100分)

有个运动员,他们的id为0到N-1,他们的实力由一组整数表示。他们之间进行比赛,需要决出冠亚军。比赛的规则是0号和1号比赛,2号和3号比赛,以此类推,每一轮,相邻的运动员进行比赛,获N (3\leq N< 10000)胜的进入下一轮,实力值大的获胜,实力值相等的情况,id小的情况下获胜,轮空的直接进入下一轮。(0 <= 实力值 <= 10000000000)。输入一行N个数字代表N的运动员的实力值。输出冠亚季军的id,用空格隔开。

学Java,找哪吒 1587

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【SSM - Spring篇04】AOP面向切面编程 - 代理模式 - jdbc动态代理 -CGLIB动态代理

AOP概念   AOP采取横向抽取机制,即将分散在各个方法中的重复代码提取出来,然后在程序编译或运行阶段,再将这些抽取出来的代码应用到需要执行的地方(一般用于日志记录、性能统计、安全控制、事务处理、异常处理等操作) AOP术语 切面   切面(Aspect)是指封装横切到系统功能(如事务处理)的类。 连接点   连接点(Joinpoint)是指程序运行中的一些时间点,如方法的调用或异常的抛出。 切入点   切入点(Pointcut)是指那些需要处理的连接点。在Spring AOP 中,所有的方法执行都是

Java小皮孩 7696

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

AOP面向切面编程,JDK的动态代理方式

1. AOP概念 1.1 什么是AOP 在软件行业中,AOP可以理解为面向切面编程,它是一种通过预编译和运行期动态代理实现程序功能的统一的一种技术。AOP,其实是OOP的延续。利用AOP可以使得业务逻辑代码各部分之间的耦合度降低,提高程序的可重用性,同时,提高效率。 AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码。 AspectJ是一个基于

李卫康的博客 1073

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

静态代理、动态代理、spring动态代理(Spring AOP面向切面编程)、spring动态代理注解版

目录 静态代理 列:实现静态代理 代理接口User.java 目标对象 实际业务逻辑实现方法UserImpl.java 代理类UserProxy.java 测试 动态代理 列: 实现动态代理 创建po对象 创建dao 创建代理类MyProxy.java 测试 Spring Aop 面向切面编程(spring动态代理) 列:aop练习 导包 User.java ...

Birdlun的博客 2654

面向切面编程(AOP)动态代理

面向切面编程(AOP)动态代理   Aspect Oriented Programming(AOP)面向切面编程是一种范式和思想,并不是特指某一种编程语言。下面这句话是知乎上的一个总结: 在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程     比如写一个管理学生老师的简单数据库     我们需要用InvocationHandler 来声明一个对象...

唯风的博客 3560

Spring 面向切面编程 第3关:AOP实现原理-JDK动态代理

Spring 面向切面编程 第3关:AOP实现原理-JDK动态代理

于建章的博客 3184

Java spring AOP(面向切面编程) JDK动态代理示例

Java spring AOP面向切面编程JDK动态代理示例Java spring AOP(面向切面编程) JDK动态代理示例目标类目标类接口目标类实现切面类spring工厂测试 Java spring AOP(面向切面编程) JDK动态代理示例 本文引用B站老师(“一个体面的人”) spring框架教程相关内容,适合初学者理解使用 了解更多内容点击链接. AOP概念: (百度百科) AOP为As...

weixin_43801689的博客 454

【Spring】AOP(面向切面编程),动态代理详解,AspectJ注解

大家好,我是被白菜拱的猪。 一个热爱学习废寝忘食头悬梁锥刺股,痴迷于girl的潇洒从容淡然coding handsome boy。 文章目录一、写在前言二、AOP(一)概念介绍(二)底层原理1、动态代理简单介绍2、JDK动态代理代码实现(三)操作术语(四)AOP操作(AspectJ注解)1、前期准备2、具体步骤3、通知执行顺序4、注意事项(五)AOP操作(基于AspectJ配置文件)三、结束语 一、写在前言 二、AOP (一)概念介绍 AOP为Aspect Oriented Programming的缩写,

放开这颗白菜让我来 1327

动态代理和AOP人(面向切面编程)

动态代理和AOP

G503503的博客 353

Java面向切面编程AOP---动态代理实现

上一篇论述AOP动态代理的原理 这里显示实现其中的一种动态代理实现 需求:矩形计算周长 先有矩形的接口类: package com.mrchen.myredistest.chenstest; /** * 矩形 计算宽高 */ public interface Rectangle { /** * 加法 a+b *...

萌萌的博客 485
上一篇: 对spring的初步认识
下一篇: Graphite监控scrapy
codelady
博客等级 码龄11年 26粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值