注意:我们分析的版本是SpringFramework-3.2.8.RELEASE。
在去年研发XX项目时,需要一种字节码增强机制,用于增强HSF、Tair、TDDL等相关类,用于信息采集。当时考虑了好几种方案,也踩到了一些坑,特别是关于Spring AOP代理机制的一个缺陷,让我最后决定放弃使用Spring AOP,而采用了基于JVM-Sandbox的方案。写此文特地记录下这个坑,避免后人重复入坑(当然这个问题在5.0.5后应该是已经修复了)
spring是如何实现AOP切面的,从原理上来说是动态代理,那么怎样去实现这个动态代理呢就是本篇的内容。
上篇博文: 【小家Spring】面向切面编程之—Spring AOP的原理讲解以及源码分析(Cannot find current proxy: Set ‘exposeProxy’ property on ) 已经刚刚结合实例,介绍了Spring AOP的过程以及对源码进行了逐步分析~
在其它的文章中我们基本都是采用ProxyFactoryBean类来创建代理类的,但在使用此类时,我们通常要设置很多属性不方便我们使用。在spring中我们还可以使用BeanNameAutoProxyCreator类以更加优雅的方式为我们创建代理类。下面我们看一下该类的使用:
事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。
上一篇文章我们主要讲了一点关于AOP编程,它的动态考虑程序的运行过程,和Spring中AOP的应用,前置通知,后置通知,环绕通知和异常通知,这些都是Spring中AOP最简单的用法,也是最常用的东西,本节我们 要讲:对上节课的补充和AOP的高级使用,本文将以以下的顺序来进行分析: 无接口的CGLIB动态代理 有接口的CGLIB动态代理 方法名匹配切入点顾问 正则表达式方法切入点顾问 自动代理生成器 (一)无接口的CGLIB动态代理 上一节我们示范的通知(前置,后置...),都有实现接口,我们在动态代理中也曾
本系列列举的源码中,很多类没有展开讲,是因为之前的系列文章一直在对aop基础组件进行介绍,因此一定要按照顺序看本系列,否则观看本篇文章的时候,越往后看,越发觉得本文模糊不清,只会粘贴源码,实则不然,因为很多类前文已经讲过,如果本文再展开讲解,那么将无法突出重点
PlatformTransactionManager接口定义了事务界定的基本操作,我们可以直接使用它来进行编程式事务管理。
AOP 联盟为通知 Advice 定义了 org.aopalliance.aop.Interface.Advice 。
在上一篇中我们通过BeanNameAutoProxyCreator类中的beanNames属性来自动的匹配需要增强的对象,那么在这一篇中我们将使用一种更智能的类它匹配我们需要的增强的对象,也就是DefaultAdvisorAutoProxyCreator类,该类甚至可以不设置需要匹配的增强对象,即可对对象进行增强。下面我们看一下该类的具体使用。
传统的事务是本地事务,在当今的微服务架构中已经不能满足要求,此时需要解决的问题是分布式事务,当前的分布式事务存在两大理论依据:CAP定律、BASE理论。
该动态代理是基于接口的动态代理,所以并没有一个原始方法的调用过程,整个方法都是被拦截的。
研究使用接口方式实现AOP, 目的是为了更好地理解spring使用动态代理实现AOP的两种方式
基于两种动态代理技术,在Spring中进行了封装,封装出来的类叫做ProxyFactory,表示是创建代理对象的一个工厂,使用起来会更加方便。
ProxyCreatorSupport内部拥有一个AopProxyFactory的对象实例,但是获取AopProxy的时候,是通过AopProxyFactory 的createAopProxy方法中传入自身实例ProxyCreatorSupport,来得到一个指定的AopProxy的,通过AopProxy 我们就可以获取到被代理后的对象
之前在另外一篇博文里介绍过AOP的概念, 这边不在赘述, 可以参考 AOP与动态代理 本文主要介绍Spring中AOP的应用. 切入点: 具体实现类的方法 连接点: 接口中的方法 Advice 前置MethodBeforeAdvice 后置AfterReturnAdvice 环绕MethodInterceptor ThrowsAdvice 1 public class MyServiceBeforeAdvice implements MethodBeforeAdvice{ 2 @Ov
一个线程在Serivcie时Select时选择的是从库,DynamicDataSourceHolder中ThreadLocal对应线程存储的是slave,然后调用Manager时进入事务,事务使用默认的transacatinManager关联的dataSource,而此时会不会获取到的是slave?
在上篇中,我们从写死代码,到使用代理;从编程式 Spring AOP 到声明式 Spring AOP。一切都朝着简单实用主义的方向在发展。沿着 Spring AOP 的方向,Rod Johnson(老罗)花了不少心思,都是为了让我们使用 Spring 框架时不会感受到麻烦,但事实却并非如此。那么,后来老罗究竟对 Spring AOP 做了哪些改进呢?
Spring-AOP 自动创建代理之BeanNameAutoProxyCreator
InitializingBean 作用和特点 Bean属性都设置完毕后调用afterPropertiesSet()方法做一些初始化的工作 例子 dubbo的ServiceBean暴露服务(export) DisposableBean 作用和特点 Bean生命周期结束前调用destory()方法做一些收尾工作 例子 dubbo的ServiceBean注销服务(unexport) BeanNameAware、ApplicationContextAware和BeanFactoryAware
为了使JDBC更加易于使用,Spring 在 JDBC API 上定义了一个抽象层,以此建立一个 JDBC 存取框架
Spring 框架已经实现了很多BeanPostProcessor的类,如下是关于BeanPostProcessor 的类图,图片过大,可以下载资源包看。
疫情期间在家重新读了《Spring in Action》,每次翻阅总有一些收获,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识简要总结梳理一下
之所以写这么一篇文章主要是因为下篇文章将结束Spring启动整个流程的分析,从解析配置到创建对象再到属性注入最后再将创建好的对象初始化成为一个真正意义上的Bean。因为下篇文章会涉及到AOP,所以提前单独将AOP的相关API及源码做一次解读,这样可以降低阅读源码的障碍,话不多说,我们进入正文!
《如何优雅地记录操作日志》是美团技术团队2021年最受欢迎的一篇技术文章,文章很有深度,强烈建议大家去品读一番。
为什么要整合Hibernate? 1、使用Spring的IOC功能管理SessionFactory对象 LocalSessionFactoryBean 2、使用Spring管理Session对象 HibernateTemplate 3、使用Spring的功能实现声明式的事务管理
3. AnnotationAwareAspectJAutoProxyCreator 类
spring配置文件是用于指导Spring工厂进行Bean生产、依赖关系注入(装配)及Bean实例分发的"图纸"。Java EE程序员必须学会并灵活应用这份"图纸"准确地表达自己的"生产意图"。Spring配置文件是一个或多个标准的XML文档,applicationContext.xml是Spring的默认配置文件,当容器启动时找不到指定的配置文档时,将会尝试加载这个默认的配置文件。 下面列举的是一份比较完整的配置文件模板,文档中各XML标签节点的基本用途也给出了详细的解释,这些
前言: 前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各
在互联网行业,缓存作为一种家喻户晓的技术,在各个系统中起着提效降压的作用。但是缓存的引入,也使得处理逻辑变得复杂,尤其在当下微服务大行其道,一个大型系统动辄十几个模块,多人共同开发、维护的情况下,不同开发人员的缓存设计都不尽相同,并且多与业务代码紧密耦合。在这个背景下,本文着重思考一种统一的方案,借鉴面向切面的编程思想(AOP),实现面向切面的缓存设计,将系统中的缓存设计与主业务逻辑剥离开来。
面向切面的编程,或AOP,是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。
Spring事务管理 Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作。今天一起学习一下Spring的事务管理。Spring的事务管理分为声明式跟编程式。声明式就是在Spring的配置文件中进行相关配置;编程式就是用注解的方式写到代码里。下面先说声明式: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、 TransactionM
上一篇《学习AOP之认识一下SpringAOP》中大体的了解了代理、动态代理及SpringAop的知识。因为写的篇幅长了点所以还是再写一篇吧。接下来开始深入一点Spring aop的一些实现机制。 上篇中最后有那段代码使用了一个ProxyFactory类来完成代理的工作,从而实现了Aop的Around Advice,代码如下: package aop.demo; import org.springframework.aop.framework.ProxyFactory; public class Cli
Spring的两大核心:IoC和AOP,IoC作为Spring的根基,通过大量的扩展点让系统轻而易举的就可以实现良好的扩展性,而AOP和IoC结合在一起,类似于发生强大化学反应一样,将Spring的功能性又提高了一个层次。Spring中也有大量使用AOP场景,比如@Configuration、数据库事务、mybatis mapper接口注入等等。
评价一个框架是否是优秀的,其中必有一点是该框架是否留足了可扩展的接口。我们在实际做项目中很多情况下就是基于某某框架,然后在这个框架留出的扩展接口上进行业务开发,所以很有必要对这些框架留出了哪些扩展点,这些扩展点是干啥用的有个心知肚明的了解。本文针对作者项目中用到的tomcat,spring扩展点进行记录,作为记录笔记,以便查找。
AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。
松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程
今日内容 AOP的概述 AOP 的底层实现 Spring 的AOP 使用AspectJ 实现AOP Spring JdbcTemplate 使用 1.2 Spring整合WEB项目. 1.2.1 Sp
基于Java的配置,允许你在少量的Java注解的帮助下,进行你的大部分Spring配置而非通过XML文件。
根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下: 第一种方式:每个Bean都有一个代理 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop
②声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。 Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、 TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibern
前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。 总结如下: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hi
事务,是一组严密的操作集合,这一组操作要么全部成功,要么全部失败回滚。Spring事务管理基于底层数据库本身的事务处理机制。数据库事务的基础,是掌握Spring事务管理的基础。这篇总结下Spring事务。
前言 上一篇已经讲解了Spring IOC知识点一网打尽!,这篇主要是讲解Spring的AOP模块~ 之前我已经写过一篇关于AOP的文章了,那篇把比较重要的知识点都讲解过了一篇啦:Spring【AOP模块】就这么简单,很荣幸被开源中国推荐过~~ 如果没有AOP的基础,建议先看看上面那篇文章~ 如果没有代理模式基础,建议先看看:给女朋友讲解什么是代理模式这篇文章 如果都看过了,这篇就放心食用吧! 这篇文章主要是补充和强化一些比较重要的知识点,并会把上面的两本书关于AOP的知识点整理出来并画成一个思维导图来全
Spring AOP作为整个Spring体系最最重要的分支之一,若干技术都是基于它的(比如事务、异步、缓存等)
前言 AOP(Aspect Oriented Programming)面向切面编程是 Spring 框架最核心的组件之一,它通过对程序结构的另一种考虑,补充了 OOP(Object-Oriented Programming)面向对象编程。在 OOP 中模块化的关键单元是类,而在 AOP 中,模块化单元是切面。也就是说 AOP 关注的不再是类,而是一系列类里面需要共同能力的行为。 本文内容主要包括: 讲解 OOP 与 AOP 的简单对比,以及 AOP 的基础名词,比如面试中经常会被问到的 point cut
领取专属 10元无门槛券
手把手带您无忧上云