![](https://img-blog.csdnimg.cn/20190918140145169.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Spring
文章平均质量分 91
Spring学习笔记
程序员小潘
Java开发工程师,现居杭州,CSDN博客专家,热衷于分享计算机编程相关知识,欢迎关注~
展开
-
Spring事件监听机制
Spring 的事件监听机制,采用了观察者的设计模式。一套完整的事件监听流程是这样的,首先定义事件类,即ApplicationEvent的子类,它包含事件发生的时间戳timestamp和产生事件的来源source,以及自定义的其它事件属性;然后实现事件监听器 ApplicationListener 并注册到容器,订阅感兴趣的事件,Spring 会在事件发生时触发监听器;最后通过事件发布器 ApplicationEventPublisher 发布自定义事件。原创 2024-03-04 19:41:11 · 1189 阅读 · 1 评论 -
Spring Bean的生命周期
Spring Bean 是 Spring IOC 容器负责实例化、组装和管理的对象,它和普通的 Java 对象并没有什么区别,唯一的区别就是它不是由开发人员自己 new 出来的,而是由容器负责创建的。IOC 容器除了实例化对象,还会负责管理对象之间的依赖关系,自动注入依赖和属性,甚至创建代理对象来对原始对象进行增强。生命周期是一个对象从创建到被销毁经历的整个过程,普通Java对象的生命周期是JVM分配内存,调用构造函数实例化对象,当该对象没有被引用后再由GC负责销毁并释放内存。原创 2024-02-18 20:33:50 · 1686 阅读 · 0 评论 -
Spring循环引用和三级缓存
Spring 解决 Bean 之间的循环引用关系用到了三级缓存,那么问题来了。三级缓存是怎么用的?每一层的作用是什么?非得用三级吗?两级缓存行不行?原创 2024-01-09 20:13:04 · 1101 阅读 · 0 评论 -
Spring依赖注入源码分析
Spring的核心之一就是依赖注入,Spring提供了@Autowired注解来给bean注入依赖。除了注入最基本的bean之外,Spring还做了一些扩展,例如你可以注入Optional,以此来判断依赖的bean是否存在;你还可以注入Map来获得所有候选的bean;当然了List和Set自然也是支持的。Spring依赖注入是怎么实现的呢?原创 2023-01-11 09:19:07 · 792 阅读 · 1 评论 -
Spring事务源码分析
Spring支持两种事务管理的方式:声明式事务和编程式事务。编程式事务的优点是可以在代码里控制事务的粒度,实现细粒度的事务控制,缺点是对业务代码存在侵入性,代码复杂度较高,一般很少使用。声明式事务的优点是使用简单无侵入性,仅需在方法上加一个注解或者通过xml配置即可, 声明式事务通过AOP实现,所以事务的粒度只能是方法级别的。本文重点分析Spring声明式事务的实现原理!!!开启Spring事务很简单,首先在启动类上添加注解,再注入一个PlatformTransactionManager事务管理器即可。原创 2023-01-11 09:17:59 · 1267 阅读 · 0 评论 -
FactoryBean和BeanFactory的区别
BeanFactory和FactoryBean的区别是什么???这是Spring非常高频的一道面试题,BeanFactory是Spring bean容器的顶级接口,负责创建和维护容器内所有的bean对象。而FactoryBean是用来创建一类bean的接口,通过实现FactoryBean接口,重写方法来生成bean对象。可以这么说,原本由Spring负责的创建bean的过程,通过实现FactoryBean接口就可以将创建bean对象的过程交给开发者自己来完成。原创 2023-01-11 09:12:42 · 590 阅读 · 0 评论 -
Spring之@Import注解原理
Spring提供了@Import注解,用于向容器引入我们自定义的类,在许多注解中我们都会看到它的身影,比如MyBatis在整合Spring时,提供的}}}大部分@Enable***注解的原理都差不多,都是通过利用@Import注解向Spring容器注入一些bean来实现的。原创 2022-12-30 19:50:45 · 677 阅读 · 3 评论 -
Spring之@Lookup实现原理分析
调用方法返回的总是同一个Car对象,这也很好理解,因为Person是单例的,Spring在创建Person时只会注入一次Car对象,以后Car都不会再改变了。怎么解决这个问题呢?Spring提供了多种方式来获取原型bean。一个bean一旦拥有被@Lookup注解标记的方法,就意味着该方法需要被重写掉,Spring在实例化bean的时候会自动基于CGLIB生成增强子类对象重写掉父类方法。此时父类被@Lookup。原创 2022-12-30 19:50:45 · 1168 阅读 · 8 评论 -
Spring循环依赖探究
Spring在较新版本中已经默认不允许bean之间发生「循环依赖」了,如果检测到循环依赖,容器启动时将会报错,此时可以通过配置来允许循环依赖。什么是循环依赖?循环依赖也叫循环引用,简单点说,就是bean之间的依赖关系形成了一个循环,例如beanA依赖beanB,beanB又依赖beanA。}原创 2022-12-30 19:49:59 · 1248 阅读 · 1 评论 -
Spring AOP源码探究
Spring除了IOC和DI,还有另一个杀手锏功能——Spring AOP。AOP是一种面向切面的编程思想,它的关注点是横向的,不同于OOP的纵向。面向对象编程时,如果我们要给多个类引入同一个行为,唯一的方式就是使用继承,否则就要在这些类里面加入大量重复的代码,如此一来程序将不利于维护。于是,AOP横空出世,它弥补了OOP编程的弊端。Spring内部也有大量特性是通过AOP来实现的,比如我们熟知的数据库事务。原创 2022-12-30 19:48:13 · 514 阅读 · 0 评论 -
@Configuration如何保证@Bean单例语义?
Spring允许通过@Bean}默认情况下,bean应该是单例的,但是如果我们手动去调用@Bean方法,bean会被实例化多次,这破坏了bean的单例语义。于是,Spring提供了注解,当一个配置类被加上注解后,Spring会基于该配置类生成CGLIB代理类,子类会重写@Bean方法,来保证bean是单例的。} }即使手动触发多次bean()方法,也只会生成一个Object对象,保证了bean的单例语义。Spring是如何做到的呢?原创 2022-12-30 19:46:48 · 1810 阅读 · 0 评论 -
Spring之Bean创建过程
Spring提供了xml、注解、JavaConfig多种方式来配置bean,不论何种方式,Spring最终都会将bean封装成BeanDefinition对象,Spring创建bean的依据也是通过BeanDefinition来完成的。当我们调用getBean()方法获取bean实例时,不管是单例bean还是原型bean,首次调用时容器内都不存在可用的bean实例,这时就不得不去创建bean了,我们分析下Spring创建bean的过程。原创 2022-12-30 19:43:22 · 3209 阅读 · 0 评论 -
@MapperScan原理探究
MyBatis在整合Spring的时候,只需要加如下注解,就可以将Mapper实例注册到IOC容器交给Spring管理,它是怎么做到的呢???Mapper接口不能实例化,对象是怎么来的?Mapper接口没有加任何Spring相关注解,Spring凭什么管理这些Bean?原创 2022-12-17 12:13:32 · 2579 阅读 · 0 评论 -
Spring之自定义Bean何时被扫描注册?
在AnnotationConfigApplicationContext的构造函数里,Spring会创建AnnotatedBeanDefinitionReader对象,它的基本作用是将基于注解的BeanClass封装成BeanDefinition,并注册到BeanFactory中。原创 2022-12-17 12:10:57 · 807 阅读 · 0 评论 -
AnnotatedBeanDefinitionReader
xml配置的方式过于繁琐,现在一般更多通过注解或JavaConfig的方式来使用Spring,也就是会用到AnnotationConfigApplicationContext类。在这个类的启动过程中,有一个至关重要的类——AnnotatedBeanDefinitionReader,在它的构造函数里,往DefaultListableBeanFactory中注入了Spring内置的6个非常非常非常重要的BeanDefinition。原创 2022-12-17 12:07:21 · 1457 阅读 · 2 评论 -
BeanDefinition
Spring最重要的一个概念当属Bean了,我们写的Controller、Service、Dao凡是加了对应注解交给Spring管理的,都是Spring容器中的一个Bean。把我们自己写的类变成一个Bean交给Spring管理有很多的好处,比如我们不用自己去new对象了,Spring会帮我们在适当的时候去实例化对象;再比如Spring还会维护Bean的依赖关系,自动注入依赖的对象;再比如Spring还可以基于Bean生成代理对象,来对原生的Bean进行功能上的增强等等。原创 2022-12-17 12:05:30 · 590 阅读 · 0 评论 -
SpringMVC是如何做到根据参数名动态绑定参数的?
使用过SpringMVC的同学都知道,当我们需要在Controller层接收客户端的请求参数时,只需要在形参上加@RequestParam注解,SpringMVC就会自动帮我们做参数绑定,如下示例:@GetMapping("test1")public void test1(@RequestParam("name") String name, @RequestParam("age") Integer age) {}客户端请求示例:curl http://127.0.0.1:8080/test1?原创 2020-11-08 09:32:50 · 1149 阅读 · 1 评论 -
从Spring源码分析@Autowired注入的request是否线程安全
最近看到这样一段代码,是关于在业务代码中操作HttpServletRequest的,如下:@RestController@RequestMapping("/user")public class UserController { @Autowired HttpServletRequest request; @GetMapping("login") public void login() { Object xx = request.getSession().getAttribute("xx"原创 2020-10-21 19:41:31 · 12398 阅读 · 7 评论