1.Go能实现AOP吗?
2.面试官:你讲讲AOP与OOP有什么区别?
3.IOCåAOPçåºå«ï¼
4.springâAOPä¸äºå¡
5.OOPä¸AOPçåºå«åèç³»
Go能实现AOP吗?
探索 Go 语言是码分否能实现面向切面编程(AOP)的概念,本文将从 Java 实现 AOP 的码分方式出发,深入讨论 Go 语言的码分特性与 AOP 实现的可能性。Java 中的码分 AOP 通过动态代理和字节码增强技术实现,但在 Go 语言中,码分由于没有虚拟机和中间码的码分全网轰炸源码特性,直接源码编译为可执行文件,码分使得代码修改变得困难。码分
然而,码分经过深入研究,码分发现 Go 语言中存在实现类似 AOP 功能的码分库,如 gohook,码分它能够在方法执行前插入逻辑,码分通过反射技术找到方法地址,码分动态地hook方法。码分尽管这种方式实现了一定程度的运行时拦截,但其存在使用限制和未充分测试的问题,不建议在生产环境中使用。
另一种实现 AOP 的方式是通过抽象语法树(AST)修改源码。Go 语言在编译时会生成 AST 树,可以利用 Go 提供的图像建模源码 API 来生成和操作 AST。通过修改 AST,可以实现 AOP 的功能,例如在方法执行前插入打印语句,或根据注释自动插入代码。尽管这种方式需要在编译期对代码进行生成,但可以提供更灵活的 AOP 实现。
在讨论实现细节的同时,我们也关注到 Go 语言的年轻性与项目阶段。由于 Go 语言相对较新,大多数项目在构建初期,veth源码详解需求通常已在代码中提前设计,减少了对 AOP 这类复杂技术的依赖。不过,随着 Go 社区的发展和项目复杂度的提高,未来出现一个生产可用的 Go AOP 框架并非不可想象。
总结而言,尽管 Go 语言在实现 AOP 方面面临一定的技术挑战,通过利用运行时拦截和 AST 修改等技术手段,已经能够实现部分 AOP 的功能。但当前 Go 社区对 AOP 的代理下单源码需求相对有限,更多的项目倾向于在设计阶段解决相关需求。随着 Go 应用场景的扩展和项目复杂性的增加,AOP 技术在 Go 语言中的应用可能会逐渐增多。
面试官:你讲讲AOP与OOP有什么区别?
AOP全称为Aspect Oriented Programming,是一种面向切面编程的模式。它与传统的面向对象编程(OOP)有本质的区别。OOP主要关注的是对象的行为和属性,通过封装、继承和多态等特性来实现代码的复用和模块化。而AOP则更侧重于关注点的没有字体源码分离,它可以将一些横跨业务逻辑的公共行为或职责抽取出来,形成独立的模块,从而降低代码的耦合度,提高代码的可维护性和可扩展性。
AOP的核心思想是将业务逻辑中的横切关注点(如日志记录、性能监控、事务管理等)从核心业务代码中分离出来,通过预编译或运行时动态代理的方式进行统一管理和维护。这使得在修改或扩展业务逻辑时,不必修改原有代码,只需要在AOP的配置中添加或修改切点即可。这种分离关注点的设计模式有助于提高开发效率,降低维护成本。
AOP的应用场景通常包括但不限于日志记录、性能统计、安全控制、事务处理、异常处理等。例如,在一个APP模块结构中,按照OOP思想划分的“视图交互”、“业务逻辑”、“网络”等模块,若需要对所有模块的每个方法的执行时间进行监控,这正是AOP的典型应用场景。通过AOP,可以将监控逻辑与业务逻辑分离,无需在每个方法中重复实现监控代码,从而简化了代码结构,提高了代码的可维护性。
AOP的实现方式主要有运行时、加载时和编译时三种,其中编译时实现(如AspectJ)是AOP技术中最常用的一种,它通过在编译阶段将切面代码编织到目标代码中,实现了对目标代码的动态增强。
AspectJ是Java中的AOP实现,它包含两个核心组件:ajc编译器和weaver织入器。ajc编译器用于编译AspectJ的源代码,weaver则在编译或运行时将切面代码编织到目标代码中。在Android项目中使用AspectJ时,可以借助gradle插件来简化配置和集成过程。
总之,AOP提供了一种更为灵活、高效的方式来管理程序中的关注点,与OOP相比,它更加专注于解耦和提高代码的可维护性。在实际开发中,合理运用AOP可以显著提升软件开发的效率和质量。
IOCåAOPçåºå«ï¼
ä»ä¹æ¯IoC
IocâInversion of Controlï¼å³âæ§å¶å转âï¼ä¸æ¯ä»ä¹ææ¯ï¼èæ¯ä¸ç§è®¾è®¡ææ³ãå¨Javaå¼åä¸ï¼Iocæå³çå°ä½ 设计好ç对象交ç»å®¹å¨æ§å¶ï¼èä¸æ¯ä¼ ç»çå¨ä½ ç对象å é¨ç´æ¥æ§å¶ãå¦ä½ç解好Iocå¢ï¼ç解好Iocçå ³é®æ¯è¦æç¡®âè°æ§å¶è°ï¼æ§å¶ä»ä¹ï¼ä¸ºä½æ¯å转ï¼æå转就åºè¯¥ææ£è½¬äºï¼ï¼åªäºæ¹é¢å转äºâï¼é£æ们æ¥æ·±å ¥åæä¸ä¸ï¼
æ§å¶æ¯ä»ä¹ï¼ä¼ ç»Java SEç¨åºè®¾è®¡ï¼æ们ç´æ¥å¨å¯¹è±¡å é¨éè¿newè¿è¡å建对象ï¼æ¯ç¨åºä¸»å¨å»å建ä¾èµå¯¹è±¡ï¼èIoCæ¯æä¸é¨ä¸ä¸ªå®¹å¨æ¥å建è¿äºå¯¹è±¡ï¼å³ç±Ioc容å¨æ¥æ§å¶å¯¹è±¡çå建ï¼è°æ§å¶è°ï¼å½ç¶æ¯IoC 容å¨æ§å¶äºå¯¹è±¡ï¼æ§å¶ä»ä¹ï¼é£å°±æ¯ä¸»è¦æ§å¶äºå¤é¨èµæºè·åï¼ä¸åªæ¯å¯¹è±¡å æ¬æ¯å¦æ件çï¼ã
为ä½æ¯å转ï¼åªäºæ¹é¢å转äºï¼æå转就ææ£è½¬ï¼ä¼ ç»åºç¨ç¨åºæ¯ç±æ们èªå·±å¨å¯¹è±¡ä¸ä¸»å¨æ§å¶å»ç´æ¥è·åä¾èµå¯¹è±¡ï¼ä¹å°±æ¯æ£è½¬ï¼èå转åæ¯ç±å®¹å¨æ¥å¸®å¿å建åæ³¨å ¥ä¾èµå¯¹è±¡ï¼ä¸ºä½æ¯å转ï¼å 为ç±å®¹å¨å¸®æ们æ¥æ¾åæ³¨å ¥ä¾èµå¯¹è±¡ï¼å¯¹è±¡åªæ¯è¢«å¨çæ¥åä¾èµå¯¹è±¡ï¼æ以æ¯å转ï¼åªäºæ¹é¢å转äºï¼ä¾èµå¯¹è±¡çè·å被å转äºã
IoCè½åä»ä¹
IoCä¸æ¯ä¸ç§ææ¯ï¼åªæ¯ä¸ç§ææ³ï¼ä¸ä¸ªéè¦çé¢å对象ç¼ç¨çæ³åï¼å®è½æ导æ们å¦ä½è®¾è®¡åºæ¾è¦åãæ´ä¼è¯çç¨åºãä¼ ç»åºç¨ç¨åºé½æ¯ç±æ们å¨ç±»å é¨ä¸»å¨å建ä¾èµå¯¹è±¡ï¼ä»è导è´ç±»ä¸ç±»ä¹é´é«è¦åï¼é¾äºæµè¯ï¼æäºIoC容å¨åï¼æå建åæ¥æ¾ä¾èµå¯¹è±¡çæ§å¶æ交ç»äºå®¹å¨ï¼ç±å®¹å¨è¿è¡æ³¨å ¥ç»å对象ï¼æ以对象ä¸å¯¹è±¡ä¹é´æ¯æ¾æ£è¦åï¼è¿æ ·ä¹æ¹ä¾¿æµè¯ï¼å©äºåè½å¤ç¨ï¼æ´éè¦çæ¯ä½¿å¾ç¨åºçæ´ä¸ªä½ç³»ç»æåå¾é常çµæ´»ã
å ¶å®IoC对ç¼ç¨å¸¦æ¥çæ大æ¹åä¸æ¯ä»ä»£ç ä¸ï¼èæ¯ä»ææ³ä¸ï¼åçäºâ主ä»æ¢ä½âçååãåºç¨ç¨åºåæ¬æ¯è大ï¼è¦è·åä»ä¹èµæºé½æ¯ä¸»å¨åºå»ï¼ä½æ¯å¨IoC/DIææ³ä¸ï¼åºç¨ç¨åºå°±åæ被å¨çäºï¼è¢«å¨ççå¾ IoC容å¨æ¥åå»ºå¹¶æ³¨å ¥å®æéè¦çèµæºäºã
IoCåDI
DIâDependency Injectionï¼å³âä¾èµæ³¨å ¥âï¼æ¯ç»ä»¶ä¹é´ä¾èµå ³ç³»ç±å®¹å¨å¨è¿è¡æå³å®ï¼å½¢è±¡ç说ï¼å³ç±å®¹å¨å¨æçå°æ个ä¾èµå ³ç³»æ³¨å ¥å°ç»ä»¶ä¹ä¸ãä¾èµæ³¨å ¥çç®ç并é为软件系ç»å¸¦æ¥æ´å¤åè½ï¼èæ¯ä¸ºäºæåç»ä»¶éç¨çé¢çï¼å¹¶ä¸ºç³»ç»æ建ä¸ä¸ªçµæ´»ãå¯æ©å±çå¹³å°ãéè¿ä¾èµæ³¨å ¥æºå¶ï¼æ们åªéè¦éè¿ç®åçé ç½®ï¼èæ éä»»ä½ä»£ç å°±å¯æå®ç®æ éè¦çèµæºï¼å®æèªèº«çä¸å¡é»è¾ï¼èä¸éè¦å ³å¿å ·ä½çèµæºæ¥èªä½å¤ï¼ç±è°å®ç°ã
注ï¼å¦ææ³è¦æ´å æ·±å ¥çäºè§£IoCåDIï¼è¯·åè大å¸çº§äººç©Martin Fowlerçä¸ç¯ç»å ¸æç« ãInversion of Control Containers and the Dependency Injection patternãï¼åæå°åï¼/articles/injection.htmlã
AOPï¼é¢ååé¢ç¼ç¨
ä»ä¹æ¯AOPï¼
æ¦å¿µï¼å¨è½¯ä»¶ä¸ï¼AOP为Aspect Oriented Programmingç缩åï¼æ为ï¼é¢ååé¢ç¼ç¨ï¼éè¿é¢ç¼è¯æ¹å¼åè¿è¡æå¨æ代çå®ç°ç¨åºåè½çç»ä¸ç»´æ¤çä¸ç§ææ¯ãAOPæ¯OOPç延ç»ï¼æ¯è½¯ä»¶å¼åä¸çä¸ä¸ªçç¹ï¼ä¹æ¯Springæ¡æ¶ä¸çä¸ä¸ªéè¦å 容ï¼æ¯å½æ°å¼ç¼ç¨çä¸ç§è¡çèåãå©ç¨AOPå¯ä»¥å¯¹ä¸å¡é»è¾çå个é¨åè¿è¡é离ï¼ä»è使å¾ä¸å¡é»è¾åé¨åä¹é´çè¦å度éä½ï¼æé«ç¨åºçå¯éç¨æ§ï¼åæ¶æé«äºå¼åçæçãï¼ç¾åº¦ç¾ç§ï¼
ç®åç说ï¼å°±æ¯å°ç¨åºä¸éå¤ç代ç æ½ååºæ¥ï¼å¨éè¦æ§è¡çæ¶åï¼ä½¿ç¨å¨æ代ççææ¯ï¼å¨ä¸ä¿®æ¹æºç çåºç¡ä¸ï¼å¯¹æ们çå·²ææ¹æ³è¿è¡å¢å¼ºã
AOPçä½ç¨åä¼å¿ï¼
ä½ç¨ï¼ä»å®ä¹ä¸æ¥çï¼å°±æ¯ä¸ºäºå¨ç¨åºè¿è¡æé´ï¼ä¸ä¿®æ¹æºç 对已ææ¹æ³è¿è¡å¢å¼ºã
ä¼å¿ï¼åå°éå¤ä»£ç æ交äºå¼åæç ç»´æ¤æ¹ä¾¿
å®ç°æ¹å¼ï¼ å°±æ¯å¨æ代ççææ¯
å ·ä½çä½ç¨ï¼å®ç°äºå¡çæ§å¶ æ¥å¿ å å®å ¨æ¨¡å
æ³ç³»ç»çå¦ä¹ ç¼ç¨å¯ä»¥æ¥æè¿ççï¼å¸æ对æ¨ææ帮å©ï¼~
springâAOPä¸äºå¡
title: springââAOPä¸äºå¡.mddate: -- ::
categories: [Spring]
tags: [AOP,äºå¡]
toc: true
å ååºæºç ä¸æ¯è¾éç¹çå 个类ï¼
1ã<aop:before method="before" pointcut-ref="myMethods"/>å è£ æä¸ä¸ªadvisor
2ãAspectJAwareAdvisorAutoProxyCreatorï¼å½å®ä¾åææbeané½ä¼æ§è¡å°AspectJAwareAdvisorAutoProxyCreatorç±»
å®ä¼æ£æµbeanæ¯å¦advisor以åadviceåå¨ï¼å¦ææ就说æè¿ä¸ªbeanæåé¢ï¼æåé¢é£ä¹å°±ä¼çæ代ç
3ãjdkç代çï¼beanéé¢çææadvisorå å ¥å°proxyFactoryã
4ãjdkDynamicProxy invokeï¼æ¿å°beanéé¢çææInterceptorï¼ä¼å¾ªç¯proxyFactoryéé¢çææadvisor
éé¢æadviceï¼éé¢çadviceæ两ç§ç±»åï¼è¦ä¹æ¯adviceï¼è¦ä¹æ¯MethodInterceptorç±»åç
5ãå½ä»£ç对象è°ç¨æ¹å¼ï¼æ¯ä¸ä¸ªMethodInterceptorç±»åçç±»çé¾å¼è°ç¨è¿ç¨ï¼ç´å°å®¹å¨ç大å°åç´¢å¼ä¸è´çæ¶åè°ç¨JoinPointç®æ æ¹æ³
beforeï¼this.advice.before(),invocation.processd();
è£ é åæ°ï¼åé¢éé¢beforeæ¹æ³çmethod对象ï¼method.getParamterTypes()[0]
æç»ä¼æadviceå°è£ æMethodInterceptorç±»åç对象
ç¨åºæ§è¡çæ个ç¹å®ä½ç½®ï¼å¦ç±»å¼å§åå§ååãç±»åå§ååãç±»æ个æ¹æ³è°ç¨åãè°ç¨åãæ¹æ³æåºå¼å¸¸åãä¸ä¸ªç±»æä¸æ®µç¨åºä»£ç æ¥æä¸äºå ·æè¾¹çæ§è´¨çç¹å®ç¹ï¼è¿äºç¹ä¸çç¹å®ç¹å°±ç§°ä¸ºâè¿æ¥ç¹âãSpringä» æ¯ææ¹æ³çè¿æ¥ç¹ï¼å³ä» è½å¨æ¹æ³è°ç¨åãæ¹æ³è°ç¨åãæ¹æ³æåºå¼å¸¸æ¶ä»¥åæ¹æ³è°ç¨ååè¿äºç¨åºæ§è¡ç¹ç»å ¥å¢å¼ºãè¿æ¥ç¹ç±ä¸¤ä¸ªä¿¡æ¯ç¡®å®ï¼ç¬¬ä¸æ¯ç¨æ¹æ³è¡¨ç¤ºçç¨åºæ§è¡ç¹ï¼ç¬¬äºæ¯ç¨ç¸å¯¹ç¹è¡¨ç¤ºçæ¹ä½ã
æ¯ä¸ªç¨åºç±»é½æ¥æå¤ä¸ªè¿æ¥ç¹ï¼å¦ä¸ä¸ªæ¥æ两个æ¹æ³çç±»ï¼è¿ä¸¤ä¸ªæ¹æ³é½æ¯è¿æ¥ç¹ï¼å³è¿æ¥ç¹æ¯ç¨åºç±»ä¸å®¢è§åå¨çäºç©ãAOPéè¿âåç¹âå®ä½ç¹å®çè¿æ¥ç¹ãè¿æ¥ç¹ç¸å½äºæ°æ®åºä¸çè®°å½ï¼èåç¹ç¸å½äºæ¥è¯¢æ¡ä»¶ãåç¹åè¿æ¥ç¹ä¸æ¯ä¸å¯¹ä¸çå ³ç³»ï¼ä¸ä¸ªåç¹å¯ä»¥å¹é å¤ä¸ªè¿æ¥ç¹ãå¨Springä¸ï¼åç¹éè¿org.springframework.aop.Pointcutæ¥å£è¿è¡æè¿°ï¼å®ä½¿ç¨ç±»åæ¹æ³ä½ä¸ºè¿æ¥ç¹çæ¥è¯¢æ¡ä»¶ï¼Spring AOPçè§å解æå¼æè´è´£åç¹æ设å®çæ¥è¯¢æ¡ä»¶ï¼æ¾å°å¯¹åºçè¿æ¥ç¹ãå ¶å®ç¡®åå°è¯´ï¼ä¸è½ç§°ä¹ä¸ºæ¥è¯¢è¿æ¥ç¹ï¼å 为è¿æ¥ç¹æ¯æ¹æ³æ§è¡åãæ§è¡åçå æ¬æ¹ä½ä¿¡æ¯çå ·ä½ç¨åºæ§è¡ç¹ï¼èåç¹åªå®ä½å°æ个æ¹æ³ä¸ï¼æ以å¦æå¸æå®ä½å°å ·ä½è¿æ¥ç¹ä¸ï¼è¿éè¦æä¾æ¹ä½ä¿¡æ¯ã
å¢å¼ºæ¯ç»å ¥å°ç®æ ç±»è¿æ¥ç¹ä¸çä¸æ®µç¨åºä»£ç ï¼å¨Springä¸ï¼å¢å¼ºé¤ç¨äºæè¿°ä¸æ®µç¨åºä»£ç å¤ï¼è¿æ¥æå¦ä¸ä¸ªåè¿æ¥ç¹ç¸å ³çä¿¡æ¯ï¼è¿ä¾¿æ¯æ§è¡ç¹çæ¹ä½ãç»åæ§è¡ç¹æ¹ä½ä¿¡æ¯ååç¹ä¿¡æ¯ï¼æ们就å¯ä»¥æ¾å°ç¹å®çè¿æ¥ç¹ã
å¢å¼ºé»è¾çç»å ¥ç®æ ç±»ãå¦æ没æAOPï¼ç®æ ä¸å¡ç±»éè¦èªå·±å®ç°ææé»è¾ï¼èå¨AOPç帮å©ä¸ï¼ç®æ ä¸å¡ç±»åªå®ç°é£äºé横åé»è¾çç¨åºé»è¾ï¼èæ§è½çè§åäºå¡ç®¡ççè¿äºæ¨ªåé»è¾åå¯ä»¥ä½¿ç¨AOPå¨æç»å ¥å°ç¹å®çè¿æ¥ç¹ä¸ã
å¼ä»æ¯ä¸ç§ç¹æ®çå¢å¼ºï¼å®ä¸ºç±»æ·»å ä¸äºå±æ§åæ¹æ³ãè¿æ ·ï¼å³ä½¿ä¸ä¸ªä¸å¡ç±»åæ¬æ²¡æå®ç°æ个æ¥å£ï¼éè¿AOPçå¼ä»åè½ï¼æ们å¯ä»¥å¨æå°ä¸ºè¯¥ä¸å¡ç±»æ·»å æ¥å£çå®ç°é»è¾ï¼è®©ä¸å¡ç±»æ为è¿ä¸ªæ¥å£çå®ç°ç±»ã
ç»å ¥æ¯å°å¢å¼ºæ·»å 对ç®æ ç±»å ·ä½è¿æ¥ç¹ä¸çè¿ç¨ãAOPåä¸å°ç»å¸æºï¼å°ç®æ ç±»ãå¢å¼ºæå¼ä»éè¿AOPè¿å°ç»å¸æºå¤©è¡£æ ç¼å°ç¼ç»å°ä¸èµ·ãæ ¹æ®ä¸åçå®ç°ææ¯ï¼AOPæä¸ç§ç»å ¥çæ¹å¼ï¼
aãç¼è¯æç»å ¥ï¼è¿è¦æ±ä½¿ç¨ç¹æ®çJavaç¼è¯å¨ã
bãç±»è£ è½½æç»å ¥ï¼è¿è¦æ±ä½¿ç¨ç¹æ®çç±»è£ è½½å¨ã
cãå¨æ代çç»å ¥ï¼å¨è¿è¡æ为ç®æ 类添å å¢å¼ºçæåç±»çæ¹å¼ã
Springéç¨å¨æ代çç»å ¥ï¼èAspectJéç¨ç¼è¯æç»å ¥åç±»è£ è½½æç»å ¥ã
ä¸ä¸ªç±»è¢«AOPç»å ¥å¢å¼ºåï¼å°±äº§åºäºä¸ä¸ªç»æç±»ï¼å®æ¯èåäºåç±»åå¢å¼ºé»è¾ç代çç±»ãæ ¹æ®ä¸åç代çæ¹å¼ï¼ä»£çç±»æ¢å¯è½æ¯ååç±»å ·æç¸åæ¥å£çç±»ï¼ä¹å¯è½å°±æ¯åç±»çåç±»ï¼æ以æ们å¯ä»¥éç¨è°ç¨åç±»ç¸åçæ¹å¼è°ç¨ä»£çç±»ã
åé¢ç±åç¹åå¢å¼ºï¼å¼ä»ï¼ç»æï¼å®æ¢å æ¬äºæ¨ªåé»è¾çå®ä¹ï¼ä¹å æ¬äºè¿æ¥ç¹çå®ä¹ï¼Spring AOPå°±æ¯è´è´£å®æ½åé¢çæ¡æ¶ï¼å®å°åé¢æå®ä¹ç横åé»è¾ç»å ¥å°åé¢ææå®çè¿æ¥ç¹ä¸ã
advisorï¼ pointCut advice
ä¸ç±»åè½çå¢å¼º
aroundæ¹æ³éé¢ä»£ç åé¢
äºå¡åé¢
ç¼ååé¢
æ¥å¿åé¢
äºå¡ï¼Transactionï¼ï¼ä¸è¬æ¯æè¦åçææåçäºæ ãå¨è®¡ç®æºæ¯è¯ä¸æ¯æ访é®å¹¶å¯è½æ´æ°æ°æ®åºä¸åç§æ°æ®é¡¹çä¸ä¸ªç¨åºæ§è¡åå (unit)ãæ¯æ°æ®åºæä½çæå°å·¥ä½åå ï¼æ¯ä½ä¸ºå个é»è¾å·¥ä½åå æ§è¡çä¸ç³»åæä½ï¼è¿äºæä½ä½ä¸ºä¸ä¸ªæ´ä½ä¸èµ·åç³»ç»æ交ï¼è¦ä¹é½æ§è¡ãè¦ä¹é½ä¸æ§è¡ï¼äºå¡æ¯ä¸ç»ä¸å¯ååå²çæä½éåï¼å·¥ä½é»è¾åå ï¼ã
大è´æµç¨å½¢å¦
æ°æ®åºäºå¡æ¥æå 大ç¹æ§ï¼
äºå¡çå大ç¹æ§ï¼
äºå¡æ¯æ°æ®åºçé»è¾å·¥ä½åä½ï¼äºå¡ä¸å å«çåæä½è¦ä¹é½åï¼è¦ä¹é½ä¸å
äº å¡æ§è¡çç»æå¿ é¡»æ¯ä½¿æ°æ®åºä»ä¸ä¸ªä¸è´æ§ç¶æåå°å¦ä¸ä¸ªä¸è´æ§ç¶æãå æ¤å½æ°æ®åºåªå å«æåäºå¡æ交çç»ææ¶ï¼å°±è¯´æ°æ®åºå¤äºä¸è´æ§ç¶æãå¦ææ°æ®åºç³»ç» è¿è¡ä¸åçæ éï¼æäºäºå¡å°æªå®æ就被迫ä¸æï¼è¿äºæªå®æäºå¡å¯¹æ°æ®åºæåçä¿®æ¹æä¸é¨åå·²åå ¥ç©çæ°æ®åºï¼è¿æ¶æ°æ®åºå°±å¤äºä¸ç§ä¸æ£ç¡®çç¶æï¼æè è¯´æ¯ ä¸ä¸è´çç¶æã
ä¸ä¸ªäºå¡çæ§è¡ä¸è½å ¶å®äºå¡å¹²æ°ãå³ä¸ä¸ªäºå¡å é¨çæä½å使ç¨çæ°æ®å¯¹å ¶å®å¹¶åäºå¡æ¯é离çï¼å¹¶åæ§è¡çå个äºå¡ä¹é´ä¸è½äºç¸å¹²æ°ã
ä¹ç§°æ°¸ä¹ æ§ï¼æä¸ä¸ªäºå¡ä¸æ¦æ交ï¼å®å¯¹æ°æ®åºä¸çæ°æ®çæ¹åå°±åºè¯¥æ¯æ°¸ä¹ æ§çãæ¥ä¸æ¥çå ¶å®æä½ææ éä¸åºè¯¥å¯¹å ¶æ§è¡ç»ææä»»ä½å½±åã
个人ç解ï¼äºå¡å¨Springä¸æ¯åå©AOPææ¯æ¥å®ç°çï¼å¯ä»¥ä½ä¸ºAOPä¸çä¸ä¸ªäºå¡åé¢ãspringæºç 对äºå¡çå¤çé»è¾ï¼èªå·±ç 究å§ï¼
ORMæ¡æ¶ä¸ä»¥Mybatis为ä¾ï¼äºå¡å¤çå°±æ¯ç¨å°äºä¸ä¸ªç±»Transactionï¼é¨åæºç å¦ä¸
å¯ä»¥çåºTransaction管ççå°±æ¯ä¸ä¸ªconnectionï¼èconnectionæ们å¾æ¸ æ¥æ¯ä¸ç¨æ·ä¼è¯æé©çã
é£ä¹å ³ç³»å°±æ¯Transaction 管çConnection ï¼èconnectionä¸ ç¨æ·sessionä¸å¯¹ä¸åå¨ã
å¨springBootä¸ï¼åªéè¦å å ¥POMå°±å¯ä»¥äºï¼é å注解使ç¨å³å¯ã
æ¥ä¸æ¥å°±æ¯äºå¡çæ§å¶äºã
é¦å äºå¡æå å¤§ä¼ æå±æ§ï¼
å ¶ä¸æ常è§çï¼ç¨å¾æå¤å°± PROPAGATION_REQUIREDãPROPAGATION_REQUIRES_NEWã PROPAGATION_NESTED è¿ä¸ç§ãäºå¡çä¼ æå±æ§æ¯ spring ç¹æçï¼æ¯ spring ç¨æ¥æ§å¶æ¹æ³äºå¡çä¸ç§æ段ï¼è¯´ç´ç½ç¹å°±æ¯ç¨æ¥æ§å¶æ¹æ³æ¯å¦ä½¿ç¨åä¸äºå¡çä¸ç§å±æ§ï¼ä»¥åæç §ä»ä¹è§ååæ»çä¸ç§æ段ã
ä¸é¢ç¨ä»£ç æ¼ç¤ºè¿ä¸ç§å±æ§çæºå¶ï¼
äºå¡çé»è®¤å±æ§å°±æ¯requiredï¼éè¿Transactional.javaä¸çPropagation propagation() default Propagation.REQUIRED; å¯ä»¥çåºã
è¿ç§æ åµå°±æ¯äºå¡1ï¼äºå¡2 é½å å ¥å°äºäºå¡0ä¸ãä¸ç®¡æ¯1ï¼2åªä¸ªäºå¡æåºå¼å¸¸ï¼äºå¡0é½ä¼åæ»ãæ°æ®æ·»å ä¼å¤±è´¥ã
è¿ç§æ åµå°±æ¯ï¼
äºå¡0ï¼requiredï¼ {
äºå¡1 ï¼REQUIRES_NEWï¼
äºå¡2
}
æ¤æ¶ã
æ åµaï¼
1ãå¦æåªæ¯äºå¡2åºç°äºå¼å¸¸ï¼é£ä¹äºå¡1ä¼æ交ï¼äºå¡2å å ¥å°äºå¡0ä¸ä¼åæ»ã
2ãå¦æåªæ¯äºå¡1åºç°äºå¼å¸¸ï¼é£ä¹äºå¡1ä¼åæ»ï¼åä¸å±äºå¡0æå¼å¸¸ï¼äºå¡2ä¼å å ¥å°äºå¡0ä¸ï¼è¿æ¶é½ä¼åæ»ã
æ åµbï¼
å¦æäºå¡1ï¼äºå¡2é½æ¯REQUIRES_NEWä¼ æå±æ§ãé£ä¹ç»æå°±æ¯ï¼
1ãå¦æäºå¡1ï¼æåºäºå¼å¸¸ï¼é£ä¹äºå¡2æ¯ä¸ä¼æ§è¡çï¼é£ä¹äºå¡0å¿ ç¶åæ»ã
2ãå¦æäºå¡2ï¼æåºå¼å¸¸ï¼é£ä¹äºå¡1ä¼æ交ï¼è¡¨ä¸ä¼ææ°æ®ãäºå¡2æå¼å¸¸åæ»å¹¶æåºï¼äºå¡0åæ»ã
NESTEDå±æ§å ¶å®å°±æ¯å建äºåæ»ç¹ï¼æå¼å¸¸æ¶ï¼ä¼åæ»å°æå®çåæ»ç¹ã
å¨è¿éè¿ä»£ç æµè¯ï¼åºç°ä¸ç§æ åµæ¯ï¼æ 论äºå¡1ï¼äºå¡2åªä¸ªæå¼å¸¸ï¼æ°æ®é½ä¸ä¼æå ¥æåï¼åå æ¯ï¼ä¸è®ºæ¯äºå¡1è¿æ¯äºå¡2é½ä¼åäºå¡0æåºå¼å¸¸ï¼äºå¡0æè·å°å¼å¸¸åï¼æ§è¡rollback()æ¹æ³ï¼è¿å°±æä½æäºï¼äºå¡çå ¨é¨åæ»ã
å¦ææ³è¦äºå¡1åäºå¡2 æ³è¦æ ¹æ®èªå·±çåæ»ç¹åæ»ï¼é£ä¹äºå¡0å¿ é¡»èªå·±å¤çå¼å¸¸ï¼ä¸è®©springæè·å°è¿ä¸ªå¼å¸¸ï¼é£ä¹å°±æ»¡è¶³äºãæ代ç æ¹æè¿ç§ï¼
Jack大佬æä¾äºï¼ä¼ªä»£ç åææ³ã
æç §Springæºç çäºå¡å¤çé»è¾ï¼ä¼ªä»£ç 大è´ä¸ºï¼
OOPä¸AOPçåºå«åèç³»
AOP--Aspect Oriented Programming,é¢åæ¹é¢ç¼ç¨,ä»åé¢æ¥çåé¢å对象ç¼ç¨çåºå«ä¸å¤§.ç¶è2è å¨è®¾è®¡ææ³ä¸è¿æ¯æå¾å¤§çä¸å. AOPåéä¸å¡å¤çè¿ç¨çæ个æ¥éª¤æé¶æ®µ,强è°éä½æ¨¡åä¹é´çå¶å度,使代ç æ¥ææ´å¥½ç移æ¤æ§. é¢å对象ç¼ç¨(oop)åæ¯å¯¹ä¸å¡åæä¸æ½åçå®ä½è¿è¡æ¹æ³åå±æ§çå°è£ .ä¹å¯ä»¥è¯´AOPæ¯é¢åä¸å¡ä¸çå¨è¯é¢å,OOPé¢ååè¯é¢å. AOPçä¸ä¸ªå¾éè¦çç¹ç¹æ¯æºä»£ç æ å ³æ§,ä¹å°±æ¯è¯´å¦ææ们çç³»ç»ä¸å¼ç¨äºAOPç»ä»¶,å³ä½¿æ们æ该ç»ä»¶å»æ,ç³»ç»ä»£ç ä¹åºè¯¥è½å¤ç¼è¯éè¿.è¦å®ç°è¿ä¸ç¹,å¯ä»¥ä½¿ç¨å¨æproxy模å¼