- 博客(53)
- 收藏
- 关注

原创 easyexcel 给单元格设置格式,通过自定义注解方式实现对每一列格式的精确控制
easyexcel官方文档中可以设置表头单元格格式及内容的单元格格式,其中单元格格式策略类中有两个构造函数public HorizontalCellStyleStrategy(WriteCellStyle headWriteCellStyle, List<WriteCellStyle> contentWriteCellStyleList) { this.headW...
2019-12-23 10:22:58
16723
4
原创 spring扫描bean以及mybatis扫描mapper对应的bean
ClassPathBeanDefinitionScanner#doScan(String… basePackages):在指定的基本程序包中执行扫描,返回已注册的bean定义。此方法不注册一个注解配置处理器而是让这件事给调用者。 protected Set<BeanDefinitionHolder> doScan(String... basePackages) { Assert.notEmpty(basePackages, "At least one base package must
2022-05-09 14:30:54
952
原创 自定义springboot starter
源码githubpom <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId>
2022-05-06 17:04:50
331
原创 springboot starter原理简单介绍
原理简单概述springboot 各种starter简单来说就是为了加载各种依赖包中配置类@Configuration,这些配置类必须在模块的resources/META-INF 目录下spring.factories文件中键为org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的值中声明因为我们不可能在启动类中声明扫描的包包含所有依赖包的配置类@Configuration,那样不现实。所以spring就提供了一种机制来加载这
2022-05-06 14:30:43
404
原创 spring @Import介绍
文档翻译指示要导入的一个或多个组件类——通常是@Configuration类。提供与 Spring XML 中<import/>元素等效的功能。允许导入@Configuration类、 ImportSelector和ImportBeanDefinitionRegistrar实现,以及常规组件类(从 4.2 开始;类似于AnnotationConfigApplicationContext.register )何时解析@Import答:处理配置类时。具体代码分析如下:Configurat
2022-05-05 21:34:05
488
原创 spring事务注解@Transactional
之前文章springAop原理之查找和原始bean关联的Advisor.已经分析了spring如何查找和判断Advisor是否和原始Bean关联,这里以BeanFactoryTransactionAttributeSourceAdvisor(事务注解关联的Advisor)为例,具体分析下最后一个canApply方法。ClassFilterBeanFactoryTransactionAttributeSourceAdvisor的切点为TransactionAttributeSourcePointcut
2022-04-29 21:37:45
739
原创 springAop原理之(二)Advisor、pointcut接口族介绍
Advisor:包含AOP通知的基本接口(在连接点采取的操作)和一个确定建议的适用性的过滤器(例如一个切入点)。这个接口不是供Spring用户使用的,而是允许在支持不同类型的通知时具有通用性。Spring AOP基于通过方法拦截的环绕通知传递,符合AOP联盟拦截API。Advisor接口支持不同类型的建议,如之前和之后的通知,不需要使用拦截实现。PointcutAdvisor:由切入点驱动的所有Advisor的超级接口。这几乎涵盖了除introduction advisors以外的所有
2022-04-29 10:23:52
1755
原创 springAop原理之(四)查找和原始bean关联的Advisor
spring如何判断bean是否需要被代理spring在创建完bean后,需要判断是否需要给当前bean创建代理对象。initializeBean时会调用applyBeanPostProcessorsAfterInitialization方法,该方法会调用所有BeanPostProcessor的postProcessAfterInitialization。AbstractAutoProxyCreator就是一个BeanPostProcessor,该类的postProcessAfterInitiali
2022-04-29 10:19:15
1218
原创 Spring Security filter探究(一)
Spring Security架构可以看出,Spring Security是通过内部的过滤器链实现认证和授权逻辑的。Spring Security内部的过滤器是有先后顺序的。比如UsernamePasswordAuthenticationFilter如果认证成功,那么AnonymousAuthenticationFilter肯定就不需要设置匿名者了。所以UsernamePasswordAuthenticationFilter在AnonymousAuthenticationFilter之前。具体顺序可看官网
2022-04-28 14:54:29
1188
原创 SpringSecurity HttpSecurity链式调用探究
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar
2022-04-24 11:32:37
744
原创 mybatis plus 分页插件 排序报JSQLParserException记录
1、错:group_concat(DISTINCT oad.brand SEPARATOR ",") 对:group_concat(DISTINCT oad.brand SEPARATOR ',')最后的分割符只能使用单引号2、错:sum(table.x==0) as s对:sum(if(table.x==0,1,0)) as ssum中写条件时,需使用if表达完整,不能简写...
2021-11-10 20:29:55
840
原创 shiro filter在基于spring的web中的执行流程
概述我们知道filter都是通过doFilter方法处理相关逻辑。通过源码可以发现,shiro所有的filter的doFilter方法只有OncePerRequestFilter中有。OncePerRequestFilter也是我们平时所用到的shiro的filter的抽象父类。且该方法是final的。public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChai
2021-06-19 01:16:17
697
原创 java Stream 初探(二)Collector
一、Collector简单介绍将输入元素累积到可变结果容器中的可变归约操作,可选择在处理完所有输入元素后将累积结果转换为最终表示。 归约操作可以顺序执行,也可以并行执行。Collector由四个函数指定,这些函数一起工作以将条目累积到可变结果容器中,并可选择对结果执行最终转换。 他们是:创建新的结果容器( supplier() 供应器) 将新数据元素合并到结果容器中( accumulator() 累加器) 将两个结果容器combiner() 组合器) 在容器上执行可选的最终转换( finish
2021-06-08 19:39:58
511
2
原创 java Stream 初探(一)
一、概述支持顺序和并行聚合操作的元素序列。为了执行计算,流操作被组合成一个流管道。 流管道由源(可能是数组、集合、生成器函数、I/O 通道等)、零个或多个中间操作(将流转换为另一个流,例如filter(Predicate) ) 和终止操作(产生结果或副作用,例如count()或forEach(Consumer) )。 流是懒惰的; 对源数据的计算只在终止操作启动时进行,源元素只在需要时被消费。多数数据流操作都接受一些lambda表达式参数,函数式接口用来指定操作的具体行 为。这些操作的大多数必须是无
2021-06-07 20:10:07
392
4
原创 基于easyexcel通用的行、列单元格合并
看本片之前可以先开这篇文章。合并原理都在其中讲了,该篇文章不讲原理,只是添加了列的合并和将上篇文章的问题修改后做了整理和稍作修改(为了支持列合并)。目录AbstractGenericMergeStrategy是抽象的通用合并策略列合并行合并其它辅助类relativeRowIndex用途AbstractGenericMergeStrategy是抽象的通用合并策略public abstract class AbstractGenericMergeStrategy<T ..
2021-05-26 11:28:15
7735
原创 StampedLock浅析(二)
队列示例按照如下顺序获取锁:写节点1 、读节点1 、读节点2、 读节点3、 写节点2 、读节点4 、读节点5结论:写线程入队直接插入队尾 读节点入队,如果队尾是写节点,直接插入到队尾。如果是读节点,插入到队尾节点的cowait链中。插入是按照栈的结构插入,即后进先出。 唤醒带有cowait链的读节点时,会唤醒所有链上的读节点,按照后进先出的顺序依次唤醒。只有当所有读节点都释放锁时,才会唤醒下一个写节点节点状态0:初始状态-1:等待中(由后驱节点设置,和AQS中一...
2021-03-31 12:52:44
162
原创 StampedLock浅析(一)
一种基于功能的锁,具有三种模式来控制读/写访问。 StampedLock的状态由版本和模式组成。 锁获取方法返回一个戳记(stamp),表示锁状态的访问控制; 这些方法的“尝试”版本可能会返回特殊值零,以表示无法获取访问权限。 锁释放和转换方法需要使用戳记作为参数,如果它们与锁的状态不匹配,则会失败。三种模式是: 写。方法writeLock可能会阻塞以等待独占访问,返回可以在方法unlockWrite使用的戳记stamp以释放锁。还提供了tryWriteLock不定时版本和定时版本。 当锁保持在写
2021-03-30 12:53:48
418
原创 ReentrantReadWriteLock源码浅析
一、ReadWriteLock概述ReadWriteLock维护一对关联的locks ,一个用于只读操作,一个用于写操作。 只要没有写程序, read lock就可以同时由多个read lock线程保持。 write lock是排他的。所有ReadWriteLock实现都必须保证writeLock操作(在Lock接口中指定)的内存同步效果对于关联的readLock也保持不变。 也就是说,成功获取读锁的线程将看到在先前释放写锁时所做的所有更新。与互斥锁相比,读写锁在访问共享数据时允许更高级别的并发性。
2021-03-25 11:24:07
313
原创 CountDownLatch共享锁源码分析
CountDownLatch作用于使用场景不做说明,可看下其它文章。这里只分析源码。await方法public void await() throws InterruptedException { sync.acquireSharedInterruptibly(1);}直接调用AbstractQueuedSynchronizer的acquireSharedInterruptibly方法 public final void acquireSharedInterruptibly(...
2021-03-19 13:35:33
205
原创 JUC中Condition分析
一、概述Condition将Object监控器方法( wait , notify和notifyAll )分解为不同的对象,通过将它们与任意Lock实现结合使用,可以使每个对象具有多个等待集。 当“ Lock替换了synchronized方法和语句的使用时,“ Condition替换了“对象”监视器方法的使用。Conditions条件(也称为条件队列或条件变量)提供了一种手段,为一个线程暂停执行(“等待”)直到另一线程通知某些状态条件现在为真。 由于对该共享状态信息的访问发生在不同的线程中,因此必须对
2021-03-17 11:23:28
539
原创 thread中断相关方法区别interrupt、interrupted和isInterrupted
public static boolean interrupted() { return currentThread().isInterrupted(true); }isInterrupted测试此线程是否已被中断。 线程的中断状态不受此方法的影响。由于此方法返回false,因此会反映出线程中断而被忽略,因为该线程在中断时还没有处于活动状态 public boolean isInterrupted() { return isInterrupt...
2021-03-11 22:47:28
302
原创 浅谈ThreadPoolExecutor
转载:https://www.cnblogs.com/trust-freedom/p/6681948.html
2021-03-10 13:39:16
110
原创 ConfigurationClassPostProcessor
文档翻译用于对@Configuration类进行引导处理。此后处理器按优先级排序,因为在任何其他BeanFactoryPostProcessor执行之前, @Configuration类中声明的任何Bean方法都必须注册其对应的Bean定义,这一点很重要。作为BeanDefinitionRegistryPostProcessor的扩展回调@Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry
2021-02-06 20:22:14
499
原创 springboot2.1.7启动 AbstractApplicationContext refresh(三)
目录registerListeners()finishBeanFactoryInitialization(beanFactory)finishRefresh()registerListeners()检查侦听器bean并注册它们。 protected void registerListeners() { // Register statically specified listeners first. for (ApplicationListener<?> lis
2021-01-28 00:32:42
230
1
原创 springboot2.1.7启动 AbstractApplicationContext refresh(二)
invokeBeanFactoryPostProcessors(beanFactory)调用在上下文中注册为bean的工厂处理器。(实例化并调用所有注册的BeanFactoryPostProcessor Bean,并遵循显式顺序(如果给定的话)。必须在单例实例化之前调用) protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegis
2021-01-27 13:59:07
327
原创 springboot2.1.7启动 AbstractApplicationContext refresh(一)
prepareRefresh()准备此上下文以进行刷新,设置其启动日期和活动标志以及执行属性源的任何初始化。ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()告诉子类刷新内部bean工厂。beanFactory为DefaultListableBeanFactory。prepareBeanFactory(beanFactory)配置工厂的标准上下文特征(设置beanFactory的各种属性) p
2021-01-25 22:34:10
186
1
原创 springboot2.1.7启动分析(三)SpringApplication run
context = createApplicationContext();因为时servlet,所以会去实例化org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext这个context 。GenericApplicationContext是其父类,所以会执行GenericApplicationContext无参构造函数,这就是我们看到的ApplicationContext
2021-01-21 10:03:09
637
原创 springboot2.1.7启动分析(二)SpringApplication run
SpringApplicationRunListeners listeners = getRunListeners(args); private SpringApplicationRunListeners getRunListeners(String[] args) { Class<?>[] types = new Class<?>[] { SpringApplication.class, String[].class }; return new SpringApp..
2021-01-18 16:58:13
405
原创 springboot2.1.7启动分析(一)SpringApplication实例化
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { this.resourceLoader = resourceLoader; Assert.notNull(primarySources, "PrimarySources must not be null"); this.primarySources = new LinkedHashSet<>(Arr..
2021-01-17 23:29:17
336
原创 doCreateBean方法中BeanCurrentlyInCreationException解析
populateBean(beanName, mbd, instanceWrapper); exposedObject = initializeBean(beanName, exposedObject, mbd); 。。。。 if (earlySingletonExposure) { Object earlySingletonReference = getSingleton(beanName, false); if (earlySingleto...
2020-11-18 23:37:38
336
原创 简化版的easyexcel取消默认表头样式,且支持回调以达到不同表头样式差异化
在easyexcel 取消默认的表头样式这篇文章中,夹带了基于注解单元格内容格式的设置。下方代码仅仅只是取消表头,不包含单元格内容格式设置。一方案、下方代码依旧是基于easyexcel自定义的WriteCellStyle,ExcelStyleAnnotationAndCancelDefaultHeadStyleCellWriteHandler.buildHeadCellStyle方法可在easyexcel 取消默认的表头样式中找到该方法。headStyleConsumer回调可用于不同单元格的表头内容.
2020-11-16 10:35:24
4043
原创 记录一次由SqlSessionFactory引起的BeanCurrentlyInCreationException
一、项目概况 项目中使用了mybatis-plus-boot-starter这个依赖。为了实现数据权限同一处理,自定义了一个数据权限的拦截器,该拦截器实现了mybatis的Interceptor接口(public class DataScopeInterceptor implements Interceptor)。项目中还使用了shiro做权限处理。二、分析 由于ShiroFilterFactoryBean实现了BeanPostProcessor接口(spring扩展接...
2020-11-05 10:35:08
666
1
原创 easyexcel基于注解的通用的可回调的更精细的单元格格式设置(二),支持富文本回调设置
上片文章easyexcel基于注解的可回调的更精细的单元格格式设置一中只能根据本字段的值的情况设置不同样式,但如果该字段单元格样式受到其它字段值影响,则无法实现。于是衍生出了该方案。 该方案也有方案一中两个Consumer,且多了一个richTextConsumer用于设置富文本,CommonCallBackData只是对于字体和单元格样式类等的封装而已。多了一个List<T> dataList,该dataList也包含在CommonCallBackData中,在回调时会将该集...
2020-10-22 12:24:45
1986
2
原创 easyexcel基于注解的可回调的更精细的单元格格式设置(一)
在https://blog.youkuaiyun.com/sinat_33472737/article/details/103660527这篇文章中,我们通过注解实现了每一列的单元格格式精确控制,但如果想要让同一列的数据可以有不同的样式,则无法实现。例如对于同一列的值,值在某种情况下需要使用红色字体,其它情况使用默认字体。对于这种情况,可以添加回调来实现。方案一 下方代码与https://blog.youkuaiyun.com/sinat_33472737/article/details/103660527文章中...
2020-10-20 09:53:30
1977
1
原创 spring循环依赖简单图示例
从上图可以看出,只有循环依赖的对象才会放到earlySingletonObjects中(A),不存在的直接从singletonFactories 进入到singletonObjects中(B,C)singletonObjects :单例对象列表singletonFactories :单例工厂列表earlySingletonObjects: 循环对象依赖列表,对象在创建之后,进行注入过程中,发现产生了循环依赖,那么会将对象放入到这个集合,并且从singletonFactories中移除掉...
2020-07-23 12:33:31
286
原创 模拟mybatis-plus使用lambda多表联查
代码地址:https://github.com/gitzhangliang/zlearn-web/blob/master/src/main/java/com/zl/model/sql说明:此代码的封装并不适用于mybatis,只是模拟了mybatis-plus的LambdaQueryWrapper进行多表联查,最终生成的sql采用?号占位符,占位符的值封装在一个List<Object>中,可适用于jdbcTemplate。 如果使用过mybatis-plus的LambdaQ...
2020-07-09 18:17:14
24243
1
原创 apache Digester读取xml
xml<CodeIssueCollection> <CodeIssue> <Priority>2</Priority> <Severity>High</Severity> <Title>Comment Appears to Contain Password</Title> <Description>
2020-07-03 16:38:53
204
原创 springboot mybatis mapper源码浅析
MybatisAutoConfiguration是mybatis在springboot下自动配置类,该配置类向spring容器注入了SqlSessionFactory和SqlSessionTemplate,注入的SqlSessionFactory是通过SqlSessionFactoryBean的getObject()获取到的。SqlSessionFactoryBean通过buildSqlSessionFactory()创建SqlSessionFactory时,会通过MapperRegistry添加mapp.
2020-05-29 14:27:31
440
1
原创 easyexcel通用的行的单元格合并策略
elementUI table单元格合并需要返回如下数据,代表的就是要合并的行数,列数。下面只讨论行的合并。 objectSpanMethod({ row, column, rowIndex, columnIndex }) { if (columnIndex === 0) { if (rowIndex % 2 === 0) { return { rowspan: 2, cols
2020-05-25 19:32:41
12073
5
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人