![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
springboot
文章平均质量分 84
峰马
这个作者很懒,什么都没留下…
展开
-
Springboot @Conditional条件注解原理
在Springboot里经常能看到各种以@Conditional开头的条件注解,比较常见的有@ConditionalOnClass、@ConditionalOnBean,这里看下他们的实现原理。Springboot加载bean可以简单概括为三个阶段:1、根据配置的扫描路径找到所有需要加载的类,并封装成BeanDefinition注册到Spring容器2、实例化所有注册到容器的BeanDefinition3、对已经实例化的bean进行依赖注入这是最主要的三步,在这过程中还穿插这很多的后置处理器,这些条原创 2021-12-22 20:30:20 · 603 阅读 · 0 评论 -
Springboot注解式缓存原理详解
文章目录生成动态代理类InfrastructureAdvisorAutoProxyCreator注册过程动态代理类生成逻辑Advisor、Pointcut、Advice选择缓存载体我们这里以redis作为缓存载体为例,在Springboot里使用redis缓存时只需要需要简单几步配置就可以:1、引入spring-boot-starter-data-redis依赖和配置2、在Springboot启动类上加上@EnableCaching 注解3、根据实际的缓存场景,在需要缓存的方法上加上相应的注解(@C原创 2021-12-21 15:56:44 · 765 阅读 · 0 评论 -
Springboot之@Transactional事务注解原理详解
文章目录注册事务切面逻辑根据切面逻辑生成代理类总结@Transactional注解的逻辑是通过动态代理来实现的,而生成这个动态代理类分成了两步:1、向spring容器注册事务相关的切面逻辑2、根据切面逻辑生成动态代理下面围绕这两点来看下Springboot里的实现原理注册事务切面逻辑切面逻辑里有三个概念:Pointcut:负责告诉spring容器哪个类需要增强Advise:具体的切面逻辑,这里就是根据异常进行commit或者回滚的相关逻辑Advisor:封装了Advise和Pointcut原创 2021-09-02 18:35:36 · 5369 阅读 · 3 评论 -
Springboot之整合tomcat容器过程
前言 Tomcat容器最主要作用就是监听网络请求,并将请求封装成request和response对象最终交给Servlet去执行,而我们spring项目中用来供servlet调用的业务代码的入口一般就是Spring管理的Controller。而Springboot整合tomcat的话,就需要提供一个Servlet的标准实现,并将这个Servlet注册到Tomcat容器里,并且在Servlet处理请求时,能调用Spring所管理的Controller进而使用Spring容器的所有资源。所以这里最主要的几个原创 2021-03-04 14:29:02 · 1232 阅读 · 2 评论 -
Springboot 自动装载组件原理
文章目录获取需要自动装载的组件加载组件简单一句话就是扫描META-INF/spring.factories下org.springframework.boot.autoconfigure.EnableAutoConfiguration的配置项,然后自动装载这些类这里分两步讲下整个过程:1、获取需要自动装载的组件2、加载组件获取需要自动装载的组件在启动类上会有@SpringBootApplication注解,该注解上有@EnableAutoConfiguration注解,这个注解import了Au原创 2020-12-29 01:00:49 · 941 阅读 · 0 评论 -
Springboot之Bean的加载过程
加载和实例化bean分以下几个重要步骤:1、根据package扫描出需要被管理的类2、将这些类封装成BeanDefinition并注册到BeanFactory容器3、实例化所有扫描到的BeanDefinition,其中包括解决循环依赖、延迟加载问题下面这张图根据Springboot启动调用链的顺序,画了这三个关键步骤被触发的时间点:1、springboot怎么根据package扫描出需要被管理的类?springboot是通过启动类上的@ComponentScan注解所指定的包路径来进行扫描的,原创 2020-12-02 22:56:31 · 12159 阅读 · 5 评论 -
Springboot 启动主流程总结
从《Springboot 启动流程一》到《Springboot 启动流程七》 讲完了在使用java -jar命令启动 maven打的springboot jar包的主流程,这里按顺序对主流程的关键步骤做个总结:一、从jar包里的META-INF里的MANIFEST.MF文件里配置的Main-class总方法作为总入口,自定义一个类加载器LaunchedURLClassLoader,并且指定这个类加载器负责的路径为:BOOT-INF/classes/和BOOT-INF/lib/下的所有资源,然后找到MANI原创 2020-11-27 15:57:58 · 344 阅读 · 0 评论 -
Springboot 启动过程七
用于源码分析的代码:Github接着上一篇继续debug。上一篇已经将源码4.3的逻辑分析完了,这一篇从源码4.5处继续:public ConfigurableApplicationContext run(String... args) { //StopWatch就是一个监控程序启动时间的类,start方法表示开始计时,stop方法表示计时结束 //用于日志输出启动时间 StopWatch stopWatch = new StopWatch(); stopWatch.start(原创 2020-11-27 15:57:07 · 280 阅读 · 0 评论 -
Springboot 启动过程六
用于源码分析的代码:Github接着上一篇继续debug。上一篇已经将源码4.3的逻辑分析完了,这一篇从源码4.4处继续:public ConfigurableApplicationContext run(String... args) { //StopWatch就是一个监控程序启动时间的类,start方法表示开始计时,stop方法表示计时结束 //用于日志输出启动时间 StopWatch stopWatch = new StopWatch(); stopWatch.start(原创 2020-11-27 15:56:26 · 323 阅读 · 1 评论 -
springboot 启动过程五
用于源码分析的代码:Github接着上一篇继续debug,这次看run方法里的源码,每次看的源码不贪多,慢慢嚼。上一篇已经将源码3.0的逻辑分析完了,这一篇就源码4.0处继续:public ConfigurableApplicationContext run(String... args) { //StopWatch就是一个监控程序启动时间的类,start方法表示开始计时,stop方法表示计时结束 //用于日志输出启动时间 StopWatch stopWatch = new Stop原创 2020-11-27 15:56:57 · 257 阅读 · 1 评论 -
springboot 启动过程四
用于源码分析的代码:Github接着上一篇继续debug,这次看run方法里的源码,每次看的源码不贪多,慢慢嚼。还是首先列出自己的问题,带着问题看源码:待解答的问题这段源码做了什么?为什么这么做?学到了哪些东西?源码分析因为这一节的源码会讲到Spring怎么解析环境变量、启动参数的一些内容,所以这一次需要使用远程debug的方式来启动,先将项目使用mvn package 命令打成jar包,然后cd到jar包所在目录,使用命令方式启动项目,我这里启动命令是:java -Xdebug -Xru原创 2020-11-27 15:56:46 · 346 阅读 · 0 评论 -
springboot 启动过程三
用于源码分析的代码:Github接着上一篇继续debug,这次看run方法里的源码,每次看的源码不贪多,慢慢嚼。还是首先列出自己的问题,带着问题看源码:待解答的问题这段源码做了什么?为什么这么做?学到了哪些东西?源码一可以看出run方法里的代码有很好的可读性,用阿里java开发手册的原话来说,就是代码逻辑分清了红花和绿叶,个性和共性,绿叶逻辑单独出来成为额外方法,使主干代码更加清晰。由于这个run方法是Spring容器启动的主方法,包含的逻辑太多,所以这一节先debug完2.0的逻辑。p原创 2020-11-27 15:56:15 · 231 阅读 · 0 评论 -
Springboot 启动过程二
接着启动过程一中的代码,继续debug,这一篇主要看new SpringApplication(primarySources)的代码。首先还是列出问题,带着问题去看源码收获也会多些。待解答的问题这段代码的主要用途是什么?为什么这么设计?源码分析public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) { return new SpringApplicati原创 2020-11-27 15:56:00 · 383 阅读 · 0 评论 -
Springboot 启动过程一
用于源码分析的代码:Github我们首先从springboot的jar包的启动开始,因为这个里面有个知识点,java 程序的启动都是通过一个Main Class的main方法作为整个程序的入口来启动的,而启动的命令是通过jdk安装目录里的bin文件夹下的java命令脚本来启动的,jar包的启动命令就是 java -jar spring-boot-learn-1.0-SNAPSHOT.jar 这个命令没有指定main class,那么JVM是怎么知道启动这个jar里的那个class的main方法呢?一、J原创 2020-11-27 15:56:36 · 591 阅读 · 0 评论