SPRING FRAMEWORK(4) AOP

全面掌握Spring Framework 4.3.4及其所有jar包 本文还有配套的精品资源,点击获取 简介:Spring Framework 4.3.4是一个关键版本,属于Spring框架的4.x系列,提供了许多改进和更新。本文深入探讨了依赖注入、AOP、Spring MVC、数据访问、注解驱动开发、WebSocket支持、类型安全配置、性能优化以及兼容性和稳定性等关键知识点,并强调了这些特性在实际开发中的重要性。通过使用Spring Fr... 阅读详情

reference:https://my.oschina.net/liughDevelop/blog/1457097
为了阐述清楚Spring AOP,我们从将以下方面进行讨论:
1.代理模式。
2.静态代理原理及实践。
3.动态代理原理及实践。
4.Spring AOP原理及实战。

1.代理模式。

     代理模式:为其他对象提供一种代理以控制对这个对象的访问。这段话比较官方,但我更倾向于用自己的语言理解:比如A对象要做一件事情,在没有代理前,自己来做,在对A代理后,由A的代理类B来做。代理其实是在原实例前后加了一层处理,这也是AOP的初级轮廓。

2.静态代理原理及实践。

     静态代理模式:静态代理说白了就是在程序运行前就已经存在代理类的字节码文件,代理类和原始类的关系在运行前就已经确定:
// 接口
public interface IUserDao {
    void save();
    void find();
}
//目标对象
class UserDao implements IUserDao{
    @Override
    public void save() {
        System.out.println("模拟:保存用户!");
    }
    @Override
    public void find() {
        System.out.println("模拟:查询用户");
    }
}
/**
    静态代理
          特点:
    1. 目标对象必须要实现接口
    2. 代理对象,要实现与目标对象一样的接口
 */
class UserDaoProxy implements IUserDao{
    // 代理对象,需要维护一个目标对象
    private IUserDao target = new UserDao();
    @Override
    public void save() {
        System.out.println("代理操作: 开启事务...");
        target.save();   // 执行目标对象的方法
        System.out.println("代理操作:提交事务...");
    }
    @Override
    public void find() {
        target.find();
    }
}

静态代理虽然保证了业务类只需关注逻辑本身,代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理。再者,如果增加一个方法,除了实现类需要实现这个方法外,所有的代理类也要实现此方法。增加了代码的维护成本。

3.动态代理原理及实践。

     动态代理模式:动态代理类的源码是在程序运行期间通过JVM反射等机制动态生成,代理类和委托类的关系是运行时才确定的。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 接口
public interface IUserDao {
    void save();
    void find();
}
//目标对象
 class UserDao implements IUserDao{
    @Override
    public void save() {
        System.out.println("模拟: 保存用户!");
    }
    @Override
    public void find() {
        System.out.println("查询");
    }
}
/**
 * 动态代理:
 *    代理工厂,给多个目标对象生成代理对象!
 *
 */
class ProxyFactory {
    // 接收一个目标对象
    private Object target;
    public ProxyFactory(Object target) {
        this.target = target;
    }
    // 返回对目标对象(target)代理后的对象(proxy)
    public Object getProxyInstance() {
        Object proxy = Proxy.newProxyInstance(
            target.getClass().getClassLoader(),  // 目标对象使用的类加载器
            target.getClass().getInterfaces(),   // 目标对象实现的所有接口
            new InvocationHandler() {           // 执行代理对象方法时候触发
                @Override
                public Object invoke(Object proxy, Method method, Object[] args)
                        throws Throwable {

                    // 获取当前执行的方法的方法名
                    String methodName = method.getName();
                    // 方法返回值
                    Object result = null;
                    if ("find".equals(methodName)) {
                        // 直接调用目标对象方法
                        result = method.invoke(target, args);
                    } else {
                        System.out.println("开启事务...");
                        // 执行目标对象方法
                        result = method.invoke(target, args);
                        System.out.println("提交事务...");
                    }
                    return result;
                }
            }
        );
        return proxy;
    }
}

测试:
这里写图片描述
在运行测试类中创建测试类对象代码中

IUserDao proxy = (IUserDao)new ProxyFactory(target).getProxyInstance();

其实是JDK动态生成了一个类去实现接口,隐藏了这个过程:

class $jdkProxy implements IUserDao{}

使用jdk生成的动态代理的前提是目标类必须有实现的接口。但这里又引入一个问题,如果某个类没有实现接口,就不能使用JDK动态代理,所以Cglib代理就是解决这个问题的。

Cglib是以动态生成的子类继承目标的方式实现,在运行期动态的在内存中构建一个子类:

public class UserDao{}
//Cglib是以动态生成的子类继承目标的方式实现,程序执行时,隐藏了下面的过程
public class $Cglib_Proxy_class  extends UserDao{}

Cglib使用的前提是目标类不能为final修饰。因为final修饰的类不能被继承。

现在,我们可以看看AOP的定义:面向切面编程,核心原理是使用动态代理模式在方法执行前后或出现异常时加入相关逻辑。

通过定义和前面代码我们可以发现3点:
1.AOP是基于动态代理模式。
2.AOP是方法级别的
3.AOP可以分离业务代码和关注点代码(重复代码),在执行业务代码时,动态的注入关注点代码。切面就是关注点代码形成的类。

4.spring AOP原理及实战。

前文提到JDK代理和Cglib代理两种动态代理,Spring框架把两种方式在底层都集成了进去,我们无需担心自己去实现动态生成代理。那么,Spring是如何生成代理对象的?:
1.创建容器对象的时候,根据切入点表达式拦截的类,生成代理对象。
2.如果目标对象有实现接口,使用jdk代理。如果目标对象没有实现接口,则使用Cglib代理。然后从容器获取代理后的对象,在运行期植入”切面”类的方法。通过查看Spring源码,我们在DefaultAopProxyFactory类中,找到这样一段话。
简单的从字面意思看出,如果有接口,则使用Jdk代理,反之使用Cglib,这刚好印证了前文所阐述的内容。Spring AOP综合两种代理方式的使用前提有会如下结论:如果目标类没有实现接口,且class为final修饰的,则不能进行Spring AOP编程!

知道了原理,现在我们将自己手动实现Spring的AOP:

import org.aspectj.lang.ProceedingJoinPoint;
//jdk
public interface IUserDao {
    void save();
}
//用于测试Cglib动态代理
class OrderDao {
    public void save() {
        //int i =1/0;用于测试异常通知
        System.out.println("保存订单...");
    }
}
//用于测试jdk动态代理
class UserDao implements IUserDao {
    public void save() {
        //int i =1/0;用于测试异常通知
        System.out.println("保存用户...");
    }
}
//切面类
class TransactionAop {
    public void beginTransaction() {
        System.out.println("[前置通知]  开启事务..");
    }
    public void commit() {
        System.out.println("[后置通知] 提交事务..");
    }
    public void afterReturing(){
        System.out.println("[返回后通知]");
    }
    public void afterThrowing(){
        System.out.println("[异常通知]");
    }
    public void arroud(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("[环绕前:]");
        pjp.proceed();                 // 执行目标方法
        System.out.println("[环绕后:]");
    }
}

Spring的xml配置文件:

    <!-- dao实例加入容器 -->
    <bean id="userDao" class="test.spring_aop_anno.UserDao"/>
    <!-- dao实例加入容器 -->
    <bean id="orderDao" class="test.spring_aop_anno.OrderDao"/>
    <!-- 实例化切面类 -->
    <bean id="transactionAop" class="test.spring_aop_anno.TransactionAop"/>

    <!-- Aop相关配置 -->
    <aop:config>
        <!-- 切入点表达式定义 -->
        <aop:pointcut expression="execution(* test.spring_aop_anno.*Dao.*(..))" id="transactionPointcut"/>
        <!-- 切面配置 -->
        <aop:aspect ref="transactionAop">
            <!-- 【环绕通知】 -->
            <aop:around method="arroud" pointcut-ref="transactionPointcut"/>
            <!-- 【前置通知】 在目标方法之前执行 -->
            <aop:before method="beginTransaction" pointcut-ref="transactionPointcut" />
            <!-- 【后置通知】 -->
            <aop:after method="commit" pointcut-ref="transactionPointcut"/>
            <!-- 【返回后通知】 -->
            <aop:after-returning method="afterReturing" pointcut-ref="transactionPointcut"/>
            <!-- 异常通知 -->
            <aop:after-throwing method="afterThrowing" pointcut-ref="transactionPointcut"/>
        </aop:aspect>
    </aop:config>

Spring AOP拿它做什么?

     1.Spring声明式事务管理配置
     2.[Controller层的参数校验。](http://blog.csdn.net/u011710466/article/details/53909059)
     3.[使用Spring AOP实现MySQL数据库读写分离案例分析](http://blog.csdn.net/xlgen157387/article/details/53930382)
     4.在执行方法前,判断是否具有权限。
     5.对部分函数的调用进行日志记录。
     6.信息过滤,页面转发
Spring Framework 4.2.4 实战:Jar包和Xsd文件深度解析 在Java开发中,jar(Java Archive)文件是一种压缩文件格式,用于封装Java类文件、元数据和资源(如文本、图片等)到一个单独的压缩文件中。Spring Framework的jar包根据其包含的组件和功能被分为不同的类别,以便于用户根据需要添加到项目中。例如::包含Spring框架的核心类,包括IoC容器和依赖注入的基础设施。:提供了Bean工厂和相关的Bean操作类。:为面向切面编程提供了支持,是AOP模块的核心。 阅读详情

相关推荐

Spring Framework 4.3.7核心组件详解与应用指南

在IoC容器中,Bean的定义通常通过XML配置文件、注解或Java配置类来完成。装配是指IoC容器在运行时,将各个Bean注入到指定的依赖中。-- XML配置示例 --></bean>Spring Data是一个旨在简化数据访问层实现的项目,它提供了对数据访问技术的抽象,并且支持多种数据源和ORM框架。Spring Data的核心功能之一是提供了通用的Repository接口,这些接口封装了基本的数据访问层功能。例如,定义一个简单的数据访问接口,继承自。

weixin_42561464的博客 1130

精通Spring Framework (4) 深入掌握Spring AOP(二)

二、 AspectJ 编译实现AOP AspectJ 是静态代理的增强,所谓的静态代理就是 AOP 框架会在编译阶段生成 AOP 代理类,因此也称为编译时增强。 AspectJ 是 Java 语言的一个 AOP 实现,其主要包括两个部分: 第一个部分定义了如何表达、定义 AOP 编程中的语法规范,通过这套语言规范,我们可以方便地用 AOP 来解决 Java 语言中存在的交叉关注点问题 另一个部分是工具部分,包括编译器、调试工具等。 AspectJ 是最早、功能比较强大的 AOP 实现之一,对整套 AOP 机

keep_learn的专栏 243

深入解析Spring Framework 4.2.3.RELEASE

Spring是一个全面的Java平台,它提供了从企业应用到分布式系统所需的基础设施支持。它的模块化架构允许开发者根据需求选择合适的模块,构建应用。核心的模块包括核心容器、数据访问/集成、Web、AOP(面向切面编程)、工具和测试等。// 示例代码:一个简单的Spring应用上下文的创建依赖注入是一种设计模式,它允许程序在运行时动态地解析依赖关系,而不是在编写代码时静态地创建依赖。在Spring框架中,依赖注入可以实现以下几个关键作用:降低组件之间的耦合度。

weixin_29476595的博客 598

Spring Framework 学习笔记4:AOP

AOP(Aspect Oriented Programming,面向切面编程)是一种编程思想。它要解决的问题是:如何在不改变代码的情况下增强代码的功能。更详细的说明可以观看这个。

梦幻天空 304

Spring Framework 2.5.6深度解析及JUnit集成实践

Spring Test模块是一个专门用于测试Spring应用的模块,它提供了一系列工具和库来简化测试的编写和执行。Spring Test模块不仅支持传统的单元测试,还扩展了支持集成测试,确保你的代码在应用上下文中能正确运行。Spring Test模块中包括以下主要组件:: 为测试提供了一个基础的支持,负责加载Spring配置并管理测试环境。它支持不同的测试框架,并提供强大的支持来配置和使用不同的测试环境。JUnit和TestNG的扩展。

weixin_42527589的博客 992

西门子博图TIA Portal V18实战:用LAD梯形图快速上手一个电机启停控制程序

本文详细介绍了如何在西门子博图TIA Portal V18中使用LAD梯形图快速实现电机启停控制程序。从项目创建、硬件组态到LAD编程和仿真调试,逐步引导读者掌握PLC编程的核心逻辑,特别适合工业自动化领域的初学者快速上手。

weixin_30617737的博客 691

Spring Framework(4)-AOP总结

点击查看Spring系列文章 目录 一.什么是AOP 1.AOP的作用 2.AOP的本质是什么 3.三种动态代理的实现本质是什么 二.Spring AOP的配置和使用过程 1.基于xml配置文件的使用 1.AOP核心概念 2.Spring对AOP的支持 3.代码实现 2.基于注解配置的使用 1.applicationContext.xml 2.TargetClass ...

BoringError的博客 4469

如何构建智能聊天系统

聊天分为听、思考、读,简单的通过ASR、LLM、TTS三类模型的组合可以实现,最近openai推出支持多模态的GPT-4o模型,可以把三个模型真正融合成在一起。现在市面上的模型百花齐放,各有所长。要实现可落地的方案,需要结合业务,验证模型效果,同时也要考虑方案的可行性,有些模型在国内能用,有些在国内不能用。

xsgnzb的专栏 2110

spring-framework源码第4弹------Spring AOP的简单实现(学习tiny-spring)

声明:本代码来源于tiny-spring ,感谢原作者的源码 修改后的代码tiny-spring-copy

码农飞哥 1535

Rocky Linux 9 远程桌面配置全攻略:从零搭建XRDP服务(含防火墙设置)

本文提供了在Rocky Linux 9上从零开始配置XRDP远程桌面服务的完整指南。详细介绍了系统准备、XRDP服务安装、防火墙与SELinux安全设置、多用户性能优化以及多平台客户端连接实测。重点解决了使用Windows远程桌面协议(RDP)连接Rocky Linux时常见的配置难点与安全问题,帮助用户获得稳定高效的图形化远程访问体验。

vodka的博客 650

张正友标定法-MATLAB实验

该方法最早由微软研究院的Zhengyou Zhang教授提出,1998年发表在IEEE TRANSACTIONS ON PATTERNANALYSIS AND MACHINE INTELLIGENCE,论文题目为:AFlexible New Technique for Camera Calibration。 (一)标定平面到图像平面的单应性 单应性(homography):在计算机视觉中被定义

qq_37845624的博客 8290

spring framework 3.2.4 各组件依赖包列表

aop: aopalliance commons-logging spring-beans spring-core   aspects: aopalliance aspectjweaver commons-logging spring-aop spring-beans spring-context spring-context-spport spring-core s

禅悟逍遥的专栏 2097

速腾R128雷达+海康全景相机ROS数据采集避坑实录:从‘雷达不转’到MATLAB标定的完整流程

本文详细记录了速腾R128激光雷达与海康威视全景相机在ROS环境下的数据采集与MATLAB标定全流程。从硬件配置的常见陷阱(如雷达旋转参数设置)、驱动编译的依赖管理,到多传感器同步的实战技巧和MATLAB标定方法,提供了完整的避坑指南和技术方案。特别针对RoboSense R128雷达和海康相机的特殊需求给出了具体解决方案。

weixin_28717807的博客 1221

忘记加入spring-aop-4.3.16.RELEASE.jar出错

出错代码: java.lang.NoClassDefFoundError: org/springframework/aop/framework/AopProxyUtils at org.springframework.context.event.AbstractApplicationEventMulticaster.addApplicationListener(Abstr...

banghaoqs409152的博客 551

Unity 常见问题 之 打包编译的报错 Unable to sign the application; please provide passwords!

Unity 常见问题 之 打包编译的报错 Unable to sign the application; please provide passwords! 目录 Unity 常见问题 之 打包编译的报错 Unable to sign the application; please provide passwords! 一、简单介绍 二、问题描述 三、原因分析 四、可能的解决方法 方法一:取消 Keystore 设置即可 方法二:重新添加 Keystore 相关设置 一...

仙魁XAN 1万+

电赛控制-----经验分享

1.赛前准备 先简单介绍一下电赛。电赛是两年一届,单数年是大电赛,全称是全国大学生电子设计大赛,之前由瑞萨电子赞助,所以之前也叫瑞萨杯,从19年开始赞助方变成了TI公司,偶数年是小电赛,全称是“TI杯”模电邀请赛,(这里不得不提TI公司的实力是愈来愈大了),一般来说小电赛的含金量会略低于大电赛,而且对与想拿国奖的同学来说还是要参加大电赛,因为小电赛一般每个学校会限制只有两个队伍进国赛,而大电赛是没有这个限制的,而且我们学校电赛保研的话,大电赛只要求国二,而小电赛只有国一才可以保,这样难度就增加了很多。..

qq_35656655的博客 1万+

Spring Framework 2.5发布

Spring Framework 2.5发布 Spring Framework是Java平台上非常流行的开源框架之一。其最新的特征有:完全支持Java 6,JDBC 4,JAX-WS 2.0,基于annotation的依赖注入,在类路径中自动检测组件,自动配置组件作为Spring的被管对象的能力,新的AOP特征,多个Web层增强等等。另外一些值得注意的特征包括:1)A new be

chszs的专栏 2246

Cesium 实战 26 - 自定义纹理材质 - 箭头流动线(图片纹理)

Cesium 实战 - 自定义纹理材质 - 箭头流动线(图片纹理)。

非科班Java出身GISer的博客 1405

java hibernate Aop_java – 使用Spring AOP配置Hibernate会话

我有一个Spring Framework 4应用程序,它使用Hibernate 4.3.8作为JPA提供程序.我想使用Hibernate过滤器,因此我需要启用它们.我想在应用程序中全局执行此操作,我正在尝试使用Spring AOP.我的想法是,我可以编写一个方面,每次创建/获取会话时启用过滤器,如this和this问题.我已经将spring-aop和aspectjweaver依赖项添加到我的项目中...

weixin_33263633的博客 182

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

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Spring全家桶深度解析与Java面试实战指南

Spring框架作为Java生态的核心技术栈,其设计思想与实现原理是开发者必须掌握的基础。从控制反转(IoC)到面向切面编程(AOP),Spring通过模块化架构解决了企业级应用开发的复杂性。随着云原生技术的普及,Spring Boot和Spring Cloud进一步提升了微服务架构的实施效率。这份阿里巴巴技术团队整理的Spring全家桶学习资料,不仅系统梳理了从基础原理到高阶应用的知识体系,更针对大厂面试场景进行了专项优化。资料包含Spring 6.x新特性解析、性能调优参数以及Spring Cloud

weixin_32247165的博客 223

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring Framework 1.2.6 是 Spring 框架的一个非常早期的版本,发布于 **2005 年 10 月 27 日*

- 修复了 Spring 1.2.5 中发现的若干 bug(如 AOP proxy 创建异常、JDBC `JdbcTemplate` 的空值处理问题、Hibernate 集成中的事务传播行为等); - 增强了对 JDK 1.4 和 5.0(当时为 beta/RC 阶段)的兼容性; - 改进了对 Struts 1.x 的集成支持(`DelegatingActionProxy` 等); - 文档和示例的小幅更新。

[Blog][Domain] programb.blog.youkuaiyun.com 441

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

spring框架 使用注解方式将bean加入ioc容器的问题:BeanDefinitionStoreException

0. 使用spring框架进行简单的aop演示,通过注解的方式将bean加入ioc容器(之前都是直接使用xml配置的方法加入bean的)抛出异常 1. 先贴异常信息: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: fil...

KooKing_L的博客 849

Spring AOP 需要包含的各种包

如果你用 spring-framework-4.2.5.RELEASE-dist 去开发基于AOP的程序,除了要安装aspectJ1.7 ,然后包含aspectJ1.7 lib 下的包外,   额外还需要包含下面的包: com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar cglib-2.2.2.jar com.springsourc

大树叶 技术专栏 5865

Spring 面试题,打包给大家

Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲来源丨Java建设者(ID:javajianshe)...

<sdffdsfsdfdfs>sfsfsfsdfsdffds</sdfsDS>Fsd 401
上一篇: tensorFlow on mac
下一篇: 第一篇 线性回归
llianlianpay
博客等级 码龄10年 72粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值