Spring | 代理Bean生命周期
这篇文章主要会讲述代理Bean的整个加载过程,与普通Bean的加载过程,但是还是会有一些的区别。接下来讲述关于代理Bean的整个流程,和普通Bean类似的流程就不讲述了,可以看看往期文章。
1.代理Bean的加载
代理Bean的加载主要是在初始化后的后处理器阶段完成创建代理Bean,此时目标类加载过程已经基本完成。代理Bean不会对目标Bean中的属性进行注入,他只会将目标Bean注入,到时需要通过属性去调用的时候可以直接拿到目标Bean中的属性去调用,因为目标Bean中所有的Bean都已经完成了属性填充了。
生成代理的逻辑主要来自于AbstractAutoProxyCreator###postProcessAfterInitialization,该方法内部有个方法wrapIf...
Spring | 普通Bean生命周期
1.前言概述
Spring Bean的生命周期是我们老生常谈的话题,不仅是高频面试题,也是我们对Spring的理解的入门。在Spring中,万物皆为Bean,统统由Spring容器进行管理,在需要的时候即可提供。我想我们都知道Spring中的两大亮点:
AOP 面向切面编程
IOC 控制反转
这篇文章主要围绕Bean对象的IOC来聊聊, 其实无论是IOC还是DI(依赖注入),这两种表达的都是一种概念,只是角度问题,就和我们生活中的坐北朝南一样,其实坐北也就是背靠着北实际上就是朝南。IOC控制反转,将对象的管理权交给了容器,是从容器角度触发;依赖注入是将容器中的对象注入到对应Bean对象,是从对象的角度出发的。基于此,我们来看看Spring是如何把对象加载完成放入容器,...
其实parallelStream流真的没那么快
大家在使用parallelStream的初衷,我理解应该是为了程序更快的完成,实际上并非如此,甚至起反作用,这篇文章主要是通过实验的方式来说明parallelStream并没有大家想象的那么快。
1.简单介绍
说到parallelStream,我们就不得不提ForkJoinPool,因为并行流的内部使用的就是这种类型线程池。简单描述一下这个线程池:
该线程池对计算型的任务很友好,对IO型的任务显得很无力;
使用递归的方式将一个任务拆分成各个小任务;
现在很多开发者在吹嘘ForkJoinPool的性能多么牛逼,其实用对场景还是很可观的,用错了那简直就是灾难。我有理由怀疑那些使用并行流的作者是不是也是ForkJoinPool的吹嘘者。下面我将会通过实验结果来说明paral...
JDK — 我以为有用的新特性
很兴奋,我们的项目升级到了JDK17,接下来就介绍一些关于JDK中个人觉得有用的功能,毕竟升级了要有升级的样子,不要一层不变吃老本,会被diss的。当然也会穿插一些个人感觉很鸡肋的功能,会阐述其鸡肋的理由。
1.Optional类的增强
1.1 Stream — Optional流化 (JDK9)
//1.单个对象的流化
Optional.ofNullable("testString").stream().toList();
//2.对象中的属性流化
LoginUser loginUser = new LoginUser();
loginUser.setName("Test");
List<String> list = Arrays.asL...
行为参数化 一脉相承:Lambda与匿名内部类之间的故事
匿名内部类与Lambda表达式的初衷是相同的:行为参数化,换句话说就是可以将方法作为参数进行一个传递。
1. 两者的执行流程
基于匿名内部类方式:
//使用匿名内部类的 java文件
public class LambdaTest {
public static void main(String[] args) throws Exception {
print(new Switch() {
public String switchLowerCase(String str) {
return str.toLowerCase();
}
});
}
...
理解Spring事件机制的前因后果
今天咱们聊聊Spring中的事件,你也可以理解成消息,这是典型的观察者模式的实现,其主要目的是用于项目解耦。
Spring的事件默认是同步方式,不是所有的事件都是异步!!!
事件三要素:
发布者
订阅者(监听器)
事件主体
1.事件监听任务
1.1 通过实现接口
//定义事件主体
@Data
public class CurrentUser extends ApplicationEvent {
private String name;
private int age;
public CurrentUser(Object source, String name, int age){
super(source);
...
理解Spring动态代理的前世今生
我对代理的理解就两个字:增强, 脱离增强谈代理都是耍流氓
在代理中有两个概念:目标类 和 代理类
由于目标类对某些功能存在缺失,代理类通过增强弥补目标类的功能缺失。例如在某个方法前后打印日志,在执行使用事务时要对其自动提交功能关闭等。
说到增强,要么是在编译期生成的class文件对目标进行增强,要么就是运行期间使用代理字节码文件对其增强;
1.Aspectj增强 — 编译期
1.引入maven的插件
该插件会导致Lombok插件失效,比如通过@Data注解生成get set方法调用的地方会报红。
<build>
<plugins>
<plugin>
<gr...
注解与反射
1.元注解
元注解是用于解释注解的注解,java中提供了四个元注解,分别是:
@Target 用于描述注解的作用范围,可用于字段、方法、类等
@Retention 用于描述注解的生命周期(Source < class < runtime)
@Inherited 用于描述该注解可以在类中继承
@Document 用于在javadoc中使用,如果加上该注解,则在javadoc中显示注解修饰的内容。
2.自定义注解
public class TestMyAnnotation {
@FirstAnnotation(name = "zhangsan")
private String name;
@SecondAnnotation("ag...
SpringCloud的FeignClient不能将header设置为Null值
1.问题产生
这是发生在最近的一个bug,同事将幂等Id设置到API请求的header里面,然后被调用方通过判断header中的该值是否为空进行处理。不为空走幂等逻辑,为空走重新创建新数据(非幂等)的逻辑。现在有个业务需要一直走非幂等逻辑,于是将Header的key设置成null值后不能走非幂等逻辑。
2.问题分析
模拟当时的代码:
SpringBoot 和 SpringCloud的依赖:
版本较老
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1....
自定义工具类消除if-else实现链式编程
工具类的主要代码
给大家提供一个思路:
public class BooleanUtils<T> {
private final boolean result;
public BooleanUtils(boolean result) {
this.result = result;
}
public static <T> BooleanUtils<T> isAnyMatch(Boolean... booleans) {
boolean result = Arrays.stream(booleans).filter(Objects::nonNull).anyMatch(Boolean::...
51 post articles, 6 pages.