aspectj

Spring AOP学习笔记05:AOP失效的罪因

廉价感情. 提交于 2020-08-14 03:13:17
  前面的文章中我们介绍了Spring AOP的简单使用,并从源码的角度学习了其底层的实现原理,有了这些基础之后,本文来讨论一下Spring AOP失效的问题,这个问题可能我们在平时工作中或多或少也会碰到。这个话题应该从同一个对象内的嵌套方法调用拦截失效说起。 1. 问题的现象   假设我们有如下对象类定义(同一对象内方法嵌套调用的目标对象示例): public class NestableInvocationDemo { public void method1(){ method2(); System. out .println( " method1 executed! " ); } public void method2(){ System. out .println( " method2 executed! " ); } }   这个类定义中需要我们关注的是它的某个方法会调用同一对象上定义的其他方法。这通常是比较常见的,在NestableInvocationDemo类中,method1()方法调用了同一个对象的method2()方法。   现在,我们要使用Spring AOP拦截该类定义的method1()和method2()方法,比如一个简单的性能检测,我们定义一个Aspect: @Aspect public class PerformanceTraceAspect {

spring 常用注解 原理 逻辑 代码演示

允我心安 提交于 2020-08-13 12:57:38
01 spring 常用注解 原理 逻辑 代码演示 这是自己观看视频的笔记 文章目录 01 spring 常用注解 原理 逻辑 代码演示 一、组件注册 1.1-spring注解驱动开发 1.2-组件注册 @Configuration 1.3-组件注册 Configuration、Bean、ComponentScan(s)、TypeFilter 1.4-组件注册 @Scope 1.5-组件注册@Lazy-bean懒加载 1.6-组件注册 @Conditional 按照条件给容器注入Bean 1.7-组件注册 @Import快速导入 1.7.1-组件注册 @ImportSelector 1.7.2-组件注册 @ImportBeanDefinationRegister 1.8-组件注册 @FactoryBean 二、生命周期 2.1-生命周期 @Bean指定初始化和销毁方法 2.2-生命周期 InitializingBean和DisposableBean 2.3-生命周期 @PostConstruct和@PreDestroy 2.4-生命周期 BeanPostProcessor(后置处理器) 2.4.1-生命周期 BeanPostProcessor原理 2.4.2-生命周期 spring底层对BeanPostProcessor的使用 三、属性赋值 3.1-属性赋值 @Value 3.2

Spring AOP学习笔记01:AOP概述

此生再无相见时 提交于 2020-08-13 06:39:31
1. AOP概述   软件开发一直在寻求更加高效、更易维护甚至更易扩展的方式。为了提高开发效率,我们对开发使用的语言进行抽象,走过了从汇编时代到现在各种高级语言繁盛之时期;为了便于维护和扩展,我们对某些相同的功能进行归类并使之模块化,冲出了最初的"原始部落",走过了从过程化编程到面向对象编程(OOP)的"短暂而漫长"的历程。但不管走过的路有多长,多么坎坷,我们一直没有停止寻找更加完美、更加高效的软件开发方法,过去如此,现在亦然。   当OOP被提出来,以取代过去基于过程化编程的开发方法时,或许那个时代的人都会以为,面向对象编程和面向对象的软件开发就是我们一直追求的那颗能够搞定一切的"银弹"。但不得不承认的是,即使面向对象的软件开发模式,依然不能很好地解决软件开发中的所有问题。   软件开发的目的,最终是为了解决各种需求,包括业务需求和系统需求。使用面向对象方法,我们可以对业务需求等普通关注点进行很好的抽象和封装,并且使之模块化。但对于系统需求(比如日志记录、权限验证、事务管理等)一类的关注点来说,情况却有所不同。   对于业务需求而言,需求与其具体实现之间的关系基本上是一对一的。我们可以在系统中某一个确定的点找到针对这种需求的实现,无论从开发还是维护的角度,都比较方便。比如电商系统中的账户管理模块、订单模块、支付模块等,可以很容易地按照功能划分模块并完成开发。   但是

springboot启动排除package

一世执手 提交于 2020-08-13 05:26:28
根据jar包进行排除过滤 @ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = {"com.sample.*","com.demo.*"})) 根据类进行过滤 @ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {RedissonConfig.class})) @Filters指过滤规则,FilterType指定过滤的规则: FilterType.ANNOTATION:按照注解 FilterType.ASSIGNABLE_TYPE:按照给定的类型 FilterType.ASPECTJ:使用ASPECTJ表达式 FilterType.REGEX:使用正则指定 FilterType.CUSTOM:使用自定义规则 来源: oschina 链接: https://my.oschina.net/uwith/blog/4355690

Spring AOP学习笔记02:如何开启AOP

荒凉一梦 提交于 2020-08-11 20:07:17
   上文 简要总结了一些AOP的基本概念,并在此基础上叙述了Spring AOP的基本原理,并且辅以一个简单例子帮助理解。从本文开始,我们要开始深入到源码层面来一探Spring AOP魔法的原理了。   要使用Spring AOP,第一步是要将这一功能开启,一般有两种方式: 通过xml配置文件的方式; 通过注解的方式; 1. 配置文件开启AOP功能   我们先来看一下配置文件的方式,这个 上文 也提到过,在xml文件中加上对应的标签,而且别忘了加上对应的名称空间(即下面的xmlns:aop。。。): <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns ="http://www.springframework.org/schema/beans" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation ="http://www.springframework.org/schema/beans http: // www.springframework.org/schema/beans/spring-beans-4.0.xsd http:

Spring Aop基于注解的实现

可紊 提交于 2020-08-11 14:52:40
一.AspectOriented Programing,面向切面编程。   AOP主要用于日志记录,性能统计,安全控制(权限控制),事务处理,异常处理等。将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。   Spring AOP织入增强(Advice)的方式有两种 如果连接点实现了接口采用jdk自带的动态代理的形式实现织入,如果连接点没有实现接口则采用动态字节码生成技术(CGLIB)实现织入。 二.AOP常用术语: 连接点(Joinpoint)   增强程序执行的某个特定位置(要在哪个地方做增强操作)。Spring仅支持方法的连接点,既仅能在方法调用前,方法调用后,方法抛出异常时等这些程序执行点进行织入增强。 切点(Pointcut)   切点是一组连接点的集合。AOP通过“切点”定位特定的连接点。通过数据库查询的概念来理解切点和连接点的关系再适合不过了:连接点相当于数据库中的记录,而切点相当于查询条件。 增强(Advice)   增强是织入到目标类连接点上的一段程序代码。表示要在连接点上做的操作。 切面(Aspect)   切面由切点和增强(引介)组成(可以包含多个切点和多个增强),它既包括了横切逻辑的定义,也包括了连接点的定义

Transactional annotation to rollback for every checked exception - with AspectJ

吃可爱长大的小学妹 提交于 2020-08-09 18:28:53
问题 I would like to use @Transactional annotation ( org.springframework.transaction.annotation ) for transactions management. I need the rollback to occur for every exception (not just unchecked exceptions), so I use: @Transactional (rollbackFor = Exception.class) I use AspectJ mode, and it's working fine. The problem is, I don't want the developer to have to add the rollbackFor attribute every time. I found this answer, that suggests to extend the @Transactional annotation, like so: @Target(

Transactional annotation to rollback for every checked exception - with AspectJ

你。 提交于 2020-08-09 18:28:32
问题 I would like to use @Transactional annotation ( org.springframework.transaction.annotation ) for transactions management. I need the rollback to occur for every exception (not just unchecked exceptions), so I use: @Transactional (rollbackFor = Exception.class) I use AspectJ mode, and it's working fine. The problem is, I don't want the developer to have to add the rollbackFor attribute every time. I found this answer, that suggests to extend the @Transactional annotation, like so: @Target(

spring源码解析之AOP原理

雨燕双飞 提交于 2020-08-08 09:38:47
一、准备工作    在这里我先简单记录下如何实现一个aop: AOP:【动态代理】 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式; 1、导入aop模块;Spring AOP:(spring- aspects) 2 、定义一个业务逻辑类(MathCalculator);在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx) 3 、定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知MathCalculator.div运行到哪里然后执行; 通知方法: 前置通知(@Before):logStart:在目标方法(div)运行之前运行 后置通知(@After):logEnd:在目标方法(div)运行结束之后运行(无论方法正常结束还是异常结束) 返回通知(@AfterReturning):logReturn:在目标方法(div)正常返回之后运行 异常通知(@AfterThrowing):logException:在目标方法(div)出现异常以后运行 环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.procced()) 4 、给切面类的目标方法标注何时何地运行(通知注解); 5 、将切面类和业务逻辑类(目标方法所在类)都加入到容器中; 6 、必须告诉Spring哪个类是切面类

Spring系列.事务管理

こ雲淡風輕ζ 提交于 2020-08-06 20:09:41
Spring提供了一致的事务管理抽象。这个抽象是Spring最重要的抽象之一, 它有如下的优点: 为不同的事务API提供一致的编程模型,如JTA、JDBC、Hibernate和MyBatis数据库层 等; 提供比大多数事务API更简单的,易于使用的编程式事务管理API; 完美整合Spring数据访问抽象; 支持Spring声明式事务管理; 这篇博客就来介绍Spring事务管理相关的内容。 事务简介 什么是事务 事务(Transaction)一般是指对数据库的一个或一组操作单元。 事务的作用 1、为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。 2、当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。 当一个事务被提交给了DBMS(数据库管理系统),则DBMS需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态(要么全执行,要么全都不执行);同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。 事务的特点 事务具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。 原子性(Atomicity):事务作为一个整体被执行