Advisor

【原创】003 | 搭上基于SpringBoot事务思想实战专车

人盡茶涼 提交于 2019-12-11 14:07:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 前言 如果这是你 第二次 看到师长,说明你在觊觎我的美色! 点赞+关注再看,养成习惯 没别的意思,就是需要你的窥屏^_^ 专车介绍 该趟专车是开往基于Spring Boot事务思想实战的专车,在上一篇 搭上SpringBoot事务源码分析专车 [1]中我们详细介绍了Spring Boot事务实现的原理,这一篇是基于上一篇的实战。 在实战之前,我们再次回顾下上篇文章讲解的重点: 后置处理器:对Bean进行拦截并处理 切面:由切点和通知组成 切点:用于匹配符合的类和方法 通知:用于代理处理 专车问题 如何利用后置处理器对Bean进行拦截并处理? 如何定义切面? 如何定义切点? 如何定义通知? 如何实现自动配置? 专车分析 实现是以Spring Boot为基础,需要添加如下依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <

Spring之旅第五篇-AOP详解

孤人 提交于 2019-12-07 11:47:50
一、什么是AOP? Aspect oritention programming(面向切面编程),AOP是一种思想,高度概括的话是“横向重复,纵向抽取”,如何理解呢?举个例子:访问页面时需要权限认证,如果每个页面都去实现方法显然是不合适的,这个时候我们就可以利用切面编程。 每个页面都去实现这个方法就是横向的重复,我们直接从中切入,封装一个与主业务无关的权限验证的公共方法,这样可以减少系统的重复代码,降低模块之间的耦合度,简单的示意图如下: 二、应用场景 AOP用来封装横切关注点,具体可以在下面的场景中使用: Authentication 权限 Caching 缓存 Context passing 内容传递 Error handling 错误处理 Lazy loading 懒加载 Debugging  调试 l ogging, tracing, profiling and monitoring 记录跟踪 优化 校准 Performance optimization 性能优化 Persistence  持久化 Resource pooling 资源池 Synchronization 同步 Transactions 事务 三、相关概念 1.连接点(Joinpoint) 所谓连接点是指那些可能被拦截到的方法。例如:所有可以增加的方法 2.切点(Pointcut) 已经被增强的连接点 3.增强

Spring Aop之Cglib实现原理详解

不羁岁月 提交于 2019-12-05 14:12:37
Spring Aop实现对目标对象的代理,主要有两种方式:Jdk代理和Cglib代理。这两种代理的区别在于,Jdk代理与目标类都会实现同一个接口,并且在代理类中会调用目标类中被代理的方法,调用者实际调用的则是代理类的方法,通过这种方式我们就可以在代理类中织入切面逻辑;Jdk代理存在的问题在于目标类被代理的方法必须实现某个接口,Cglib代理则是为了解决这个问题而存在的,其实现代理的方式是通过为目标类动态生成一个子类,通过在子类中织入相应逻辑来达到织入代理逻辑的目的。 关于Jdk代理和Cglib代理,其优缺点主要在于: Jdk代理生成的代理类只有一个,因而其编译速度是非常快的;而由于被代理的目标类是动态传入代理类中的,Jdk代理的执行效率相对来说低一点,这也是Jdk代理被称为动态代理的原因; Cglib代理需要为每个目标类生成相应的子类,因而在实际运行过程中,其可能会生成非常多的子类,过多的子类始终不是太好的,因为这影响了虚拟机编译类的效率;但由于在调用过程中,代理类的方法是已经静态编译生成了的,因而Cglib代理的执行效率相对来说高一些。 本文主要讲解Spring Aop是如何通过Cglib代理实现将切面逻辑织入目标类的。 1. AopProxy织入对象生成 前面我们讲过,Spring Aop织入切面逻辑的入口方法是 AbstractAutoProxyCreator

自己实现 aop 和 spring aop

荒凉一梦 提交于 2019-12-04 09:29:18
上文 说到,我们可以在 BeanPostProcessor 中对 bean 的初始化前化做手脚,当时也说了,我完全可以生成一个代理类丢回去。 代理类肯定要为用户做一些事情,不可能像学设计模式的时候创建个代理类,然后简单的在前面打印一句话,后面打印一句话,这叫啥事啊,难怪当时听不懂。最好是这个方法的前后过程可以自户自己定义。 小明说,这还不好办,cglib 已经有现成的了,jdk 也可以实现动态代理,看 mybatis 其实也是这么干的,不然你想它一个接口怎么就能找到 xml 的实现呢,可以参照下 mybatis 的代码。 所以首先学习下 cglib 和 jdk 的动态代理,我们来模拟下 mybatis 是如何通过接口来实现方法调用的 cglib 目标接口: public interface UserOperator { User queryUserByName(String name); } 代理处理类: import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class ProxyHandle implements MethodInterceptor{ // 实现 MethodInterceptor 的代理拦截接口 public Object

SpringBoot系列之AOP实现的两种方式

大憨熊 提交于 2019-11-30 02:07:20
AOP常用的实现方式有两种, 一种是采用声明的方式来实现(基于XML),一种是采用注解的方式来实现(基于AspectJ) 。 首先复习下AOP中一些比较重要的概念: Joinpoint(连接点): 程序执行时的某个特定的点,在Spring中就是某一个方法的执行 。 Pointcut(切点): 说的通俗点,spring中AOP的切点就是指一些方法的集合,而这些方法是需要被增强、被代理的。一般都是按照一定的约定规则来表示的,如正则表达式等。切点是由一类连接点组成。 Advice(通知): 还是说的通俗点,就是在指定切点上要干些什么。 Advisor(通知器): 其实就是切点和通知的结合 。 一、基于XML配置的Spring AOP 采用声明的方式实现(在XML文件中配置),大致步骤为:配置文件中配置pointcut, 在java中用编写实际的aspect 类, 针对对切入点进行相关的业务处理。 业务接口: package com.springboottime.time.service; public interface AdviceService { /*查找用户*/ public String findUser(); /*添加用户*/ public void addUser(); } 业务实现: package com.springboottime.time.service

log trace (3) - 仿Sleuth 支持异步LazyTraceAsyncTaskExecutor方式实现XXL-JOB的日志链路

人盡茶涼 提交于 2019-11-28 07:27:47
在bean初始化阶段,通过代理方式将其适配为自定义的 IJobHandler 实现对象XxlJobTraceWrapper。 真正 invoke时,从beanFactory中获取Tracing对象开启新的Span。 也可以类似于 仿@EnableAsync 实现自定义切面日志 文章中的方案,对IJobHandler.execute()构建StaticMethodMatcherPointcut 的Advisor方式来实现 XxlJobBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware: import java.lang.reflect.Modifier; import org.aopalliance.aop.Advice; import org.springframework.aop.framework.AopConfigException; import org.springframework.aop.framework.ProxyFactoryBean; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org