aspectj

解决并发问题,数据库常用的两把锁!

旧城冷巷雨未停 提交于 2020-08-18 20:50:23
作者:黄青石 cnblogs.com/huangqingshi/p/10165409.html 在写入数据库的时候需要有锁,比如同时写入数据库的时候会出现丢数据,那么就需要锁机制。 数据锁分为乐观锁和悲观锁 它们使用的场景如下: 乐观锁适用于写少读多的情景,因为这种乐观锁相当于JAVA的CAS,所以多条数据同时过来的时候,不用等待,可以立即进行返回。 悲观锁适用于写多读少的情景,这种情况也相当于JAVA的 synchronized ,reentrantLock等,大量数据过来的时候,只有一条数据可以被写入,其他的数据需要等待。执行完成后下一条数据可以继续。 他们实现的方式上有所不同。 乐观锁采用版本号的方式,即当前版本号如果对应上了就可以写入数据,如果判断当前版本号不一致,那么就不会更新成功,比如 update table set column = value where version=${version} and otherKey = ${otherKey} 悲观锁实现的机制一般是在执行更新语句的时候采用for update方式,比如 update table set column='value' for update 这种情况where条件呢一定要涉及到数据库对应的索引字段,这样才会是行级锁,否则会是表锁,这样执行速度会变慢。 下面我就弄一个spring boot

Spring系列.AOP使用

纵然是瞬间 提交于 2020-08-18 07:03:50
AOP简介 利用面向对象的方法可以很好的组织代码,也可以继承的方式实现代码重用。但是项目中总是会出现一些重复的代码,并且不太方便使用继承的方式把他们重用管理起来,比如说通用日志打印,事务处理和安全检查等。我们可以将这些代码封装起来,做成通用模块,但是还是需要在代码中每处需要的地方进行显示调用,使用起来不方便。这是时候就是利用AOP的时候。 AOP是一种编程范式,用来解决特定的问题,不能解决所有问题,可以看做是OOP的补充,常见的编程范式还有: 面向过程编程; 面向对象编程; 面向函数编程(函数式编程); 事件驱动编程(GUI开发中比较常见); 面向切面编程 AOP的常见使用场景 性能监控,在方法调用前后记录调用时间,方法执行太长或超时报警; 缓存代理,缓存某方法的返回值,下次执行该方法时,直接从缓存里获取; 软件破解,使用AOP修改软件的验证类的判断逻辑; 记录日志,在方法执行前后记录系统日志; 工作流系统,工作流系统需要将业务代码和流程引擎代码混合在一起执行,那么我们可以使用AOP将其分离,并动态挂接业务; 权限验证,方法执行前验证是否有权限执行当前方法,没有则抛出没有权限执行异常,由业务代码捕捉; 事务处理 。 Spring AOP相关概念 AOP:这种在运行时(或者编译时或者加载时),动态地将某些公共代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程; 切面

@Pointcut()的execution、@annotation等参数说明

↘锁芯ラ 提交于 2020-08-18 06:42:44
AOP的基本概念 Advice(通知、切面): 某个连接点所采用的处理逻辑,也就是向连接点注入的代码, AOP在特定的切入点上执行的增强处理。 @Before : 标识一个前置增强方法,相当于BeforeAdvice的功能. @After: final增强 ,不管是抛出异常或者正常退出都会执行. @AfterReturning: 后置增强,似于AfterReturningAdvice, 方法正常退出时执行. @AfterThrowing: 异常抛出增强,相当于ThrowsAdvice. @Around : 环绕增强,相当于MethodInterceptor. JointPoint(连接点):程序运行中的某个阶段点,比如方法的调用、异常的抛出等。 Pointcut(切入点): JoinPoint的集合,是程序中需要注入Advice的位置的集合,指明Advice要在什么样的条件下才能被触发,在程序中主要体现为书写切入点表达式。 Advisor(增强): 是PointCut和Advice的综合体,完整描述了一个advice将会在pointcut所定义的位置被触发。 @Aspect (切面): 通常是一个类的注解,里面可以定义切入点和通知 AOP Proxy:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口

面试官问 Spring AOP 中两种代理模式的区别,我懵逼了

余生长醉 提交于 2020-08-16 23:14:01
基本介绍 代理模式 是一种结构性设计模式。为对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象,并允许在将请求提交给对象前后进行一些处理。 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。 代理模式主要有三种不同的形式: 静态代理:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的 .class 文件就已经存在了 动态代理(JDK 代理、接口代理):在程序运行时运用反射机制动态创建而成,动态就是在程序运行时生成的,而不是编译时。 cglib 代理(可以在内存动态的创建对象,而不是实现接口,属于动态代理的范畴) 问题 为什么要控制对于某个对象的访问呢?举个例子:有这样一个消耗大量系统资源的巨型对象, 你只是偶尔需要使用它, 并非总是需要。 你可以实现延迟初始化:在实际有需要时再创建该对象。对象的所有客户端都要执行延迟初始代码。不幸的是, 这很可能会带来很多重复代码。 在理想情况下, 我们希望将代码直接放入对象的类中, 但这并非总是能实现:比如类可能是第三方封闭库的一部分。 解决方案 代理模式建议新建一个与原服务对象接口相同的代理类, 然后更新应用以将代理对象传递给所有原始对象客户端。代理类接收到客户端请求后会创建实际的服务对象, 并将所有工作委派给它。 代理将自己伪装成数据库对象,

Spring Boot使用AOP的正确姿势

一笑奈何 提交于 2020-08-16 12:22:37
一、为什么需要面向切面编程? 面向对象编程(OOP)的好处是显而易见的,缺点也同样明显。当需要为多个不具有继承关系的对象添加一个公共的方法的时候,例如日志记录、性能监控等,如果采用面向对象编程的方法,需要在每个对象里面都添加相同的方法,这样就产生了较大的重复工作量和大量的重复代码,不利于维护。面向切面编程(AOP)是面向对象编程的补充,简单来说就是统一处理某一“切面”的问题的编程思想。如果使用AOP的方式进行日志的记录和处理,所有的日志代码都集中于一处,不需要再每个方法里面都去添加,极大减少了重复代码。 二、Spring AOP术语 通知 (Advice)包含了需要用于多个应用对象的横切行为,完全听不懂,没关系,通俗一点说就是定义了“什么时候”和“做什么”。 连接点 (Join Point)是程序执行过程中能够应用通知的所有点。 切点 (Poincut)是定义了在“什么地方”进行切入,哪些连接点会得到通知。显然,切点一定是连接点。 切面 (Aspect)是通知和切点的结合。通知和切点共同定义了切面的全部内容——是什么,何时,何地完成功能。 引入 (Introduction)允许我们向现有的类中添加新方法或者属性。 织入 (Weaving)是把切面应用到目标对象并创建新的代理对象的过程,分为编译期织入、类加载期织入和运行期织入。 三、Spring Boot AOP实战 3.1

Spring 如何在一个事务中开启另一个事务?

好久不见. 提交于 2020-08-16 04:30:20
这样的情景可能不常见,但是还是会有的,一旦遇到,如果业务比较复杂,就会很麻烦,但是还是有解决的方案的,比如将一个service方法拆成两个方法,也就是将两个操作的事务分开。 但是这只适用与业务比较简单的,如果出现多次数据库的写操作,而我们调用的系统只需要其中一个写操作的最新数据,如果我们将它分开,那么如果调用目标系统出现异常的时候,那么之前的写操作就不能回滚了。 举个简单的例子: 南昌代孕【网址:bztss.com】 @Service public class ServiceA { @Transactional public void doSomething(){ 向数据库中添加数据; 调用其他系统; } } 这里就用伪代码来做示例了,当我们执行了“向数据库中添加数据”,我们去数据库中查询,发现并没有我们添加的数据,但是当我们的service这个方法执行完成之后,数据库中就有这条数据了,这是由于数据库的隔离性造成的。 Spring中的事务注解 @transactional 提供了一个参数: 代孕公司【网址:bztss.com】 Propagation propagation() default Propagation.REQUIRED; 这个参数是定义 Spring事务的传递性的,默认值为:required,也就是如果有事务,就加入事务,如果没有,就创建事务。 这个参数的值有很多

使用SpringBoot AOP 记录操作日志、异常日志

蓝咒 提交于 2020-08-15 17:46:02
平时我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能;我们在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因我们都要到服务器去查询日志才能找到,而且也不能对发生的异常进行统计,从而改进我们的项目,要是能做个功能专门来记录操作日志和异常日志那就好了, 当然我们肯定有方法来做这件事情,而且也不会很难,我们可以在需要的方法中增加记录日志的代码,和在每个方法中增加记录异常的代码,最终把记录的日志存到数据库中。听起来好像很容易,但是我们做起来会发现,做这项工作很繁琐,而且都是在做一些重复性工作,还增加大量冗余代码,这种方式记录日志肯定是不可行的。 我们以前学过Spring 三大特性,IOC(控制反转),DI(依赖注入),AOP(面向切面),那其中AOP的主要功能就是将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来。今天我们就来用springBoot Aop 来做日志记录,好了,废话说了一大堆还是上货吧。 一、创建日志记录表、异常日志表,表结构如下: 操作日志表 异常日志表 二、添加Maven依赖 1 < dependency > 2 < groupId > org.springframework.boot </ groupId > 3 < artifactId > spring-boot-starter-aop </

Java 必看的 Spring 知识汇总!

瘦欲@ 提交于 2020-08-15 07:13:48
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性的角度而言,绝大部分Java应用都可以从Spring中受益。 Spring优点: 低侵入式设计,代码的污染极低; 独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺; Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦 Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用; Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问; pring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部。 Spring框架的组成结构图: Spring的核心机制 管理 Bean 程序主要是通过Spring容器来访问容器中的Bean,ApplicationContext是Spring容器最常用的接口,该接口有如下两个实现类: ClassPathXmlApplicationContext: 从类加载路径下搜索配置文件,并根据配置文件来创建Spring容器;

理解Spring(二):AOP 的概念与实现原理

佐手、 提交于 2020-08-14 22:38:48
目录 什么是 AOP AOP 的基本术语 Spring AOP 的简单应用 Spring AOP 与动态代理 Spring AOP 的实现原理(源码分析) 扩展:为什么 JDK 动态代理要求目标类必须实现接口 什么是 AOP AOP(Aspect Oriented Programming,面向切面编程)是一种编程范式,它是对 OOP(Object Oriented Programming,面向对象编程)的一个补充。 OOP 允许我们通过类来定义对象的属性和行为,由于对象的行为是通过类中的方法来体现的,所以要想修改一个对象的行为,就必须修改类中相应的方法。试想这么一个场景,我们需要对某些对象的某些行为进行耗时统计,OOP 的做法只能是挨个去修改它们所属的类,在相应的方法上加入耗时统计的逻辑,如果只是针对少量几个行为的修改倒也无妨,但如果要统计的是成百上千个行为呢,挨个去修改这成百上千个方法就显得很拙劣,而且还会导致大量的代码重复,如果要统计的是第三方类库中的行为,那么 OOP 就显得更加力不从心了。 在实际开发中,除耗时统计之外,类似的还有日志记录、事务控制、权限验证等等,它们往往穿插在各个控制流中,被各个功能模块所调用,但它们却是与核心业务逻辑无关的。像这种穿插在各个功能模块中的且与核心业务无关的代码被称为横切(cross cutting)。 在传统 OOP 中

IOC和DI的概念,以及Spring框架的介绍

只愿长相守 提交于 2020-08-14 06:47:30
对于Java开发者来说,Spring肯定是一个避不开的技术。所以准备系统的学下Spring框架。 我给自己设计的学习路线是这样的:首先阅读下Spring的官方文档(注意Spring官网上有很多项目,Spring的基础框架是Spring FrameWork这个项目),记录我认为重要的内容,方便后续回顾;到这边对Spring已经有了基本的认识,然后是找一到两本关于Spring源码的书,深入学习下Spring框架的原理性内容;最后是对于Spring的关键特性单独写博客记录,其实也就是对第二步的记录,你看了源码分析之后会对Spring的实现原理也有些了解。这些东西你不记录的话会很快遗忘。博客是一个很好的记录和分享自己所学的工具。所以后续我会对Spring的启动过程、自动注入、AOP和Spring MVC这些我之前看起来很高级的特性单独写博客记录。 本博客是学习路线的第一步,是对Spring官方文档的记录。主要是熟悉Spring框架有哪些功能,基本的使用方式是怎样的。由于Spring FrameWork的官方文档比较长,所以分模块来记录了,本博客是Spring FrameWork核心技术部分的记录,基于5.2.6版本.关于这个版本相对于之前版本的 更新 ,请点击连接查看。 简介 Spring是一个轻量级的Java Bean容器,这个容器为应用程序的开发提供了基础框架(基础功能)的支持