Spring-循环依赖
参考文献
spring:我是如何解决循环依赖的?
循环依赖
一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了构成一个环形调用;
自己依赖自己的直接依赖;
两个对象之间的直接依赖;
多个对象之间的间接依赖;
Spring如何检测循环依赖
创建单例Bean时,会调用下面的方法
1234567891011121314151617// org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean ==>// org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>) ==>// org.springframework.beans.factory.support.DefaultSingletonB ...
算法-排序
排序
公共方法
123456789101112131415161718192021222324252627 /** * 数组长度校验 * * @param arr 待校验的数组 * @return 当数组为空或者数组长度小于2时, 不用排序, 直接返回 */ private static boolean checkArray(int[] arr) { // 当数组为空或者数组长度小于2时,不用排序 return arr == null || arr.length < 2; }/** * 交换数据 -- 数组 * * @param arr 数组 * @param i 待交换的值 * @param j 待交换的值 */ private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] ...
Spring(十九)-ApplicationContext Lifecycle应用上下文生命周期
参考文献
Spring应用上下文准备阶段
org.springframework.context.ConfigurableApplicationContext#refresh
org.springframework.context.support.AbstractApplicationContext#prepareRefresh方法
启动时间: startupDate
状态标识: closed(false),active(true)
初始化:PropertySources initPropertySources()
校验Environment中必须属性
初始化事件监听器集合
初始化早期Spring事件集合
BeanFactory 创建阶段
org.springframework.context.support.AbstractApplicationContext#obtainFreshBeanFactory方法
刷新Spring应用上下文底层BeanFactory : refreshBeanFactory()
销毁或关闭BeanFactory: 如果已存在的话
...
Spring(十八)-Environment Abstraction
参考文献
理解Spring Environment抽象
统一的Spring配置属性管理
Spring Framework 3.1开始引入Environment抽象,它统一Spring配置属性的存储,包括占位符处理和类型转换,不仅完整地替换PropertyPlaceholderConfigurer,而且还支持更丰富的配置属性源PropertySource;
条件化Spring Bean装配管理
通过Environment Porfiles信息,帮助Spring容器提供条件化地装配Bean;
Spring Environment接口使用场景
用于属性占位符处理
用于转换Spring配置属性类型
用于存储Spring配置属性源(PropertySource)
用于Profiles状态的维护
Environment占位符处理
Spring 3.1前占位符处理
组件: org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
接口: org.springframework.util.Str ...
Spring(十七)-Annotations注解
参数文献
SpringBoot编程思想
Spring Annotation Programming Model
Spring注解驱动编程发展历程
注解驱动启蒙时代: Spring Framerwork 1.x
注解驱动过渡时代: Spring Framerwork 2.x
注解驱动黄金时代: Spring Framerwork 3.x
注解驱动完善时代: Spring Framerwork 4.x
注解驱动当下时代: Spring Framerwork 5.x
Spring核心注解场景分类
Spring模式注解
Spring注解
场景说明
起始版本
@Repository
数据仓储模式注解
2.0
@Component
通用组件模式注解
2.5
@Service
服务模式注解
2.5
@Controller
Web控制器模式注解
2.5
@Configuration
配置类模式注解
3.0
装配注解
Spring注解
场景说明
起始版本
@ImportResource
替换XML元素<import>
2.5
...
Spring(十六)-Events事件
参考文献
Java事件/监听器编程模型
设计模式-观察模式扩展
可观者对象(消息发送者): java.util.Observable
观察者: java.util.Observer
标准化接口
事件对象: java.util.EventObject
事件监听器: java.util.EventListener
事件模式中的几个概念
事件源: 事件的触发者.
事件: 描述发生了什么事情的对象.
事件监听器: 监听到事件发生的时候,做一些处理.
硬编码方式实现Spring事件
定义事件
自定义事件,需要继承ApplicationEvent类
定义监听器
自定义事件监听器,需要实现ApplicationListener接口,这个接口有个方法onApplicationEvent需要实现,用来处理感兴趣的事件.
创建事件广播器
创建事件广播器ApplicationEventMulticaster,这是个接口,可以自己实现这个接口,也可以直接使用系统提供的SimpleApplicationEventMulticaster
向广播器中注册事件监听器 ...
Spring(十五)-GenericResolution泛型处理
参考文献
Java泛型基础
泛型类型
泛型类型是在类型上参数化的泛型类或接口
泛型使用场景
编译时强类型检查
避免类型强转
实现通用算法
泛型类型擦写
泛型被引入到 Java 语言中,以便在编译时提供更严格的类型检查并支持泛型编程。类型擦除确保不会为参数化类型创建新类;因此,泛型不会产生运行时开销。为了实现泛型,编译器将类型擦除应用于:
将泛型类型中的所有类型参数替换为其边界,如果类型参数是无边界的,则将其替换为“Object”。因此,生成的字节码只包含普通类、接口和方法。
必要时插入类型转换以保持类型安全。
生成桥方法以保留扩展泛型类型中的多态性。
Java 5 类型接口
Java 5 类型接口 - java.lang.reflect.Type
派生类或接口
说明
java.lang.Class
Java 类 API,如 java.lang.String
java.lang.reflect.GenericArrayType
泛型数组类型
java.lang.reflect.ParameterizedType
泛型参数类型 ...
Spring(十五)-TypeConversion数据转换
参考文献
Spring类型转换实现
基于 Java Beans 接口的类型转换实现
基于 java.beans.PropertyEditor 接口扩展
Spring 3.0+通用类型转换实现
使用场景
场景分析
场景
基于 Java Beans 接口的类型转换实现
Spring 3.0+ 通用类型转换实现
数据绑定
YES
YES
BeanWrapper
YES
YES
Bean 属性类型装换
YES
YES
外部化属性类型转换
NO
YES
基于 Java Beans 接口的类型转换
核心职责
将 String 类型的内容转化为目标类型的对象
扩展原理
Spring 框架将文本内容传递到 PropertyEditor 实现的 setAsText(String) 方法
PropertyEditor#setAsText(String) 方法实现将 String 类型转化为目标类型的对象
将目标类型的对象传入 PropertyEditor#setValue(Object) 方法
PropertyEditor#setValue(Ob ...
Spring(十三)-DataBanding数据绑定
参考文献
Spring数据绑定使用场景
Spring BeanDefinition到Bean实例创建
Spring数据绑定(DataBinder)
Spring Web参数绑定(WebDataBinder)
Spring 数据绑定组件
标准组件
org.springframework.validation.DataBinder
Web 组件
org.springframework.web.bind.WebDataBinder
org.springframework.web.bind.ServletRequestDataBinder
org.springframework.web.bind.support.WebRequestDataBinder
org.springframework.web.bind.support.WebExchangeDataBinder(@Since 5.0)
DataBinder 核心属性
属性
说明
target
关联目标 Bean
objectName
目标 Bean名称
bindingResu ...
Spring(十二)-Validation校验
参考文献
Spring Boot 实现各种参数校验,写得太好了,建议收藏!
Hibernate Validator 8.0.0.Final - Jakarta Bean Validation Reference Implementation: Reference Guide
Spring校验使用场景
Spring常规校验(Validator)
Spring数据绑定(DataBinder)
Spring Web参数绑定(WebDataBinder)
Spring Web MVC/Spring WebFlux处理方法参数校验
Validator接口设计
接口职责
Spring内部校验器接口,通过编程的方式校验目标对象
核心方法
support(Class): 校验目标类能否校验;
validate(Object,Errors): 校验目标对象,并将校验失败的内容输出至Errors对象
配套组件
错误收集器: org.springframework.validation.Errors
Validator 工具类:org.springframework.v ...