interceptor

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哪个类是切面类

JAVA-过滤器和拦截器1

孤人 提交于 2020-08-08 05:08:59
1、过滤器 (Filter) 过滤器的配置比较简单,直接实现 Filter 接口即可,也可以通过 @WebFilter 注解实现对特定 URL 拦截,看到 Filter 接口中定义了三个方法。 init() :该方法在容器启动初始化过滤器时被调用,它在 Filter 的整个生命周期只会被调用一次。注意:这个方法必须执行成功,否则过滤器会不起作用。 doFilter() :容器中的每一次请求都会调用该方法, FilterChain 用来调用下一个过滤器 Filter。 destroy(): 当容器销毁 过滤器实例时调用该方法,一般在方法中销毁或关闭资源,在过滤器 Filter 的整个生命周期也只会被调用一次 @Component public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Filter 前置"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)

【mybatis】mybatis 拦截器工作原理源码解析

為{幸葍}努か 提交于 2020-08-07 08:29:42
mybatis 拦截器工作原理(JDK动态代理) 1. mybatis 拦截器案例 场景:分页查询,类似成熟产品: pagehelper , 这里只做简单原理演示 1.0 mybatis全局配置 SqlMapConfig.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="db.properties"/> <typeAliases> <package name="com.zhiwei.entity"/> </typeAliases> <plugins> <plugin interceptor="com.zhiwei.advanced.plugin.MyInterceptor"/> </plugins> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type=

nacos+ribbon自定义ab测试路由策略

喜你入骨 提交于 2020-08-05 09:19:13
原理:通过请求头埋入指定服务的metadata标识,扩展ribbon的choose策略。 一定要注意hystrix的隔离策略 !!强烈推荐使用信号量隔离。 因为一旦使用线程隔离(线程池存在复用),会导致InheritThreadLocal(只会在线程init时拷贝父线程的ThreadLocal值)失效。 传送门 下载源码编译 应用集成 maven依赖 <dependency> <groupId>io.jmnarloch</groupId> <artifactId>ribbon-discovery-filter-spring-cloud-starter</artifactId> <version>2.1.0</version> </dependency> 应用配置 #AB测试用,网关会根据该参数路由 spring.cloud.nacos.discovery.metadata.launcher=A 拦截器 public class AbTestingFilter extends OncePerRequestFilter { private final static String SWITCH_KEY = "launcher", SWITCH_HEAD_KEY = "switchTag", DEFAULT_ENV = "B";//默认B为线上测试环境 @Value("${spring

shiro篇---开启常见的注解

喜夏-厌秋 提交于 2020-08-04 19:27:59
** **  shiro常见的注解: (注:建议将shiro注解放入controller,因为如果service层使用了spring的事物注解,那么shiro注解将无效,如果spring管控了 filter 还是 Interceptor,怎controller层无效 ,此时可以放在service层试试) ** @RequiresAuthentication:** 使用该注解标注的类,实例,方法在访问或调用时,当前Subject必须在当前session中已经过认证。 @RequiresGuest: 使用该注解标注的类,实例,方法在访问或调用时,当前Subject可以是“gust”身份,不需要经过认证或者在原先的session中存在记录。 @RequiresPermissions: 当前Subject需要拥有某些特定的权限时,才能执行被该注解标注的方法。如果当前Subject不具有这样的权限,则方法不会被执行。 @RequiresRoles: 当前Subject必须拥有所有指定的角色时,才能访问被该注解标注的方法。如果当天Subject不同时拥有所有指定角色,则方法不会执行还会抛出AuthorizationException异常。 ** @RequiresUser:** 当前Subject必须是应用的用户,才能访问或调用被该注解标注的类,实例,方法。 在application

andorid jar/库源码解析之frida体验

☆樱花仙子☆ 提交于 2020-08-04 16:58:40
目录: andorid jar/库源码解析 Frida体验:   作用:     android手机上可以对,java和so层代码,进行hook.监控数据和处理内存数据。     官译:面向开发人员、逆向工程师和安全研究人员的动态工具工具包。   栗子:    运行步骤:     1、 https://github.com/frida/frida/releases 下载适合需要运行环境的可执行程序。我这里是arm64,所以下载了一个最新版本的frida64位。     2、PC端,安装python环境,直接从官网下载一个python安装包安装即可,我这里安装的是python3, 安装包会自己配置环境变量,cmd运行 python,看看有没有,有就是安装上了环境变量了。     3、使用 pip install frida 安装 frida 环境,基于 python的。 再安装 pip install frida-tools ,我看大部分都是按照了。tools的。     4、一切ok。开始跑了,,,把步骤1中得到的,可执行文件,拷贝到手机上面 adb push D:\xxx\xxx\frixxxx /data/local/tmp/     5、因为push上去的可执行文件默认没有权限,下一步授权。。adb shell 进入手机 su,得到root权限。。cd /data/local

数据源管理 | Kafka集群环境搭建,消息存储机制详解

允我心安 提交于 2020-07-29 07:38:50
本文源码: GitHub·点这里 || GitEE·点这里 一、Kafka集群环境 1、环境版本 版本:kafka2.11,zookeeper3.4 注意 :这里zookeeper3.4也是基于集群模式部署。 2、解压重命名 tar -zxvf kafka_2.11-0.11.0.0.tgz mv kafka_2.11-0.11.0.0 kafka2.11 创建日志目录 [root@en-master kafka2.11]# mkdir logs 注意 :以上操作需要同步到集群下其他服务上。 3、添加环境变量 vim /etc/profile export KAFKA_HOME=/opt/kafka2.11 export PATH=$PATH:$KAFKA_HOME/bin source /etc/profile 4、修改核心配置 [root@en-master /opt/kafka2.11/config]# vim server.properties -- 核心修改如下 # 唯一编号 broker.id=0 # 开启topic删除 delete.topic.enable=true # 日志地址 log.dirs=/opt/kafka2.11/logs # zk集群 zookeeper.connect=zk01:2181,zk02:2181,zk03:2181 注意 :broker

【Spring】@Transactional 闲聊

时光总嘲笑我的痴心妄想 提交于 2020-07-28 19:35:28
菜瓜:上次的AOP理论知识看完收获挺多的,虽然有一个自定义注解的demo,但还是觉得差点东西 水稻:我也觉得没有跟一遍源码还是差点意思,这次结合@Transactional注解深入源码看一下 菜瓜:事务注解,这个平时用的挺多的 水稻:是吗?来看看你的基础咋样 要保证一个方法中多个数据库操作的原子性,要共用一个数据库连接,但是coding时我们不用显示传递连接对象,这是咋弄的? 如果一个方法里面只有查询操作,是否不用开启事务? 如何解决非事务方法调用本地事务方法失效的? 注解常用的传播属性,你知道他们的区别吗 菜瓜:虽然没看过源码,我大胆猜测一下 隐式传递连接对象可以将其封装到线程中,一般一次请求操作都是在一个线程中完成。使用ThreadLocal将连接和线程绑定 查询操作也得看业务场景,如果多次查询相同的数据要避免不可重复读问题,可开启只读事务 (readOnly = true) 结合AOP的知识,这里其实要解决调用事务方法的对象不是代理对象的问题。用代理对象调本地事务方法即可(注入自己) /** * @author QuCheng on 2020/6/24. */ @Service public class ItemServiceImpl implements ItemService { @Resource private IcbcItemMapper itemMapper;

Springboot+Redis综合运用/缓存使用

你说的曾经没有我的故事 提交于 2020-07-28 10:45:49
项目引入依赖(安装redis自行百度) <!-- spring-boot redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- lettuce pool 缓存连接池--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> yml配置 spring: redis: # Redis数据库索引(默认为0) database: 0 # Redis服务器地址 host: localhost # Redis服务器连接端口 port: 6379 pool: # 连接池最大连接数(使用负值表示没有限制) max-active: 8 # 连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1 # 连接池中的最大空闲连接 max-idle: 8 # 连接池中的最小空闲连接 min-idle: 0 # 连接超时时间(毫秒) timeout: 0 redis配置类 @Configuration public

聊聊rocketmq-client-go的defaultProducer

余生长醉 提交于 2020-07-27 05:55:37
序 本文主要研究一下rocketmq-client-go的defaultProducer defaultProducer rocketmq-client-go-v2.0.0/producer/producer.go type defaultProducer struct { group string client internal.RMQClient state int32 options producerOptions publishInfo sync.Map callbackCh chan interface{} interceptor primitive.Interceptor } defaultProducer定义了group、client、state、options、publishInfo、callbackCh、interceptor NewDefaultProducer rocketmq-client-go-v2.0.0/producer/producer.go func NewDefaultProducer(opts ...Option) (*defaultProducer, error) { defaultOpts := defaultProducerOptions() for _, apply := range opts { apply(&defaultOpts)