Spring AOP 演化过程(二):基于代理的经典Spring AOP

论文解读——YOLOv11(目标检测) YOLOv11提供了多种型号和功能,以满足不同应用场景的需求。对象检测对象检测是YOLOv11的基本功能之一。在训练时,YOLOv11能够检测图像中的对象,并输出对象的边界框和类别信息。这一功能在自动驾驶、智能安防等领域具有广泛应用。图像分割图像分割是YOLOv11的另一个重要功能。与对象检测不同,图像分割不仅检测对象的边界框,还能够对图像中的对象进行像素级别的分割。这使得YOLOv11在医疗影像分析、工业制造等领域具有更高的应用价值。姿态检测姿态检测是YOLOv11的一个独特功能。 阅读详情
Spring 的经典 AOP 编程模型在现在看来已经过时,如果有人在写代码的时候还使用这种方式实现AOP,那真是跟自己过不去。但是如果我们想要读Spring AOP 部分的源码时,如果仅仅了解 声明式 AOP 和基于注解的 AOP,那经典的AOP模型所使用的类会给我们带来疑惑,所以,还是简单了解一下Spring AOP的历史,重温一下经典。

Spring 经典的 AOP因为直接使用  ProxyFactoryBean, 看起来就显得非常笨重和过于复杂, 会让人感觉厌烦。 

下面用一个小例子介绍一下经典AOP实现,在写代码的时候我希望记录整个写代码的过程,比如开始写代码的时间点,完成代码的时间点,以及写代码过程中遇到的BUG等信息。对于程序员来说,这些记录希望有一个程序能自动进行,不用自己去看时间记录,因为这属于写代码之外的事,我们拒绝执行。此时,这个记录功能就是一个横切关注点。

定义一个接口,有一个写代码接口

public interface ICoder {
    public void writeCode();
}  

Monkey类实现这个接口,作为被代理对象
public class Monkey implements ICoder {
    @Override
    public void writeCode() {
        System.out.println("Writing Code!");
    }
}
定义一个前置通知,记录写代码之前的时间点
public class BeforeAdvice implements MethodBeforeAdvice {
    
    @Override
    public void before(Method method, Object[] args, Object instance) throws Throwable {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Before " + method.getName() + "  " + df.format(new Date()));
    }
}
定义一个后置通知,记录完成代码的时间点
public class AfterAdvice implements AfterReturningAdvice {
     @Override
    public void afterReturning(Object value, Method method, Object[] args, Object instance) throws Throwable {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Finished " + method.getName() + "  " + df.format(new Date()));
    }
}  
定义一个异常通知,在发现BUG时记录时间点
public class ExceptionAdvice implements ThrowsAdvice {
    public void afterThrowing(Throwable t) throws Throwable {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Find a Bug " + t +"  " + df.format(new Date()));
    }
}  
spring 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 正则表达式匹配通知方法 -->
    <bean id="before" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <property name="advice">
            <bean class="com.ink.spring.demo.aop.classic.BeforeAdvice"></bean>
        </property>
        <property name="patterns">
            <list>
                <value>.*Code.*</value>
            </list>
        </property>
    </bean>
    <bean id="after" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <property name="advice">
            <bean class="com.ink.spring.demo.aop.classic.AfterAdvice"></bean>
        </property>
        <property name="patterns">
            <list>
                <value>.*Code.*</value>
            </list>
        </property>
    </bean>
    <bean id="exception" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <property name="advice">
            <bean class="com.ink.spring.demo.aop.classic.ExceptionAdvice"></bean>
        </property>
        <property name="patterns">
            <list>
                <value>.*Code.*</value>
            </list>
        </property>
    </bean>
    
    <bean id="monkey" class="com.ink.spring.demo.aop.classic.Monkey" />
    <!-- 代理 -->
    <bean id="monkeyProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="interceptorNames">
            <list>
                <value>before</value>
                <value>after</value>
                <value>exception</value>
            </list>
        </property>
        <property name="target" ref="monkey" />
    </bean>
</ beans >   

测试类
public class Main {
    
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        ICoder coder = (ICoder) context.getBean("monkeyProxy");
        coder.writeCode();
    }
}  

输出结果:
Before writeCode  2017-04-05 21:53:59
Writing Code!
Finished writeCode  2017-04-05 21:54:00  



使用W5500与外网通信故障解决(MAC地址问题) 在蒲城项目的调试时,AMS500发现一个致命的问题,就是:在局域网跨网段通信时候和中心服务器不能通信,但是在一个HUB下是没有问题的,以前的串口服务器有过类似的问题出现,解决方法说是芯片的问题,结果也不了了之,换了芯片正常。 我们的网络通信芯片选择W5500,其中的MAC地址采用的是CPU的序列号作为Mac地址的问题就出在这,我们在使用的时候MAC地址的第一个必须是偶数,我们忽视了。 现象描... 阅读详情

相关推荐

Xilinx ZYNQ 7000学习笔记二(FSBL代码分析启动-汇编代码)

Xilinx ZYNQ 7000学习笔记

u011116085的博客 4246

Spring AOP原理解析——经典的基于代理的AOP是如何实现的?

Spring实现AOP有4种方式,感兴趣的可以查看下面的博文: https://blog.youkuaiyun.com/u011983531/article/details/49391129 首先,我们来看看基于经典的AOP是如何实现的。 先写一个接口叫Sleepable,所有具有睡觉能力的东西都可以实现该接口。 package com.ghs.aop; public interface Sleep...

根号三 4731

宋浩线性代数笔记

Miao-A-SongHao-Linear-Algebra-Notes bilibili 宋浩老师 “惊叹号” 系列 《线性代数》网课 笔记及时间点目录 Github项目地址:https://github.com/cy69855522/Miao-A-SongHao-Linear-Algebra-Notes ???? 前言 我发现吧,线代没记笔记真不行。 浩浩学习,天天向上。数学网课推荐????宋浩老师的免...

Knife丶小刀博客 4万+

SpringAOP的演进过程

SpringAop的演进过程SpringAOP的来龙去脉1.静态代理静态代理的问题2.接口直接创建对象是否可行JVM是如何创建对象的 SpringAOP的来龙去脉 1.静态代理 public class CalculateImp implements Calculate{ public int add(int a, int b) { int result = a + b; return result; } public int delete(int a, int b) {

zhibeiyougaga的博客 181

本地部署大模型 vs 网页版大模型区别

fill:#333;color:#333;color:#333;fill:none;本地服务器/工作站硬件资源私有化部署GPU集群高速存储模型文件训练框架推理引擎。

Ds-Rag的博 1711

Oracle-如何修复undo坏快

undo出现坏快,导致数据库宕机,无法启动

qqqyyy0422的博客 570

Spring AOP(经典的基于代理)

一、介绍 AOP(AspectOrientedProgramming)。 区别:OOP(Object Oriented Programming)和AOP(Aspect Oriented Programming)的区别:面向目标的区别,OOP面向名词领域,AOP面向动词领域。思想结构的区别,OOP是纵向结构,AOP是横向结构。注重方面的区别,OOP注重业务逻辑单元的划分,AO...

qq_36511401的博客 1万+

可视化大屏系列(5):设备状态面板与数据分析仪表盘

在这篇文章中,我们将重点讨论如何通过智能化手段提升工地设备的管理效率与维护质量。随着智能工地系统的不断发展,设备监控与维护管理变得尤为重要。本篇将从 设备状态实时监控、自动化维护提醒、设备管理与维修记录 三个方面入手,展示如何通过 Vue3 和 ECharts 构建一个智能化的设备管理平台,实时采集和展示设备运行状态、及时生成维护提醒并记录维修历史,以提高设备的使用效率与安全性。我们还将结合实际代码示例,详细讲解如何实现这些功能,帮助你在智能工地项目中实现设备管理的智能化、数字化和自动化。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 3364

Spring AOP 原理——代理模式

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

m0_60462557的博客 1896

(10)Proteus 8.9上的STM32仿真系列(HAL)---freertos

实验设计:通过cubemxide生成freertos工程,然后创建一个 pc13 led灯间隔200ms闪烁的任务。非常遗憾的是proteus8.9仿真失败,实物上没有问题,但还是把流程过一遍。 一、原理图 实物是淘宝上stm32f103 c8t6的核心板,proteus上没有这个芯片,这里图上大概表示一下,用的是核心板自带的pc13引脚的led灯。 二、cubemxide配置 1.RCC如之前工程一样配置 2、配置SYS timebase Source不要使用systick,自己选择一个定时器,我这

qq_35442550的博客 7342

华为OD机试新系统真题 【LLM推理批次最大化】

华为OD机试 新系统真题【LLM推理批次最大化】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【LLM推理批次最大化】多语言题解。

qq_45776114的博客 567

经典AOP-基于代理

基于代理是一项非常经典的具有AOP思想的实现方法,从这也产生了代理模式

VincenLlin的专栏 710

gseapy python包GO、KEGG富集(注释)分析

文档案例参考:https://gseapy.readthedocs.io/en/latest/gseapy_example.html#Over-representation-analysis-by-Enrichr-web-services安装:建议安装最新版(这里安装的1.04):https://github.com/zqfang/GSEApy/releases。

weixin_42357472的博客 3610

Spring AOP从入门到精通

ProxyFactoryBean已经基本可以使用了,只是每一个Bean要做代理时都需要手工配置一个ProxyFactoryBean,使用起来还是略显繁琐。Spring提供了AbstractAutoProxyCreator来完成AOP代理的自动创建。这里我们以BeanNameAutoProxyCreator为例,看看AutoProxyCreator是如何使用,它是怎么工作的。

你若盛开,清风自来 1970

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Spring IOC和DI以及AOP理解

概述 这三个概念可能大家都不陌生,在面试中经常会出现关于此类的问题,关于对他们的个人理解如下。 IOC IOC其实就是控制反转,控制指的是对象的创建、管理、实例化权利,反转指的是控制权交给了外部容器Spring框架,打个比喻,我在项目中创造了一个对象类,在业务层需要用到他了,一般的办法是什么?是不是new对象啊,毕竟程序猿最擅长new对象了,而new对象就意味着依赖性增强,那么我不new行不行呢,这个时候IOC就出场了,IOC容器能帮助我们实例化对象并且管理它,当我们需要使⽤哪个对象,直接去问IOC容器要即

qq_33261885的博客 392

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

AOP技术应用和研究--AOP语言

AOP语言

暗淡小子 2360

Spring 学习笔记——之一

1.spring演化 1.xml配置 2.注解配置 3.java配置 2.spring模块 1.核心容器(Core Containter) 1.Spring-core 核心工具类 2.spring-Beans spring定义Bean的支持 3.Spring-Context 运行时Spring容器 4.Spring-Context...

carry_bin的博客 176

Spring框架学习1.0对动态代理的理解z,自定义BeanFactory

自定义一个接口 和一个接实现类 public interface Hello { void setInfo(String a,String b); String getInfo(); void hah(String s); } /** * Created by likailong on 2016/9/29. */ public class HelloIml impl

李凯龙 1076

Java设计模式实战:从单例到策略,代码实现与避坑指南

设计模式是软件工程中解决常见问题的经典方案,其核心在于通过封装变化来提升代码的灵活性和可维护性。从原理上讲,设计模式遵循开闭原则、依赖倒置等设计思想,将易变的部分抽象隔离,使系统更易于扩展。其技术价值在于帮助开发者应对复杂多变的业务需求,避免代码腐化,提升团队协作效率。在应用场景上,无论是创建型模式如单例模式管理全局配置,结构型模式如适配器模式整合遗留系统,还是行为型模式如策略模式实现动态算法替换,都是工程实践中的高频需求。本文聚焦于Java语言,通过工厂模式、适配器模式等具体实现,结合单例模式的双重检查锁

weixin_34319111的博客 418

spring经典的基于代理的AOP编程-方法

11720171026 package com.tiger.advisor; import java.lang.reflect.Method; import org.springframework.aop.support.StaticMethodMatcherPointcutAdvisor; /** * 编写切点类,继承某个切点类型 * @author tiger *

轻描淡写 428

AOP实现方式1——经典的基于代理的AOP实现

1.定义接口Perform package com.show; /** * Created by kenneth on 2017/4/6. */ public interface Perform { void sing(); } 2.定义接口Perform的实现类Boy package com.show; /** * Created by kenneth on

csdn_kenneth的博客 1660

基于JDK动态代理的经典Spring AOP

我们知道,要使用JDK的动态代理,目标类需要实现

岁月静好 1541

spring经典的基于代理的AOP编程-[控制粒度-类]

11520171026 经典的基于代理的AOP编程-[控制粒度-类]

轻描淡写 510

spring aop 经典代理方式解析

bean.xml的书写方式:&lt;bean id="service" class="wwx.service.Service"&gt;&lt;!-- 被代理者,可以是java普通的类,也可以是java实现接口的普通的类--&gt; &lt;property name="name" value="wwx" /&gt; &lt;/bean&gt; &lt;

plusme 281

基于CGLIB代理的经典Spring Aop

经典的Spring Aop可以基于JDK动态代理,也可以基于

岁月静好 2191

Spring基于代理类的AOP实现

1.Spring的通知类型 Spring中的通知按照在目标类方法的连接点位置,可以分为以下5种类型。org.aopalliance.intercept.Methodlnterceptor(环绕通知) 在目标方法执行前后实施增强,可以应用于日志、事务管理等功能。 org.springframework.aop.MethodBeforeAdvice(前置通知) 在目标方法执行前实施增强,可以应用于权限管理等功能。 org.springframework.aop.AfterReturningAdvice(后置.

xing__he的博客 359

Spring review--动态代理和AOP代码的演化

客户端代码,首先通过容器实例化applicationContext.xml里面的Bean,然后调用add方法。 <span style="font-size:14px;"><span style="font-size:14px;">public class Client { public static void main(String[] args) {...

随手记 821
上一篇: Java事务之八——分布式事务(Spring+JTA+Atomikos+Hibernate+JMS)
下一篇: FactoryBean 是什么
TaiSung
博客等级 码龄15年 49粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值