Spring框架Aop实现—代理模式介绍(4)

Spring AOP与代理模式 通过。 阅读详情

Spring框架Aop实现—代理模式介绍

针对上面介绍的ioc思想,这里开始介绍aop的核心思想即面向切面编程思想。本内容讲的是基本的代理模式的介绍,后续的动态代理会慢慢更新。谢谢大家的阅读学习。

1、AOP概念

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

AOP的作用:不修改源码的情况下,程序运行期间对方法进行功能增强。

好处:

  • 减少代码的重用,提高开发效率便于维护。
  • 专注于核心业务开发。

针对上述几点,首先需要理解的是一般的工程项目比如编写一个存储数据的模块,可能往往会需要编写事务、日志等其他模块,此时就可以把这些地方分发出去,到最后测试的时候再拿回来。

2、AOP的实现机制-动态代理

2.1 代理模式的概念

代理:顾名思义就是别人帮你制作。

代理模式:在一个原有功能的基础上添加新的功能。

分类:代理模式分为静态代理和动态代理

2.2 传统的核心与服务编写方式:编写在一起

package com.jpg.service;
public class TeamService {
public void add(){
try {
System.out.println("开始事务");
System.out.println("TeamService---- add----");// 核心业务
System.out.println("提交事务");
} catch (Exception e) {
e.printStackTrace();
System.out.println("回滚事务");
}
}
}

首先在上面写的是一般初学者的编写方法,但是缺点很明显!!比如如果一个服务有很多次结果的显示——按200、201、202等等进行分别展示自己的事务,那不就要编写很多的类吗?

所以,后面的静态代理解决了传统的高耦合的问题,增加了一点扩展性。

2.3 静态代理

静态代理的实现方法有很多种,比如基于类的静态代理和基于接口的静态代理等等。

2.3.1 基于类的静态代理

基于类的静态代理相对于传统的编写方法在于创建核心业务的子类继承核心业务类,在主方法调用核心方法类。这听上去其实跟传统的方法没有很大的区别,而相较于前有了直接的将核心业务与服务方法分开管理的思想。

package com.jpg.service;
public class TeamService {
public void add(){
System.out.println("TeamService---- add----");// 核心业务
}
}
package com.jpg.staticproxy;
import com.jpg.service.TeamService;
/**
* 基于类的静态代理:
* 要求继承被代理的类
* 弊端:每次只能代理一个类
*/
public class ProxyTeamService extends TeamService {
public void add(){
try {
    System.out.println("开始事务");
    super.add();//核心业务就是由被代理对象完成 ;其他服务功能由代理类完成
    System.out.println("提交事务");
    }catch (Exception e){
    System.out.println("回滚事务");
}
}
}
public static void main(String[] args) {
TeamService ser=new ProxyTeamService();
ser.add();
}

其中,弊端也很明显。因为代理类只能代理一个类呀。这还是没有跳出传统的核心问题。

2.3.2 基于接口的静态代理

静态代理为核心业务**保存add,**创建一个接口,通过接口暴露被代理的方法。

第一步:创建定义一个接口以实现核心方法。

package com.jpg.service;
public interface IService {
    void add();
}

第二步:创建核心业务类(被代理类)实现第一步的接口

package com.jpg.service;
public class TeamService implements IService{
@Override
public void add(){
    System.out.println("TeamService---- add----");// 核心业务
}
}
package com.jpg.service;
public class UserService implements IService{
@Override
public void add() {
    System.out.println("UserService---- add-----");
}
}

第三步:创建编写基于接口的服务类(代理类)。此时代理类和被代理类实现一个接口。

这里我们编写事务类服务和日志类服务。

事务类:

package com.jpg.staticproxy;
import com.jpg.service.IService;
/**
* 基于接口的静态代理:
* 代理类和被代理类实现同一个接口
*/
public class ProxyTranService implements IService {
private IService service;//被代理的对象
public ProxyTranService(IService service) {
this.service = service;//指定被代理类(确认被代理的对象)
}
@Override
public void add() {
try {
System.out.println("开始事务");
service.add();//核心业务就是由被代理对象完成 ;其他服务功能由代理类完成
System.out.println("提交事务");
}catch (Exception e){
System.out.println("回滚事务");
}
}
}

日志类:

package com.jpg.staticproxy;
import com.jpg.service.IService;
public class ProxyLogService implements IService {
private IService service;//被代理对象
public ProxyLogService(IService service) {
this.service = service;
}
@Override
public void add() {
try {
System.out.println("开始日志");
service.add();//核心业务就是由被代理对象完成 ;其他服务功能由代理类完成
System.out.println("结束日志");
}catch (Exception e){
System.out.println("异常日志");
}
}
}

第四步:测试一下最后的核心代码与服务方法的结合。

public static void main(String[] args) {
TeamService teamService=new TeamService();//被代理对象
UserService userService=new UserService();//被代理对象
ProxyTranService tranService=new ProxyTranService(userService);//事务代理对象--一级代理
//tranService.add();//代理对象干活
ProxyLogService logService=new ProxyLogService(tranService);//日志的代理对象--二级代理
logService.add();
}

这里比较巧妙的是,创建一级对象和二级对象时如果对先后顺序有要求即通过如上示例调用。一级调用被代理者作为参数;二级调用以第一级别的代理的结果为基础,以一级代理作为其参数进行调用。

注意的是,如果日后对软件的更新需要修改接口方法,其他许多类都会受到或多或少的影响。

2.3.3 提取切面代码作为AOP接口

什么意思呢?就是将核心业务的各个环节插入某些事务处理环节等等。比如说运行核心业务前要编写事务和日志;到了编译核心代码结束后需要关闭事务和日志;报错了事务和日志需要填写相应的报错信息等等方面。

这就是动态代理面向切面编程的前置思想。

第一步:定义并设置切面接口下的方法。

package com.jpg.aop;
/**
* 切面:服务代码,切入到核心代码中,切入到哪里,给了四个位置
*/
public interface AOP {
void before();
void after();
void exception();
void myFinally();
}

这里的方法如中译理解一样,分别在核心业务前、后、异常处理和最后设置服务方法插入。

第二步:设置服务类(代理类)实现接口

事务类:

package com.jpg.aop;
public class TranAOP implements AOP {
@Override
public void before() {
System.out.println("事务----before");
}
@Override
public void after() {
System.out.println("事务----after");
}
@Override
public void exception() {
System.out.println("事务----exception");
}
@Override
public void myFinally() {
System.out.println("事务----myFinally");
}
}

日志类:

package com.jpg.aop;
public class LogAop implements AOP{
@Override
public void before() {
System.out.println("日志----before");
}
@Override
public void after() {
System.out.println("日志----after");
}
@Override
public void exception() {
System.out.println("日志----exception");
}
@Override
public void myFinally() {
System.out.println("日志----myFinally");
}
}

第三步:设置服务层,将核心业务和服务被代理合并起来

package com.jpg.staticproxy;
import com.jpg.aop.AOP;
import com.jpg.service.IService;
public class ProxyAOPService implements IService {
private IService service;//被代理对象
private AOP aop;//要加入切面
public ProxyAOPService(IService service, AOP aop) {
this.service = service;
this.aop = aop;
}
@Override
public void add() {
try {
aop.before();
service.add();//被代理对象干活
aop.after();
}catch (Exception e){
aop.exception();
}finally {
aop.myFinally();
}
}
}

第四步:测试

@Test
public void test02(){
IService teamService=new TeamService();//被代理对象--核心内容
AOP logAop=new LogAop();//切面-服务内容
AOP tranAop=new TranAOP();
IService service=new ProxyAOPService(teamService,logAop); //代理对象--一级
代理
IService service2=new ProxyAOPService(service,tranAop);//代理对象--二级代理
service2.add();
}

2.4 总结静态代理

总结静态代理:
可以做到不修改目标对象的功能前提下对目标对象进行扩展。
缺点:
1)代理对象需要与目标对象实现的接口一致,所以会有很多代理类。
2)一旦接口添加方法,目标对象和代理对象都要进行维护

谢谢大家的阅读,还请大家批评指正!

Spring源码学习--Spring中IOC和AOP的介绍 前言:控制反转(Inversion of Control,英文缩写为IoC); 面向切面编程(Aspect Oriented Programming,英文缩写为AOP)我们是在使用spring框架的过程中,很大一部分是为了使用IoC(依赖注入),和AOP(面向切面编程),这两个是Spring的灵魂。其中主要用到的设计模式有工厂模式和代理模式。IoC就是典型的工厂模式,通过sessionfactor 阅读详情

相关推荐

【Spring笔记06】Spring框架之AOP的介绍及使用

这篇文章,主要介绍一下AOP相关的概念,以及如何在Spring框架中使用AOP进行开发。 目录 一、AOP面向切面编程 1.1、什么是AOP

✅ Java 开发工程师 821

Spring框架注解开发——创建AOP代理对象

AOP

weixin_59015876的博客 665

RK3588 C-PHY摄像头驱动升级踩坑记:从‘Only CSI2 supported’报错到成功取流

本文详细记录了在RK3588平台上调试C-PHY摄像头驱动的全过程,从‘Only CSI2 supported’报错分析到成功取流。内容涵盖C-PHY与CSI-2协议差异、SDK版本对比、V4L2框架下的bus-type解析机制,以及硬件排查与寄存器调优实战经验,为嵌入式Camera驱动工程师提供宝贵参考。

weixin_42522374的博客 123

Spring5 AOP 切面创建增强类

通过创建增强类可以实现在不修改现有类的基础上增加类方法的类容,想用就用,不需要就删掉,实现了代码低耦合。 底层代码 通过UserDapImp的接口UserDao为其创建代理类(增强类) public class UserDaoImp implements UserDao { @Override public int add(int a, int b) { return a+b; } } public class JDKProxy { public

PYJ1101的博客 356

STM32-CubeMx-HAL库-串口空闲中断+DMA——利用HAL_UARTEx_ReceiveToIdle_DMA实现不定长数据接收

STM32-CubeMx-HAL库-串口空闲中断+DMA——利用HAL_UARTEx_ReceiveToIdle_DMA实现不定长数据接收

weixin_43864631的博客 1万+

28-基于STM32单片机的便携式健康监测系统设计与实现(程序+原理图+元件清单)

本文详细介绍了基于STM32单片机的便携式健康监测系统设计与实现,该系统集成MAX30102光电传感器和MSP20压力传感器,实时监测心率、血氧和血压等关键生理指标。通过STM32F103C8T6主控芯片和HC-05蓝牙模块,实现数据采集、处理及无线传输,具有便携性高、操作简便等特点,适用于家庭健康监护和户外运动场景。

weixin_29191669的博客 420

java 方法自定义注释_java – AOP在Overrided方法上应用自定义注释

我试图在调用方法之前注入一些样板代码,我一直在使用AOP.我成功地制作了一个自定义注释,现在管理我需要创建另一个并管理流程的流程.但是第二个引发NoSuchMethodFound错误.我需要注释一个Overrided方法.我也尝试注释一个简单的方法,但未能这样做.这是Aspect Class@Aspectpublic class AnnotationAspect {private static f...

weixin_35251837的博客 266

ENVI新手避坑指南:手把手教你搞定遥感影像的坐标系转换(附ArcGIS对比)

本文详细解析ENVI与ArcGIS在遥感影像坐标系转换中的关键差异与实战技巧,特别针对新手常见问题提供避坑指南。从基础概念到高级操作,涵盖定义投影、UTM转换等核心步骤,并对比两种软件的处理精度与效率,帮助用户高效完成遥感影像处理任务。

weixin_42531925的博客 377

Spring特性之一——AOP面向切面编程

带着问题去阅读 什么是面向切面编程?(是什么+为什么) 如何使用AOP?(怎么用) 什么是AOP? AOP,全称:Aspect Oriented Programming,即面向切面编程。它最早是在1997年的面向对象编程大会上提出来的概念,并于2001年在AspectJ中得到首次实践。 与面向对象OOP不同的是,AOP并不是将程序抽象成各个层次的对象,而是将程序抽象成一个一个的切面。 何为切面? 简单的理解,就是将程序在一些特定的地点(比如在某个函数调用之前、返回之后等)切分开来,并在这些特定的地点插入

青玉白露的博客 341

一文讲透 SAP SD:把报价、订单、交付、开票串成一条可落地的业务闭环

摘要:SAP SD(销售与分销)模块是企业O2C(订单到收款)流程的核心,管理从客户意向到回款的完整链路。该模块围绕销售订单、交付、开票等关键环节,与财务、物料管理等模块深度集成。SD的核心在于主数据管理、单据驱动流程、定价规则引擎和信用风控,通过条件技术实现复杂定价策略,并支持多维度分析。典型应用场景包括多渠道销售企业的价格体系管理、信用控制和物流协同,有效解决销售与交付脱节、财务对账困难等业务痛点。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 512

PTC Creo软件二次开发:使用C++进行Creo二次开发实战

C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。由Bjarne Stroustrup在贝尔实验室开发,最初作为C语言的增强版出现,后来发展成为一种独立的语言。C++不仅保留了C语言的高效性和灵活性,还引入了类、模板、命名空间等高级特性,使其成为开发复杂系统和软件的理想选择。

kkchenjj的博客 4042

java aop 属性改变_Spring(二) Spring中的AOP和属性注入

一.AOP(Aspect Oriented Programing)面向切面编程AOP的终极目标:让我们可以专心做事下面通过一个例子来介绍AOP的具体使用案例的要求:使用AOP实现日志记录系统 ,核心模块 和 增强 单独 开发 ,运行时再组装首先定义接口和方法接口和实现类中的代码,我放在一起了,应该比较简单package demo04.dao;/*** Created by myc...

weixin_36035585的博客 908

【电源专题】Type-C母座外壳直接接主板GND还是接RC呢?别再纠结了!

Type-C屏蔽壳接地这件事,没有唯一标准答案。符合规范、贴合产品、能过认证,就是最优解。希望这篇文章能帮你理清思路。

一点硬件 600

Spring AOP实现 | 代理模式分析

Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器。

wei_shuo的博客 2001

Unreal5从入门到精通之如何在VR中使用3DUI

前面我们讲过《Unreal5从入门到精通之UMG的使用》一般制作游戏时,UI都是添加到屏幕视窗上面的,但是在制作VR时,我们往往需要制作一个3D的UI,放置在场景中,然后使用手柄的射线来和UI进行交互。今天我们就来讲解下,如何在VR中创作和交互3DUI首次操作会感觉好复杂,多多练习,当你熟悉了UE蓝图的操作后会发现,这只是一个常规的蓝图操作而已。祝大家在虚幻的学习过程中非常顺利。希望这篇博客对你有所帮助。

TxNet 1985

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

代理模式与Spring中的AOP

代理模式是一种强大且灵活的设计模式,它通过引入代理对象来控制对目标对象的访问。代理模式提供了一种清晰的方式来实现横切关注点的分离,使得在不修改目标类的情况下,可以为其添加额外的功能。通过代理模式,开发人员能够更加高效地处理事务管理、日志记录、安全控制、缓存等常见的横切关注点。在Spring框架中,代理模式被广泛应用于AOP(面向切面编程)中,通过生成代理对象来增强目标对象的行为。Spring AOP支持基于接口的JDK动态代理和基于类的CGLIB代理,提供了非常灵活的编程方式。

weixin_43172297的博客 1114

计算机控制技术及应用

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

Spring AOP详解、ProxyFactoryBean介绍、AOP实现方式(代理模式)

文章目录Spring AOP 目标AOP 核心概念Spring AOP实现ProxyFactoryBean介绍ProxyFactoryBean的典型配置ProxyFactoryBean的构成ProxyFactoryBean的作用目标代理对象的创建代理模式详解JDK动态代理CGLIB代理小结 Spring AOP 目标 将分散在程序各处的横切关注点剥离出来并以集中的方式进行表达 使得开发人员能够专注于业务逻辑的实现而非繁杂的非功能代码, 简化了程序编写与单元测试 应用场景 日志 安全 事务 AOP

张大安的博客 2220

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

[spring]Spring AOP 及 代理模式

IoCAOP。

m0_73992740的博客 1062

Spring AOP理论 +代理模式详解

面向切面思想,是Spring的三大核心思想之一(两外两个:IOC-控制反转、DI-依赖注入)。那么AOP为何那么重要呢?在我们的程序中,经常存在一些系统性的需求,比如权限校验、日志记录、统计等,这些代码会散落穿插在各个业务逻辑中,非常冗余且不利于维护。例如下面这个示意图:有多少业务操作,就要写多少重复的校验和日志记录代码,这显然是无法接受的。

weixin_45080272的博客 3590

Spring-AOP与代理模式

AOP(Aspect-Oriented Programming,面向切面编程)是一种“横向”编程思想,与传统“纵向”的OOP(面向对象编程)互补。OOP通过类的继承和多态封装业务逻辑,而AOP将分散在各个业务逻辑中的公共功能(如事务、日志)抽取为“切面”,在不修改业务代码的前提下,通过“织入”机制将切面与业务逻辑结合,实现公共功能的统一管理。

小罗的博客 1068

Spring AOP的工作原理和实现方式

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

A_aspectJ的博客 2201

Spring的核心AOP及代理模式(“最易懂得Spring学习”)

????哇咔咔:\textcolor{blue}{哇咔咔:}哇咔咔:在前两篇中我们了解了IOC\textcolor{green}{在前两篇中我们了解了IOC}在前两篇中我们了解了IOC ????接下来就接触一下另一个核心AOP\textcolor{pink}{接下来就接触一下另一个核心AOP}接下来就接触一下另一个核心AOP ????所用到的代码都可以在这里找到???? ????博主也在学习阶段,如若发现问题,请告知,非常感谢\textcolor{Orange}{博主也在学习阶段,如若发现问题,请告知,非常

奔走的王木木Sir的博客 1317

Spring AOP 原理——代理模式

代理模式, 也叫委托模式。该模式是为其他对象提供⼀种代理以控制对这个对象的访问。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用。

m0_60462557的博客 1896

Spring——AOP用到的代理模式&SpringAOP实现原理

AOP,面向切面编程,是Spring框架中的核心思想之一;在Spring中是通过动态代理来实现的,在目标类的基础上增加切面逻辑,对原对象进行增强; SpringAOP的源码中用到了两种动态代理来实现拦截切入功能:JDK动态代理和CGlib动态代理,两种方法的适用条件和效率各有不同,各有优劣; 本来准备写一篇关于SpringAOP相关的文章的,这篇文章介绍,作为Spring AOP的基础知识,介绍代理设计模式以及Java中的几种不同的代理模式的实现:静态代理、JDK动态代理和CGlib代理;.........

娜娜米的博客 3092

Spring(七)AOP-代理模式

静态代理是通过手动编写一个“替身类”(代理类),在不修改原始类代码的前提下,为其添加额外功能(如日志、权限校验),使用时通过代理类间接调用原始类。:在不修改原始对象代码的前提下,添加新功能(如日志记录、性能统计)。:限制或增强对原始对象的访问(如权限校验)。:在需要时才初始化复杂对象(如大文件加载)。:隐藏底层复杂逻辑,对外提供简洁接口。:在方法调用前后自动记录日志。:调用方法前检查用户权限。

小安同学的博客 1973

Spring基础之AOP和代理模式

AOP面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统。Spring的AOP为动态AOP,实现的技术为: JDK提供的动态代理技术 和 CGLIB(动态字节码增强技术)代理模式--官方的定义为“为其他对象提供一种代理以控制对这个对象的访问”java中有静态代理、JDK动态代理、CGLib动态代理的方式。

xiaotu的博客 1370
上一篇: Redis知识指南:缓存穿透,缓存击穿,缓存雪崩问题—(5)
下一篇: Spring学习之动态代理(5)
Xiao艾扶
博客等级 码龄7年 187粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xiao艾扶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值