Spring 大杂烩
OK_boom
大龄搬砖工,酷爱计算机技术,java/C#/android/free pascal/C++。
展开
-
利用spring的around注解实现异构登录处理
需求:当前审批中心系统中要融入ERP用户登录,也就是说当前系统要接入ERP的登录信息,登录的时候判断当前系统是否有此用户,没有的话自动注册用户并设置审批角色,如果有,则更新密码。之后,再调用原操作。也为了降低耦合,利用spring的@around特性进行登录动作的拦截,想要用@Around,需要用@Pointcut配合;原创 2023-02-05 17:06:51 · 155 阅读 · 0 评论 -
SpringBoot配置加载顺序
https://blog.csdn.net/qq_52139871/article/details/124872875转载 2023-02-04 11:45:06 · 80 阅读 · 0 评论 -
备忘一下,跟踪mybatis的入口类
所有请求均源自org.apache.ibatis.session.defaults.DefaultSqlSession。原创 2022-09-28 12:51:24 · 141 阅读 · 0 评论 -
Redis分布锁的测试
分享Redis分布锁的测试备忘原创 2022-09-07 20:28:28 · 835 阅读 · 0 评论 -
备忘一下配置@Cacheable的失效时间(Redis指定某些Cache Key的失效时间)
所有配置在生成RedisCacheManager之前就应该指定(在Builder里面),下面代码是指定Builder的默认配置和指定某些key的配置的 代码原创 2022-08-06 10:26:46 · 1301 阅读 · 0 评论 -
Seata的分布式事务处理以及如何避免脏读数据
如何避免脏读数据,网上看到的文章多半没效,甚至官方资料也没提及到,只有自己各种Case去测试。目录让seata全局事务生效1、全局写事务2、全局读事务3、Seata的代码分析关键代码1 io.seata.rm.datasource.exec.ExecuteTemplate#execute(java.util.List让seata全局事务生效想要全局锁生效,必须让其seata代理datasource,以baomidou的动态数据源配置为例,seata全局开关要打开,默认是关闭的。全局开关打开就不需要每原创 2022-05-20 16:52:27 · 1367 阅读 · 3 评论 -
SpringBoot关于默认静态资源访问路径定义及自定义设置
Spring Boot 对静态资源映射提供了默认配置, 默认将 /** 所有访问映射到以下目录:classpath:/staticclasspath:/publicclasspath:/resourcesclasspath:/META-INF/resourcesclasspath 即WEB-INF下面的classes目录,在springboot项目中可能就是src/main/resources目录。也就是\resources目录下默认上面三个目录:static,public,resources转载 2022-04-29 12:06:13 · 5017 阅读 · 0 评论 -
IDEA调试nacos服务端应用
调试前先修改console下的application.properties在vm options里面填上:-DembeddedStorage=true -Dnacos.home=D:\docker-workspace\nacos\test\nacos-c2 -Dnacos.standalone=false -Xmx256m -Dspring.config.additional-location=file:/d:/docker-workspace/nacos/test/nacos-c2/conf/原创 2022-04-28 15:17:02 · 634 阅读 · 0 评论 -
备忘几个SpringBoot常用的配置注解
@Configuration@Configuration和@Component实质上没什么区别,但是方便大家知道区分这是配置类,跟其他ioc注解一样,可以指定名称,如@Configuration(“myconfig”)@AutoConfigureBefore、@AutoConfigureAfter、@AutoConfigureOrder调整装配顺序,比如@AutoConfigureBefore(SentinelConfig.class),就是在SentinelConfig装配前先装配当前类实例..原创 2022-04-25 18:05:23 · 477 阅读 · 0 评论 -
手动调整slf4j的日志等级
如果用的logback实现,就用ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) org.slf4j.LoggerFactory .getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME); root.setLevel(Level.INFO);如果用的是log4j实现,就用 org.apache.log4j.Logge原创 2022-04-20 17:14:39 · 2963 阅读 · 0 评论 -
Easy-Shiro之微服务鉴权
easy-shiro的宗旨是易使用,兼容spring框架、dubbo框架和非spring框架。下面介绍一下它的两个最常见应用。原创 2022-04-09 16:36:36 · 852 阅读 · 0 评论 -
Springboot集成caffeine高速缓冲
记性不好,备忘一下,新项目可以拿来就用。因为caffeine不是boot的默认缓冲实现,所以还得要配置一下,以下是比较优雅的配置方案,即使以后将caffeine换成其他缓冲也不用改什么代码。引用依赖引用如下 ,如果这个项目本身就有引用starter-web的,autoconfigure可以不引用,Starter-web已经包含了。 <dependency> <groupId>org.springframework.boot</gr原创 2022-04-01 16:53:08 · 1629 阅读 · 0 评论 -
springboot的条件装配
常用的如下用属性比如,如果想要本配置类在满足某个属性条件才加载的话,例如下面就是说如果spring.main.web-application-type指定值为SERVLET,或者没指定任何值的话就加载@ConditionalOnProperty(name="spring.main.web-application-type", havingValue = "SERVLET", matchIfMissing = true)依赖其他类加载如果想要本配置是否加载取决于是否已经加载了某些类,可以如下 ,原创 2022-03-29 15:18:00 · 317 阅读 · 0 评论 -
Dubbo的集群容错
1、容错机制类型类型负载均衡备注failover会失败后会尝试调用其他服务器实例,默认尝试2次, 可以通过设置retries来设置次数。这是dubbo默认的容错机制,由于常常可能因为超时待原因触发异常但远程服务已经完成操作,所以这个类型不应就在数据更新的操作failfast会有异常立即返回,不做尝试,我认为可以用在数据更新上,以保证数据的一致性fastsafe会有异常会直接忽略,为的是保证调用方接下来的正常运行,一般用于日志收集等与正常流程无关的操作fa原创 2022-03-26 11:37:30 · 834 阅读 · 0 评论 -
Springboot的日志配置:排除被log4j抢占slf4j实现、及mybatis-plus日志配置
有个dubbo项目,发现logback的配置不生效,第一时间怀疑springboot的默认slf4j的logback是不是被抢了,于是查一下依赖树:mvn dependency:tree >a.txt然后打开a.txt查一下log4j,结果发现dubbo-registry-nacos里面依赖了log4j:log4j,于是用exclusion排除了它,日志正常。然后,通过err log又发现Version.class,Exchangers.class,Transporters.class,Remo原创 2022-03-24 17:50:02 · 1959 阅读 · 0 评论 -
EasyShiro-可用于分布式应用的鉴权工具
EasyShiro特色1/简单易用几乎开箱即用,不用写冗余繁琐的代码。登录后储存在Principal的为内置的UserDtoWithPermission,它是AuthenticationWithPermission的实现,包含如下信息:account/roles/permissions2/轻装上阵没有集成数据库,AbstractAccountRealm留有接口可以自行实现login(身份认证)和getAuthorization(获取授权),所以你可以用mysql,postsql或memory任原创 2022-03-15 17:53:56 · 1875 阅读 · 5 评论 -
Spring对ServletException的拦截(两种方法)
不知为何带@ControllerAdvice@ResponseBody的异常控制类,可以拦截认证失败异常/jwt异常唯独无法拦截ServletException。跑一下吧,如下图,因为拦截不到ServletException,直接出这个莫名其妙的错误:所以需要另寻他法:1、可以实现ResponseBodyAdvice,再从response里面用反射方式取得实际的exception再返回,因为默认的spring错误返回controller是BasicErrorController,对它动手就行了。原创 2022-03-15 14:57:17 · 718 阅读 · 0 评论 -
记一则隐性依赖造成的spring类属性装配参数失败
有一个Config类,需要引用了Properties属性类,Properties类用@ConfigurationProperties和@PropertySource自动从yml配置文件装配类属性,而Config类里面有若干个用@Bean进行ioc注册实例的操作,而这些实例也需要用到Properties类,结果是Config类用@Resource来引用Properties类,获取不到,返回null,用applicationContext.getBean手动获取,可以获取 ,但Properties实例里面的原创 2022-03-15 09:41:52 · 419 阅读 · 0 评论 -
Shiro权限注解拦截分析
Shiro类似@RequiresPermissions(value = {“p2”})这种在controller里面设置的权限,通过org.apache.shiro.authz.aop.AuthorizingAnnotationMethodInterceptor#assertAuthorized再call org.apache.shiro.authz.aop.PermissionAnnotationHandler#assertAuthorized来判断此权限是否为此主体授权而AuthorizingAnn原创 2022-03-13 10:45:46 · 577 阅读 · 0 评论 -
用@PropertySource加载yml格式配置文件
@PropertySource默认只支持xml或properties,所以需要扩展,这里备忘一下。public class YamlPropertySourceFactory extends DefaultPropertySourceFactory { @Override public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {原创 2022-03-10 16:02:06 · 526 阅读 · 0 评论 -
J2Cache以RabbitMQ作为消息通知配置
J2Cache作为成熟的二级缓冲工具,非常好用,它有一项消息广播的参数配置(消息广播主要作为是当2级缓存发生crud时用来通知各使用的客户端以同步1级缓存),此参数可以配置为jgroups,redis,rabbitmq,rocketmq。redis当然可以用,私以为最好还是用mq来通知。 当j2cache.broadcast设置为rabbitmq时运行它的测试例程会有异常,怎么也连接不上rabbitmq,后来通知跟踪source发现连接参数需要配置一个virtualHost。没错,virtualHo原创 2022-03-10 10:06:37 · 2757 阅读 · 0 评论 -
分享一个易用的Jwt工具类
这个工具类可以将任意类型的payload加入jwt,能用timeunit指定生效时间、并具备加密保存功能,亦提供方法从token中还原payload的实例。1、pom加入依赖,jwt和cipher <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version&原创 2022-03-05 12:39:04 · 708 阅读 · 0 评论 -
Mybatis+PageHelper加入Mybatis plus扩展
1、修改pom依赖dependencyManagement加入mybatis-plus和mybatis-plus-boot-starter,注意要排除mybatis-spring,spring-boot–starter-jdbc 因为pagehelper已经包含了这些依赖。<dependencyManagement> <dependencies> <dependency> <groupId&原创 2022-03-03 14:29:02 · 452 阅读 · 0 评论 -
springboot的controller请求拦截
由于项目需求,需要在转发d365请求时带上company code,所以在所有controller来源有需要访问d365资源的均需要带上company code然后用httpUtil转发d365服务器时用上。首先需要注册一个全局controller拦截器,因为WebMvcConfigurer已经有了一个实例WebConfig,所以不能再新建一个WebMvcConfigurer,所以只能修改WebConfig,增加:public static List handlerInterceptors=new Li原创 2022-03-02 10:57:29 · 4539 阅读 · 0 评论 -
Spring之BeanPostProcessor(后置处理器)介绍
一. 说明功能:在 redisTemplate 命令执行前后 输出日志原理作用是输出 RedisTemplate 命令执行日志。包括:命令名称、参数、返回值等原理是使用动态代理拦截类 redisConnectionFactory 的 getConnection() 方法,监控Redis命令目前主要输出 get/set/pExpire/pSetEx 等命令日志,可根据需要扩展示例单元测试@Testpublic void RedisTemplateTest() { String key转载 2022-02-04 10:38:42 · 216 阅读 · 0 评论 -
一宗诡异的spring cache在并发情况下窜数的问题排除
最近一直有用户反映app端获取的数据窜了(显示的是其他站位的数据),于是从app端一直加trace log,追踪到后台service,在后台api返回数据前就加数据比较,有异常就输出trace log。 这个bug不好找,develop阶段怎么也查不到,所以就写了个junit进行并发模拟实际使用情况,慢慢就定位到是因为cache问题导致的,最后发现原来是这个cache的spel表达式问题:@Cacheable(value="jobInfoKeep1min",key="'getBaseBaseInf原创 2022-01-18 09:34:05 · 437 阅读 · 0 评论 -
Springboot的自动装配参数功能
通常我们的项目至少会有一个用来存放各种参数的参数类,而这些参数又希望在application配置文件里面能进行设置,那么如何将配置文件里面的配置参数自动装配到参数类中?如,application.yml里面有参数如下:mq: sms: sms-queue: smsQueue sms-exchange: smsExchange sms-key: smsKey参数类应该要实现InitializingBean 接口,才能在属性设置完毕后再进行默认值赋值:@Configur原创 2022-01-06 11:05:54 · 580 阅读 · 0 评论 -
Springboot如何进行根据配置参数前缀来装配实例?
文章目录1、需求2、如下图,怎么判断application.yml(或者其他六大配置来源)含有指定的参数前缀?3、自定义注解4、应用例子1、需求 通常有这样的需求:比如有些选择性的装配实例,一般会根据application配置参数里面是否有这项配置,有指定配置才装配,没有就不装配,如果想实现这种需求,则需要判断配置参数里面是否包含某个前缀的参数。2、如下图,怎么判断application.yml(或者其他六大配置来源)含有指定的参数前缀?我们写个方法用于获取指定前缀的键名:public Li原创 2021-12-25 16:36:41 · 401 阅读 · 0 评论 -
SpringBoot @ConfigurationProperties详解
简介本文将会详细讲解@ConfigurationProperties在Spring Boot中的使用。添加依赖关系首先我们需要添加Spring Boot依赖: org.springframework.boot spring-boot-starter-parent 一个简单的例子@ConfigurationProperties需要和@Configuration配合使用,我们通常在一个POJO里面进行配置:@Data@Configuration@Configurat转载 2021-12-25 11:32:05 · 1090 阅读 · 0 评论 -
EasyExcel的ExceptionInInitializerError解决方法
当Easyexcel出现问题的时候一定要下载source跟踪(比较操蛋的是最新版3.0.5的source和.jar不一致)。测试Easyexcel发现有ExceptionInInitializerError异常,跟踪到com.alibaba.excel.util.BeanMapUtils,由new Generator()触发。排查经过不表,最后发现新版的easyexcel引用了cglib3.3,里面依赖的asm是7.1。而我的项目亦依赖了beetl,...原创 2021-11-20 10:07:41 · 2715 阅读 · 1 评论 -
Spring cache的@Cableable @CacheEvict的实现
跟踪了半天,终于找到调用栈了:最后发现拦截器对@CacheEvict进行拦截,并通过DefaultRedisCacheWriter来实现数据删除。原创 2021-10-11 12:15:08 · 209 阅读 · 0 评论 -
Postgresql的json数组在java/mybatis的匹配
pg的table schema:CREATE TABLE tah_so_info( salesid character varying(20) NOT NULL, ... gentlementpo character varying(20), lines json[], methodofpayment character varying(15), modeofdelivery character varying(15), ... CONSTRAINT tah_pkey.原创 2021-08-27 16:37:26 · 1390 阅读 · 0 评论 -
mybatis处理list/数组条件参数的典型方式
由于pg支持any方式查询,只要传入的数组不大,完全可以用any(array[])的方式进行查询,这种方式pg会提供索引支持。mybatis里面还要排除传入的参数是不是null或空的数组,具体实现如下:<select id="getSoListByIds" resultMap="BaseResultMap"> select * from public.tah_so_info where <choose> <when test="s原创 2021-08-27 11:44:56 · 602 阅读 · 0 评论 -
Spring service中的方法互相调用,被调用的方法的注解为什么不生效?
如下代码, 看似没问题,但是却没能成功缓存,为什么呢? @Override public List<OfflineBaseInfo> getAllJobBaseInfo(String station,boolean skipInvalidJob) { List<String> jobs=getOfflineBaseJobs(); List<OfflineBaseInfo> ret=new ArrayList<>(); Arra原创 2021-03-11 12:28:54 · 1055 阅读 · 0 评论 -
Spring boot手动切换数据源(带事务管理)的方法
经过各种尝试, 想利用原先用注解构建的mapper实例进行无缝的数据源切换, 在不需要事务管理的情况下是可以的, 用代码DataSourceContextHolder.setDataSourceType(newDataSource);即可.但是前提是本方法不能用@Transaction事务注解 , 因为用了事务注解,进入本方法之前已经被事务拦截器拦截,所以用了setDataSourceType也没效, 不会重新获得connection/transaction . 手动切换数据源不能用@T...原创 2021-02-06 12:11:17 · 958 阅读 · 0 评论 -
简单记一下Spring 对事务注解的加载过程
若service里面有个方法做了@Transactional事务注解, 那么这个方法会被org.springframework.transaction.interceptor.TransactionInterceptor拦截, 最后会在执行org.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransaction, 代码:TransactionAttributeSource tas = get原创 2021-02-05 17:36:20 · 346 阅读 · 0 评论 -
SpringBoot2+Mybatis的多数据源配置实现(包括事务管理)
SpringBoot2+Mybatis的多数据源配置实现概述Multi-DataSource 模块的建立定义TargetDataSource注解定义Aop拦截器定义多线程下data source type的存取器定义数据源注册器定义自定义数据源定义EnableMultiDataSource在yml里面配置多数据源参数启动类必须加上注解测试不用Aop拦截的处理方式概述多数据源的实现有不同的方法, 有的是通过配置不同的datasource,不同的SqlSessionFactory,每个SqlSessionF原创 2020-08-28 10:29:33 · 961 阅读 · 0 评论 -
Springboot 如何加载maven聚合工程子模块的国际化资源文件
很遗憾Springboot并不直接支持扫描子模块的国际化资源文件, 所以我们需要自定义Message source loader:在通用模块中定义CustomMessageLoaderConfiguration:package com.freestyle.common.spring.support;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotati原创 2020-07-13 11:59:26 · 1194 阅读 · 0 评论 -
Maven compile后不能将resources同步到target/classes的解决方法
如果maven的module的pom.xml packaging类型设为pom是不会同步resource到target的, pom类型一般只为打包时聚集其他所有子模块时用,比如开一个module用来打包项目jar,则这个module的packaging设为pom,其他的module则用默认的packaging类型 jar. 如果该子模块含有mybatis mapper...原创 2020-03-30 16:39:45 · 1065 阅读 · 1 评论 -
建立一个Springboot的测试环境
先建立通用测试app/** * Created by rocklee on 2019/12/3 10:29 */import com.jeesite.modules.Application;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;imp...原创 2019-12-03 10:34:41 · 474 阅读 · 0 评论