自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(318)
  • 收藏
  • 关注

原创 AOP-前置原理-怎么判断和拦截?

【代码】AOP-前置原理-怎么判断和拦截?

2024-09-20 23:37:52 264

原创 AOP-基础概念

AOP 的概念Aspect-Oriented Programming (AOP):面向切面编程,是一种编程范式,用于分离横切关注点(cross-cutting concerns),即将那些分散在多个模块中的公共行为(如日志记录、事务管理、安全控制等)集中管理和实现。AspectJ 的定义AspectJ 是一种流行的 AOP 框架,它扩展了 Java 语言,提供了专门的语法来定义切面(aspect)。AspectJ 可以在编译时或运行时对程序进行切面的编织(weaving)。

2024-09-20 15:56:43 380

原创 为什么需要AOP?AOP可以做什么?

AOP基础

2024-09-20 15:39:09 390

原创 Java-测试-Mockito 入门篇

这样也确实是单元测试,只不过这个只是其中的一方面。如果你的某个方法并不依赖于Spring容器,也需要启动整个Spirng环境吗?启动这个环境可能是比较耗时间的。本文对Mockito框架做一个初步探索,找找写单测的感觉。

2024-09-19 20:42:26 720

原创 Spring-循环依赖

接下来就是调用了addSington,里面如果判断是新创建的Sington做了这样几件事情:1)移除将当前Bean放到singtonObjects中 2)将singtonFactories中的singleFactory移除。这就解决了循环依赖,我的理解是通过Map存储早期的Bean,然后注入的也是早期的Bean,等到它依赖的Bean完成注入的时候,注入的早期的Bean的引用也会发生变化,类似于一个延迟加载。然后回到了ClassRoom,这个时候Student的Bean已经进行了创建,进行注入即可。

2024-09-07 17:28:08 1298

原创 Spring-@Bean的处理流程

这两个的区别是static直接调用方法所以它的加载不依赖于Configration的Bean实例,普通实例方法依赖于Configration这个配置类,也就是Configration这个类先要变为Bean然后进行普通方法@Bean的处理。这里还需要注意ConfigurationClassPostProcessor的优先级是优先里面最低的(也就是要优先处理,但是处理的优先尽量靠后)。2 静态@Bean也就是标注在static方法上的 实例@Bean标注在普通方法上的。

2024-09-07 10:41:36 556

原创 MyBatis-MappedStatement什么时候生成?QueryWrapper如何做到动态生成了SQL?

可以很清晰的看到QueryWrapper这个参数给我们内置了名称ew。那么怎么根据我们QueryWrapper里面的条件生成SQL的?前面我们提到继承BaseMapper的MappedStatement注册,这里面其实又根据不同的CommandType生成了不同的动态SQL语句。后面就是把真正的值填进去执行查询操作了。

2024-09-05 17:01:36 680

原创 MyBatis-SQL-语句执行流程

如下图所示,如果MethodCache里面存在方法,则判断这个方法是否为default方法,如果不是默认,会被当前的Mapper继承,如果是default方法则创建PlainMethodInvoker对象进行执行。确实是的,我看个配置默认是true,而官网说true是开启二级缓存,可能不太一样。我们可以看到查询以后就被缓存了,这里的缓存是可以配置的有两种方式。以查询列为例子会转到SqlSesson,这里真正的类名是SqlSessionTemplate,它也实现了SqlSesson接口。

2024-09-02 22:09:11 690

原创 Mybatis-Mapper扫描 与 代理

然后我们又可以看到MapperScannerConfigurer实现了BeanDefinitionRegistryPostProcessor接口,往上就是BeanFactoryPostProcessor,在IOC刷新的时候FactoryPostProcessor会被调用,所以核心工作都是MapperScannerConfigurer来完成。那如果我们没有写@MapperScan呢?Scanner在做扫描的时候最终调用的是父类的方法,并且我们可以看到,MapperScan配置的包路径在这里出现。

2024-09-02 14:36:02 746

原创 源码阅读-SpirngBoot Mybatis 自动配置

ObjectProvider为我们提供了拓展,我们可以自定义一些插件或者类型转换器,同时也可以定义一些Customizer用来配置SqlSessionFactoryBean,MybatisPlusProperties等。可以看到我们在MybatisPlusAutoConfiguration就能拿到这个TypeHandler,这是为我们保留的拓展点,方便我们进行自定义拓展,我们也要从中学习这种设计。SqlSessionFactory做的事情非常的多,我们慢慢来看。

2024-08-31 17:25:57 428

原创 SpringBoot-启动流程

我们平时使用注解驱动比较多,我们来看看看这个AnnotatedBeanDefinitionReader做了什么事情?我们可以很清晰的看到在这里执行了真正的调用,这样一来,我们的BeanDefinition就会被加载。好了这些重点逻辑看完了,下面就是我们比较熟悉的Spirng Context刷新了。

2024-08-30 15:53:46 493

原创 FeignClient-调用流程

好我们继续看拦截器以后的逻辑,可以看到通过Client调用了execute方法,Client的类型是LoadBalancerFeignClient。那么为什么会是LoadBalancerFeignClient类型呢,是因为在创建对象的时候就是LoadBalancerFeignClient。首先请求会被FeignInvocationHandler 进行拦截,然后dispatch找到应的方法进行调用。这块就非常的关键了ILoadBalancer,这个ILoadBalancer哪里来的呢?那么拦截器从那里来呢?

2024-08-30 09:47:43 287

原创 源码阅读-FeignClient如何创建代理对象?

这里是为每个FeignClinet创建了一个AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();我们可以看到有一个FeignClientFactoryBean非常关键说明我们创建对象是FeignClientFactoryBean来创建的,这里写的是函数是编程引用了创建对象的方法,那么怎么和IOC容器创建对象的时候进行打通的呢?2 如果为空则扫描标注有FeignClient的类,进行注册。

2024-08-29 16:22:19 315

原创 Spring-AOP-API设计与实现

在 Spring AOP 中,它主要指代的是应用程序中的某个特定点,在这个点上可以应用切面(Aspect)的逻辑。IntroductionAdvisor提供了动态设置范围的能力,比如我们实现了两个接口,但是我们只想其中的一个接口被代理,或者我们希望拓展一个接口(当然这个接口最好是被我们的目标对象所实现)这个类下面的子类通常是工厂类,这个类存储了Advices 和 Advisors ,TragetSource等 但是没有实现创建代理对象的方法,创建对象的方法是被子类实现。

2024-08-27 09:58:03 846

转载 Spring-类型转换

这里进行注册时候后名称必须为conversionService。我们会发现,我们写的值会被转换为Properties对象。3 Spring拓展PropertyEditor。5 自定义PropertyEditor拓展。6 PropertyEditor 设计缺陷。4 Spring内建实现。

2024-08-22 17:13:06 31

转载 Spring-数据绑定

Spring BeanDefinition 到Bean实例创建。Spirng Web 参数绑定(WebDataBinder)Spring 数据绑定(DataBinder)

2024-08-22 17:11:27 26

转载 Effective-Java-Chapter11-并发

当多个线程共享可变数据时,每个读取或写入数据的线程都必须执行同步。在缺乏同步的情况下,不能保证一个线程的更改对另一个线程可见。同步共享可变数据失败的代价是活性失败和安全失败。这些工具只是对调度器的提示。线程优先级可以少量地用于提高已经工作的程序的服务质量,但绝不应该用于「修复」几乎不能工作的程序。作为规则,你应该在同步区域内做尽可能少的工作。更一般地说,将你在同步区域内所做的工作量保持在最小(也是降低锁的粒度)。注解什么是外来方法:通常指的是在一个线程或同步区域中调用另一个线程或不同同步区域的方法。

2024-08-21 17:54:33 36

原创 RestTemplate-源码阅读

我们可以看到有两种回调函数,都是RestTemplate的内部类。我们来看看,其实一眼就能看到,核心的逻辑都是委托给ClientHttpRequestFactory来实现的。这个工工厂提供了我们自定义拦截器进行处理的能力,这里可以进行一些自定义的拓展。至于如何选择Converters是通过下面这个方法,canWrite 是发送请求的时候些Body,canRead是调用结束以后读取Body。我们可以看到其实没有什么本质的区别,只是在创建CallBack的时候会有一点区别。2 核心API用来进行数据提取。

2024-08-21 13:27:19 1025

原创 CompletableFuture-应用

可以看到CompletableFuture实现了CompletionStage 和Future的两个接口。CompletionStage提供了任务之间的衔接能力,而Future则是经常用于阻塞获取结果。CompletableFuture 的内部使用了基于 ForkJoinPool 的线程池,这种线程池可以高效地调度和执行任务。CompletableFuture 的非阻塞特性得益于其对任务完成的监听机制。当任务完成时,它会遍历所有注册的回调函数,并在合适的线程中执行这些回调。

2024-08-20 22:17:35 384

原创 Effective-Java-Chapter10-异常

通过抛出一个 checked 的异常,你可以强制调用者在 catch 子句中处理异常,或者将其传播出去。只有当在失败的情况下,提供的信息不充分时,你才应该抛出一个 checked 异常。如果一个方法声明抛出受检异常,则调用该方法的代码必须要么捕获这个异常,要么在其方法签名中声明抛出此异常。定义:运行时异常是在运行时发生的异常,编译器不会强制要求处理这些异常。没啥好说的,意思就是可以使用定义好的标准异常,当然我们也可以自定义标准异常。高层应该捕获低层异常,并确保抛出的异常可以用高层抽象解释。

2024-08-20 17:53:17 909

原创 Effective-Java-Chapter9-通用程序设计

书中这个例子,是一个接口,但是具体的实例却是由反射进行创建的,并且类的名称是通过参数类确定了,这就是反射结合接口的最佳实践。同时这个实践是我们不确定类型的时候,也就是说如果我们确定了类型,最好是使用接口直接引用,因为反射有自己的缺陷。我们可以看到第二个while循环引用了上面的变量I但是我们实际上的期望是引用i2所以不符合预期,产生bug,如果我们使用传统的for,我们引用不到i这个变量。第二,基本类型只有全功能值,而每个包装类型除了对应的基本类型的所有功能值外,还有一个非功能值,即 null。

2024-08-20 16:58:10 997

原创 Effective-Java-Chapter8-方法

与返回基本数据类型相比,返回包含包装类的 Optional 类型的代价高得惊人,因为 Optional 类型有两个装箱级别,而不是零。这句话显而易见,我们使用Optional是为了避免空指针的问题,但是直接返回空那还需要Optional 做什么呢。你应该简单的返回一个空的 List,而不是一个空的 Optional。这个准则告诉我们如果我们对象中的数据是不可变的,那我们我们一定要保证它一定不可变,不能破坏它。这样外面的怎么操作都是在副本上操作,绝对不会影响到我们真正的数据,保证了数据的安全性。

2024-08-20 15:25:29 569

原创 Effective-Java-Chapter7-λ表达式和流

Collection 接口是 Iterable 的一个子类型,它有一个流方法,因此它提供了迭代和流两种访问方式。流范式中最重要的部分是将计算构造为一系列转换,其中每个阶段的结果都尽可能地接近上一阶段结果的纯函数。纯函数的结果只依赖于它的输入:它不依赖于任何可变状态,也不更新任何状态。流管道的计算是惰性的:直到调用 Terminal 操作时才开始计算,并且对完成 Terminal 操作不需要的数据元素永远不会计算。如果你并行的每个流没有依赖关系就可以使用,也就是说每个流的结果是相互独立的,是不具有状态的。

2024-08-19 10:25:12 854

原创 Effective-Java-Chapter6

你可能听过一个说法:标记接口已经过时,更好的方式是标记注解(Item-39)。这个言论是错误的。与标记注解相比,标记接口有两个优点。首先,标记接口定义的类型由标记类的实例实现;标记注解不会。标记接口类型的存在允许你在编译时捕获错误,如果你使用标记注解,则在运行时才能捕获这些错误。例如序列化是个标记接口,这样如果流在写对象的时候,可以判断这个是否实现了Serializable,这个是在编译的时候就能做到的。对比:使用标记注解的情况。

2024-08-17 11:10:36 681

原创 Effective-Java-Chapter5-泛型

因为这样存在类型安全,假如第一步中的创建是合法的,那么由于前面提到的sub[] 和 super[]存在父子关系,所以第三步是合法的,那么在第四步我们这个操作完全没毛病吧,反正是一个对象类型的数组都可以存,但是使用的时候这就报错了ClassCastException。我们不能确定具体是什么类型,但可以确定它一定是Number的一个子类。这样是不是更通用了,答案是如果你还是像上面那样使用,编译通不过,问题就在于你传入的是List《String》,但是往里面添加的元素却是Object类型,类型是不匹配的。

2024-08-13 13:36:15 1034

转载 REST-API 服务端设计技巧

原文:https://github.com/mercyblitz/java-training-camp/tree/main/stage-1/src/biz-project。

2024-08-10 20:19:09 37

原创 模块工程构建技巧-看完没有收获你来砍我哈哈哈

dubbo 也引用了Spring FrameWork,如果我们将Dubbo放在前面看到了木有,用的就是2.7.8里面的依赖。pom 的继承也是单继承,那如果这个时候我们父工程比如继承了apache,但是我们又想继承Spring Boot怎么办呢?我们可以使用 Maven 的optional 为true这个选项。我们可以采用BOM的方式,这样的话不是继承而是聚合模块,效果和Parent是一样的。好首先咋们把这个配置放到这里,那么这个插件有什么用呢?看到了木有,我们只需要修改一个地方,所有的版本都统一了。

2024-08-07 23:32:39 814

原创 Effective-Java-Chapter4

当一个类实现了一个接口时,这个接口作为一种类型,可以用来引用类的实例。因此,实现接口的类应该说明使用者可以对类的实例做什么。为其他任何目的定义接口都是不合适的。在实践中我们往往会将一些常量放到接口中,但是书中作者似乎更推荐我们把常量放到类中。

2024-08-07 13:46:59 971

原创 Effective-Java-Chapter3

传递性:对于任何非空的引用值 x, y, z,如果 x.equals(y) 返回 true,y.equals(z) 返回 true,那么 x.equals(z) 必须返回 true。一致性:对于任何非空的引用值 x 和 y, x.equals(y) 的多次调用必须一致地返回 true 或一致地返回 false,前提是不修改 equals 中使用的信息。对称性:对于任何非空参考值 x 和 y,x.equals(y) 必须在且仅当 y.equals(x) 返回 true 时返回 true。

2024-08-05 14:53:44 774

原创 Spirng-事务-基础知识 +源码阅读 + 如何控制Mybatis公用一个session?

事务,就是一组操作数据库的动作集合。事务是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交。由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态。

2024-08-05 09:45:43 281

原创 Effective-Java-Chapter2

如果说我们这个函数调用的比较频繁,就会创建大量的对象,可能会增加monitor GC的频率,影响性能。比如说这个类,我们要检查单词拼写的正确性,我们需要一个参考标准,而这个标准就是Lexicon这个字典,这样写代码好像貌似完全可行。这个准则更适合应用在我们使用的对象可以复用并且创建它的成本是比较大的,如果成本可以忽略不计也没有必要。这个准则主要是由于,有的时候我们这类的作用仅仅是将一些通用的方法聚集在一起,比如我们这个方法是工具类。差距既然如此之大,原因就在于使用包装类创建了很多不必要的对象。

2024-08-04 15:38:45 1081

原创 Spring-原理篇-RequestMappingHandlerMapping 全流程是怎样的呢?

到这里我们又看到了亲爱的mappingRegistry,嘿嘿就是这里没错啦,就是在这里去查找了对应的处理。在初始化的时候Spring MVC 注册了如下的几种HandlerMaping 其中RequestMappingHandlerMapping是负责处理Http请求的。我们可以看到在这个AutoConfigurationSupport中,注册了这个RequestMappingHandlerMapping 这个Bean。是不是比较熟悉了看到这个注解RequestMapping。

2024-07-30 11:29:16 316

原创 Spring-原理篇-DispatcherServlet 初始化 怎么和IOC进行了打通?

委托模式的体现,在初始化醒目的时候Spring MVC为我们提供了一个DispatcherServlet,映射了所有的路径,所有的请求都会先到达这里然后被转发到具体的Controller 进行处理,此文来探索一下,DispatcherServlet 初始化的时候是怎么和Spring IOC打通的。

2024-07-29 17:04:43 557

原创 好文阅读-JWT

虾皮二面:什么是 JWT?如何基于 JWT 进行身份验证?决定放弃使用JWT了!

2024-07-28 14:39:32 195

原创 好文阅读-线程池的使用

1)不要在代码中使用局部变量定义线程池对象,这样不仅会导致频繁创建线程池对象,违背了线程复用的设计原则,还有可能造成局部变量的线程池对象无法及时垃圾回收的内存泄漏问题;submit(Runnable r):返回值为Future类型,future可以用来检查任务是否已经完成,获取任务的结果等,适用于需要处理返回结果的任务;execute(Runnable r):没有返回值,仅仅是把一个任务提交给线程池处理,轻量级方法,适用于处理不需要返回结果的任务;5) 请捕获线程池中子任务的代码异常。

2024-07-23 15:17:01 205

原创 问题记录-SpringBoot 2.7.2 整合 Swagger 报错

报错背景,我将springboot从2.3.3升级到了2.7.2,报了下面的错误:排查:跟踪到时这里空指针WebMvcPatternsRequestConditionWrapper#getPatterns这里之所以为空是因为,这里走了PATH_PATTERN_PARSER默认走的是这个策略:走这个默认策略就会设置WebMvcAutoConfiguration#configurePathMatch,然后调用setPatternParser然后子build逻辑的时候,如果patternParser不

2024-07-22 11:18:48 470

原创 问题记录-Spring Security- bean httpSecurity not found

我使用的是Springboot 2.3.3, 发现没有HttpSecurity注入Bean,SecurityFilterChain 是高版本的配置,所以不能在低版本使用。此次踩坑告诉我,配置照网上粘贴如果遇到错误,可以检查一下是不是网上的版本和自己使用的版本有差异。升级Springboot 使用版本2.7.2,因为高版本给我们注入了这个Bean。

2024-07-21 19:35:26 466

原创 数据库-分库分表-简单示例

【代码】数据库-分库分表-简单示例。

2024-07-20 18:41:04 252

转载 数据库-分区表

下面我们进行表的分区,就比如我们这张表的功能经常需要按照cyear 进行查询,并且cyear的数据量很大,这个时候可以考虑分区表。对比执行计划可以看到数据筛选数量减少了很多,如果设计到数据量大,且为大块的拆分可以考虑用分区表。分区表就是把大表按条件单独存储到不同的"物理小表"中,在构建出的完整"逻辑表"。

2024-07-17 19:54:15 42

原创 好文阅读-测试篇

Java编程技巧之单元测试用例简化方法(内含案例)从爬⾏到奔跑 - 我们为什么需要单元测试?Java单元测试典型案例集锦。万字长文:一文详解单元测试干了什么。那些年,我们写过的无效单元测试。

2024-07-17 17:17:41 92

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除