Home

Spring | 代理Bean生命周期

这篇文章主要会讲述代理Bean的整个加载过程,与普通Bean的加载过程,但是还是会有一些的区别。接下来讲述关于代理Bean的整个流程,和普通Bean类似的流程就不讲述了,可以看看往期文章。 1.代理Bean的加载 代理Bean的加载主要是在初始化后的后处理器阶段完成创建代理Bean,此时目标类加载过程已经基本完成。代理Bean不会对目标Bean中的属性进行注入,他只会将目标Bean注入,到时需要通过属性去调用的时候可以直接拿到目标Bean中的属性去调用,因为目标Bean中所有的Bean都已经完成了属性填充了。 生成代理的逻辑主要来自于AbstractAutoProxyCreator###postProcessAfterInitialization,该方法内部有个方法wrapIf...

Read more

Spring | 普通Bean生命周期

1.前言概述 Spring Bean的生命周期是我们老生常谈的话题,不仅是高频面试题,也是我们对Spring的理解的入门。在Spring中,万物皆为Bean,统统由Spring容器进行管理,在需要的时候即可提供。我想我们都知道Spring中的两大亮点: AOP 面向切面编程 IOC 控制反转 这篇文章主要围绕Bean对象的IOC来聊聊, 其实无论是IOC还是DI(依赖注入),这两种表达的都是一种概念,只是角度问题,就和我们生活中的坐北朝南一样,其实坐北也就是背靠着北实际上就是朝南。IOC控制反转,将对象的管理权交给了容器,是从容器角度触发;依赖注入是将容器中的对象注入到对应Bean对象,是从对象的角度出发的。基于此,我们来看看Spring是如何把对象加载完成放入容器,...

Read more

其实parallelStream流真的没那么快

大家在使用parallelStream的初衷,我理解应该是为了程序更快的完成,实际上并非如此,甚至起反作用,这篇文章主要是通过实验的方式来说明parallelStream并没有大家想象的那么快。 1.简单介绍 说到parallelStream,我们就不得不提ForkJoinPool,因为并行流的内部使用的就是这种类型线程池。简单描述一下这个线程池: 该线程池对计算型的任务很友好,对IO型的任务显得很无力; 使用递归的方式将一个任务拆分成各个小任务; 现在很多开发者在吹嘘ForkJoinPool的性能多么牛逼,其实用对场景还是很可观的,用错了那简直就是灾难。我有理由怀疑那些使用并行流的作者是不是也是ForkJoinPool的吹嘘者。下面我将会通过实验结果来说明paral...

Read more

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...

Read more

行为参数化 一脉相承: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(); } }); } ...

Read more

理解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); ...

Read more

理解Spring动态代理的前世今生

我对代理的理解就两个字:增强, 脱离增强谈代理都是耍流氓 在代理中有两个概念:目标类 和 代理类 由于目标类对某些功能存在缺失,代理类通过增强弥补目标类的功能缺失。例如在某个方法前后打印日志,在执行使用事务时要对其自动提交功能关闭等。 说到增强,要么是在编译期生成的class文件对目标进行增强,要么就是运行期间使用代理字节码文件对其增强; 1.Aspectj增强 — 编译期 1.引入maven的插件 该插件会导致Lombok插件失效,比如通过@Data注解生成get set方法调用的地方会报红。 <build> <plugins> <plugin> <gr...

Read more

注解与反射

1.元注解 元注解是用于解释注解的注解,java中提供了四个元注解,分别是: @Target 用于描述注解的作用范围,可用于字段、方法、类等 @Retention 用于描述注解的生命周期(Source < class < runtime) @Inherited 用于描述该注解可以在类中继承 @Document 用于在javadoc中使用,如果加上该注解,则在javadoc中显示注解修饰的内容。 2.自定义注解 public class TestMyAnnotation { @FirstAnnotation(name = "zhangsan") private String name; @SecondAnnotation("ag...

Read more

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....

Read more

自定义工具类消除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::...

Read more