
spring源码
文章平均质量分 94
spring源码
冬天vs不冷
Java开发工程师,专注于分享和记录当前流行技术,涵盖从基础使用到源码解析的各个方面(互关互三)
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Spring源码解析(五):循环依赖
简单点说,就是A依赖了B,B依赖的A如果不处理,那么A创建时候需要属性填充B此时B还没有创建,那么去创建B,又需要属性填充A以此形成了死循环A依赖BB依赖A,自然排序,所以先实例化AgetBean(a),先从缓存中获取,没有,则需要去创建实例化A,创建一个对象工厂,可以通过getObje返回刚实例化的A对象,将对象工厂放入三级缓存A属性填充,需要给A中的b属性赋值,则需要getBean(b),先从缓存中获取,没有,则需要去创建。原创 2023-07-26 23:58:08 · 736 阅读 · 149 评论 -
Spring源码解析(六):bean工厂后置处理器ConfigurationClassPostProcessor
类图如下:ConfigurationClassPostProcessor是BeanDefinitionRegistryPostProcessor(bean定义后置处理器父类是BeanFactoryPostProcessor(bean工厂后置处理器根本作用就是解析注解给bean容器添加bean定义@Configuration,@Import,@ComponentScan,@Bean等注解因为有很多后置处理器,通过实现Ordered接口排序执行后置处理器重写的两个重要方法。原创 2023-08-03 14:06:49 · 809 阅读 · 153 评论 -
Spring组件实例化扩展点:InstantiationAwareBeanPostProcessor
是 Spring 生命周期中的一个关键扩展接口,继承自。它在 Bean 的实例化阶段拦截 Bean 的实例化过程,甚至完全自定义实例化逻辑在属性填充(依赖注入)前后执行自定义操作动态修改 Bean 的定义或属性值,实现更灵活的控制与普通的不同,该接口的关注点集中在 Bean 的实例化阶段,而非初始化阶段(如或为 Spring Bean 的生命周期提供了深度的扩展能力,尤其在实例化阶段和属性注入阶段。通过合理利用其回调方法,开发者可以实现高度定制化的 Bean 管理逻辑,如动态代理、属性加密、依赖注入扩展等。原创 2025-03-10 10:16:01 · 3547 阅读 · 418 评论 -
Spring源码解析(八):bean后置处理器CommonAnnotationBeanPostProcessor
查找bean的@Resource属性和@PostConstruct和@PreDestroy方法并缓存起来@Resource注解属性填充初始化前执行解析@PostConstruct注解的初始化方法销毁前执行解析@PreDestroy主键的销毁方法。原创 2023-08-08 22:55:55 · 1660 阅读 · 150 评论 -
Spring源码解析(三):bean容器刷新
上一讲Spring源码解析(二):bean容器的创建、默认后置处理器、扫描包路径bean主要是刷新上下文的准备工作进入refresh();方法,此方法定义在注解上下文父类AbstractApplicationContext注解配置上下文只是它的子类之一,还有xml上下和web上下文等// 1、刷新前预处理 prepareRefresh();原创 2023-07-21 21:40:36 · 1208 阅读 · 138 评论 -
Spring注册修改Bean定义扩展点:BeanFactoryPostProcessor与BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor示例@Override// 动态注册Bean@Override// 修改已有Bean定义和是Spring容器扩展机制的核心接口,二者分别在修改已有Bean定义和动态注册新Bean的场景下发挥着关键作用。原创 2025-02-26 07:30:00 · 3262 阅读 · 373 评论 -
深入理解Spring FactoryBean:灵活创建复杂对象的秘密武器
是 Spring 框架中的一个接口(位于包),用于创建复杂对象。与普通 Bean 不同,它本身是一个“工厂”,负责生成另一个 Bean 的实例。核心方法// 返回实际对象Class<?// 返回对象类型// 是否单例FactoryBean 与普通 Bean 的区别普通 Bean:容器直接实例化并管理其生命周期:容器会调用其方法返回目标对象当定义一个名为的 FactoryBean 时,返回的是的结果若需获取 FactoryBean 本身,需使用(名称前加假设我们需要根据配置动态创建不同品牌的。原创 2025-02-17 09:52:01 · 3611 阅读 · 237 评论 -
Spring源码解析(七):bean后置处理器AutowiredAnnotationBeanPostProcessor
过滤出可以作为构造注入的构造函数列表查找bean的@Autowired @Value属性方法并缓存起来@Autowired @Resource注解属性填充AutowiredAnnotationBeanPostProcessor构造函数autowiredAnnotationTypes 集合中保存了该类会处理的注解autowiredAnnotationTypes 中添加了三个注解@Autowired@Value、和通过反射得到的try {从多个Bean中,筛选出一个符合条件的Bean。原创 2023-08-06 22:01:37 · 1956 阅读 · 140 评论 -
Spring源码解析(九):AOP源码之@Aspect所有相关注解解析
AOP是一种思想,它的实现主要有Spring AOP和AspectJspring AOP底层实现是jdk和cglib动态代理运行期织入借助了AspectJ的语法,即使用了@Aspect @Before @Pointcut等注解来实现AspectJ主要原理是用asm做字节码替换来达到AOP的目的,需要使用专门的编译器ajc编译期、编译期后、类加载期都可以织入AnnotationAwareAspectJAutoProxyCreator主要类图AOP的操作流程都在类中添加注解由@Import注解导入而来。原创 2023-08-29 10:51:59 · 784 阅读 · 159 评论 -
Spring容器初始化扩展点:ApplicationContextInitializer
是 Spring 框架提供的一个接口,用于在 Spring 应用上下文(刷新之前对其进行自定义初始化。它允许开发者在上下文加载 Bean 定义之前,对上下文进行一些额外的配置或修改。在上下文刷新之前,可以通过动态注册自定义的 Bean 定义。// 创建自定义的 BeanDefinition registry . registerBeanDefinition("customBean" , beanDefinition);} }原创 2025-02-06 07:30:00 · 5618 阅读 · 278 评论 -
Spring组件初始化扩展点:BeanPostProcessor
在Spring框架中,是一个强大的扩展接口,允许开发者在Bean初始化的过程中插入自定义逻辑。它是Spring IoC容器生命周期管理的核心机制之一,广泛应用于属性注入AOP代理监控等场景。理解的工作机制,能够帮助开发者更灵活地定制Spring容器的行为。是Spring框架中扩展容器功能的利器,通过介入Bean的生命周期,开发者可以实现高度定制化的逻辑。无论是框架本身的底层实现(如AOP、事务管理),还是业务层的通用增强(如日志、审计),都离不开这一机制的灵活支持。原创 2025-03-17 10:51:15 · 3611 阅读 · 483 评论 -
Spring源码解析(四):单例bean的创建流程
接下来说下Spring源码解析(三):bean容器的刷新中最重要的实例化剩余的非懒加载bean进入beanFactory.preInstantiateSingletons();方法} // 创建beanDefinitionNames的副本beanNames用于后续的遍历,以允许init等方法注册新的bean定义 List < String > beanNames = new ArrayList < >(this . beanDefinitionNames);原创 2023-07-22 10:57:38 · 972 阅读 · 145 评论 -
Spring源码解析(一):环境搭建
}//创建注解容器,入参为配置类 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config . class);//获取某个bean Book book = context . getBean(Book . class);//关闭容器 context . close();} }原创 2023-07-05 09:30:00 · 931 阅读 · 118 评论 -
Spring源码解析(十):spring整合mybatis源码
通过sqlSession获取对应的代理对象代理对象执行sql完成数据库操作// 1.解析XML配置// 2.基于解析好的XML配置创建一个SqlSessionFactory// 3.通过SqlSessionFactory,创建一个SqlSession// 4.获取一个代理对象// 5.调用代理对象的方法System.out.println("代理对象查询结果:" + mapper.selectOne(1));根据@MapperScan注解扫描指定路径下接口。原创 2023-09-02 11:43:00 · 1020 阅读 · 192 评论 -
Spring源码解析(十一):spring事务配置类源码
TransactionDefinition默认实现类DefaultTransactionDefinition。@EnableTransactionManagement与@EnableAspectJAutoProxy对比。AbstractTransactionManagementConfiguration抽象父类。ProxyTransactionManagementConfiguration核心配置类。PlatformTransactionManager的实现类。Spring中一共定义了7种事务的传播机制。原创 2023-10-08 17:02:44 · 519 阅读 · 172 评论 -
Spring源码解析(十二):TransactionInterceptor事务拦截器
核心类作用:通过@Transactional注解指定的事务的属性,包括是否只读、超时、回滚等:事务的状态,这个状态分为很多方面,比如事务的运行状态(是否完成、是否被标记为rollbakOnly),事务的同步状态(这个事务是否开启了一个新的同步),还有事务是否设置了保存点。原创 2023-10-10 22:12:50 · 1348 阅读 · 170 评论 -
Spring源码解析(二):bean容器的创建、注册默认后置处理器、bean定义扫描类
}//创建注解容器,入参为配置类 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config . class);//获取某个bean Book book = context . getBean(Book . class);//关闭容器 context . close();} }调用ClassPathBeanDefinitionScanner的有参构造方法。原创 2023-07-05 16:52:09 · 1491 阅读 · 127 评论