精华内容
下载资源
问答
  • Springboot的原理

    2019-04-28 17:55:03
    先创建一个空的Springboot项目,我们可以看到其中最重要就是SpringBootApplication注解,我们可以进去看看注解中使用了其他哪些注解 @Target代表是注解使用范围 @Retention表示是注解生命周期 ...

    先创建一个空的Springboot项目,我们可以看到其中最重要的就是SpringBootApplication注解,我们可以进去看看注解中使用了其他的哪些注解

    @Target代表的是注解的使用范围

        

    @Retention表示的是注解的生命周期

        SOURCE代表注解只能存在于源码中,编译时就会消失

        CLASS代表注解可以存在于class中,但是会被jvm回收

        RUNTIME代表注解可以不被jvm回收,可以被反射机制调用

    @Document表示这个注解可以储存在javadoc中(javadoc是一套可以形成开发文档的API)

    @Inherit表示这个注解可以被子类继承

    @SpringBootConfiguration代表这是一个注解类,因为其使用了@Configuration注解

        

    @EnableAutoConfiguration代表开启了SpringBoot注解,其中最终要的就是Import这个注解,因为AutoConfigurationImportSelector.class会使Import将所有符合条件的@Configuration配置都加载到Springboot的IoC容器中

        

        但是,有一点需要注意,@AutoConfigurationPackage中AutoConfiguration.Registrar返回的只有同级以及子目录下的所有符合的@Configuration配置信息(依据的就是registerBeanDefinitions这个方法)

            

            

    @ComponentScan是扫描包的路径,如果你的包路径并不在你的项目下,但是需要扫描,那么必须将你的包名以及另外的包名都添加到@CompnentScan中

        

     

    展开全文
  • SpringBoot的原理和执行过程SpringBoot原理即执行过程1.进入开启自动配置包2.在@EnableAutoConfiguration(自动配置包)下的@Import({AutoConfigurationImportSelector.class})注解3.自动配置类进行自动配置功能 ...

    SpringBoot原理即执行过程

    • 在启动引导类中,找到@SpringBootApplication,@SpringBootApplication注解主配置类里边最主要的功能就是SpringBoot开启了一个@EnableAutoConfiguration注解的自动配置功能。进入查看,得知这是一个组合注解
      在这里插入图片描述
    • 接着进入@EnableAutoConfiguration注解
      在这里插入图片描述

    1.进入开启自动配置包

    • 在@EnableAutoConfiguration注解中,有一个@AutoConfigurationPackage注解,字面意思可以得出自动配置包的意思
      在这里插入图片描述
      在这里插入图片描述
    • 我们在 Registrar 类中的 registerBeanDefinitions 方法上打上断点,可以看到返回了一个包名,该包名其实就是主配置类所在的包。
      在这里插入图片描述
    • 总结:@AutoConfigurationPackage 注解就是将主配置类(@SpringBootConfiguration标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器中。所以说,默认情况下主配置类包及子包以外的组件,Spring 容器是扫描不到的。

    2.在@EnableAutoConfiguration(自动配置包)下的@Import({AutoConfigurationImportSelector.class})注解

    • AutoConfigurationImportSelector 的 selectImports 给Spring容器中来导入一些组件在这里插入图片描述
    • 调用顺序:getAutoConfigurationEntry() -> getCandidateConfigurations() -> loadFactoryNames()。
      在这里插入图片描述
    • 在上图中, getCandidateConfigurations方法得到的configurations它是获取候选的配置
      在这里插入图片描述
    • 在 getCandidateConfigurations方法中调用SpringFactoriesLoader.loadFactoryNames从类路径
      下得到一个资源

      在这里插入图片描述
    • 在loadFactoryNames方法中做了关键三步
      1. 从当前项目的类路径中获取所有 META-INF/spring.factories 这个文件下的信息
      2. 将上面获取到的信息封装成一个 Map 返回。
      3. 从返回的 Map 中通过刚才传入的EnableAutoConfiguration.class参数,获取该 key 下的所有值(资源)。
        在这里插入图片描述
    • 将类路径下 META-INF/spring.factories 里面配置的所有 EnableAutoConfiguration 的值加入到 Spring 容器中。加入到容器中之后的作用就是用它们来做自动配置,这就是Springboot自动配置之源,也就是自动配置的开始,只有这些自动配置类进入到容器中以后,接下来这个自动配置类才开始进行启动
      在这里插入图片描述
      在这里插入图片描述

    3.自动配置类进行自动配置功能

    • HttpEncodingAutoConfiguration(HTTP的编码自动配置)为例子来解释SpringBoot的自动配置之原理:
      在这里插入图片描述
    • 因为 @EnableConfigurationProperties({HttpProperties.class}) 把配置文件中的配置项与当前 HttpProperties 类绑定上了。然后在HttpEncodingAutoConfiguration 中又引用了 HttpProperties ,所以最后就能在 HttpEncodingAutoConfiguration 中使用配置文件中的值了。最终通过 @Bean 和一些条件判断往容器中添加组件,实现自动配置。(当然该Bean中属性值是从 HttpProperties 中获取)
      在这里插入图片描述
    • 在HttpProperties 类中通过@ConfigurationProperties 注解将配置文件与自身属性绑定。
    • 所有在配置文件中能配置的属性都是在 xxxProperties 类中封装着;配置文件能配置什么就可以参照某个功能对应的这个属性类。
    展开全文
  • springboot的原理解析

    2020-11-04 18:25:09
    @SpringBootApplication中包含三个注解 @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @...

    @SpringBootApplication中包含三个注解

    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(
        excludeFilters = {@Filter(
        type = FilterType.CUSTOM,
        classes = {TypeExcludeFilter.class}
    ), @Filter(
        type = FilterType.CUSTOM,
        classes = {AutoConfigurationExcludeFilter.class}
    )}
    )
    public @interface SpringBootApplication 
    
    • @SpringBootConfiguration:标明该类使用Spring基于Java的注解,springboot推荐我们使用java代替xml
    @Configuration
    public @interface SpringBootConfiguration 
    
    • @EnableAutoConfiguration:该注解开启自动配置的功能 ,其中包含@import,该注解的功能就是借助EnableAutoConfigurationImportSelector将所有符合条件的@Configuration都加载到IOC容器中ApplicationContext中
    @AutoConfigurationPackage
    @Import({AutoConfigurationImportSelector.class})
    public @interface EnableAutoConfiguration
    
    • @ComponentScan:启动组件扫描,如@controller,@Service等注解都可以被扫描到

    ApplicationRunner

    @FunctionalInterface
    public interface ApplicationRunner {
        void run(ApplicationArguments args) throws Exception;
    }
    

    CommandLineRunner

    @FunctionalInterface
    public interface CommandLineRunner {
        void run(String... args) throws Exception;
    }
    

    ApplicationRunner和CommandLineRunner的接口的执行点是在容器启动成功后的最后一步回调,我们可以在回调方法run中执行相关逻辑

    如果有多个ApplicationRunner或CommandLineRunner实现类,而我们需要按一定顺序执行它们,可以在实现类上加上@Order(value=数值)注解,springboot会按照@order的value值从小到大依次执行。

    展开全文
  • 1.springboot的自动装载原理初步理解:   当我们创建了一个springboot项目,并引入了一个web的启动器,我们就可以使用springmvc的功能,但是我们并没有配置springmvc.xml/web.xml文件,它是怎么启动的呢? 2....

    1.springboot的自动装载原理初步理解:

      当我们创建了一个springboot项目,并引入了一个web的启动器,我们就可以使用springmvc的功能,但是我们并没有配置springmvc.xml/web.xml文件,它是怎么启动的呢?

    2.springBoot是怎么管理依赖的:

    打开pom.xml,我们可以看到一个父工程:
    在这里插入图片描述
    我们点进这个父工程里面,发现里面还有一个父工程:
    在这里插入图片描述
    我们进入到这个里面,发现里面全是依赖的坐标还有版本号等:
    在这里插入图片描述
      这个里面就是springboot的版本控制中心(springboot的版本仲裁机制),里面包含了我们正常环境所需要的依赖,我们以后导入依赖就可以不用再写版本了,但是如果我们使用的依赖没有在这个里面,就需要正常的导入依赖。
      当springboot中帮我们导入的依赖版本不满足我们的需求时,我们可以更改它的默认版本:
    在这里插入图片描述
    在这里插入图片描述


    启动器:
    在这里插入图片描述
    spring-boot-starter-web:帮我们导入了web模块正常运行所依赖的组件;
    spring-boot-starter-test: 帮我们导入了test模块正常运行所依赖的组件。
    启动器的大致意思:
      就是springboot帮我们把所以场景所需要的环境都抽取出来,封装成了一个个的启动器,当我们需要使用什么场景,我们就只需要导入对应的启动器即可,他会把我们所需要的依赖,都会自动的导入进来。例如:我们需要使用redis,我们只需要导入spring-boot-starter-redis这个启动器就可以了。



    自动装配

      当我们创建了一个全新的项目,会自动的帮我们生成一个类,里面有一个main方法,我们就可以启动项目了:
    在这里插入图片描述
    我们可以看到类的上边有一个注解:
      @SpringBootApplication:这个注解的意思就是标注这个注解的类,就是我们的启动类,springboot会运行这个启动类的main方法,启动我们的程序。


    我们点进去看:
    在这里插入图片描述
    这里面有三个springboot为我们提供的新的注解:

    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(
        excludeFilters = {@Filter(
        type = FilterType.CUSTOM,
        classes = {TypeExcludeFilter.class}
    ),
    @Filter(
        type = FilterType.CUSTOM,
        classes = {AutoConfigurationExcludeFilter.class}
    )}
    )
    
    

    @ComponentScan注解:
      作用:自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中,而这里是排除那些类,不让加载进ioc容器中,并没有指定包扫描的路径
    @SpringBootConfiguration:
      作用:SpringBoot的配置类 ,并把该类加载进ioc容器中,标注在某个类上 , 表示这是一个SpringBoot的配置类;


    @EnableAutoConfiguration:开启自动装配
      这个注解就是一个核心的注解,表示告诉springboot开启自动配置功能。
    我们点进这个注解:
    在这里插入图片描述
    发现这个里面还有两个注解:
    @AutoConfigurationPackage:自动导入配置包
    这个注解里面还有一个注解
    在这里插入图片描述
    @Import:spring底层注解,向容器中导入组件
    Registrar.class:表示把主程序类所在的包及子包下所有的类,扫描进spring容器中。
    查看底层代码调试:
    在这里插入图片描述
    这也就是为什么我们要再主程序所在包或者所在包下建子包的原因


    看完这个,我们再返回上一层查看。

    在这里插入图片描述
    这个注解就是把这个类加载进我们的spring容器中,里面我们可以找到一个方法:
    在这里插入图片描述
    这个方法又调用了另外的一个方法:
    在这里插入图片描述
    这个方法,又调用了LoadSpringFactories方法,点开这个方法:
    在这里插入图片描述

    这里面我们就可以看到一个文件,这个文件的所在目录:
    spring-boot-autoconfigure这个包下,也就是自动配置包
    在这里插入图片描述
    我们打开这个文件:
    在这里插入图片描述

    发现里面配置了很多的全限定类名,发现他的命名格式都是xxxAutoconfiguration格式的,也就是xxx就是我们所需要的环境名。
    我们找到一个我们熟悉的配置:
    在这里插入图片描述
    点开这个类:
    在这里插入图片描述
    这个类就是一个配置类,上边有很多的注解,这些注解就是判断什么时候加载这个配置类。

    
    @ConditionalOnBean:当容器中有指定的Bean的条件下  
    @ConditionalOnClass:当类路径下有指定的类的条件下  
    @ConditionalOnExpression:基于SpEL表达式作为判断条件  
    @ConditionalOnJava:基于JVM版本作为判断条件  
    @ConditionalOnJndi:在JNDI存在的条件下查找指定的位置  
    @ConditionalOnMissingBean:当容器中没有指定Bean的情况下  
    @ConditionalOnMissingClass:当类路径下没有指定的类的条件下  
    @ConditionalOnNotWebApplication:当前项目不是Web项目的条件下  
    @ConditionalOnProperty:指定的属性是否有指定的值  
    @ConditionalOnResource:类路径下是否有指定的资源  
    @ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者在有多个Bean的情况下,用来指定首选的Bean
    

    如果满足条件,那么就会把这个配置类通过反射的形式,加载进我们的spring容器中,这样就是自动装配。

    自己理解小结:
      springboot会自动的帮我们把我们所需要配置的文件都形成为了配置类的形式,并把这些配置类的全类名放入到了spring-boot-autoconfigure这个包下Meta-info/spring.factories文件中,当我们启动的时候,会去加载这个文件,通过反射的形式,把满足条件的配置类加载进我们的spring容器中,这样我们的环境就不用再配置了。
      可能这个条件和对应的启动器有关。
      参考自:狂神说笔记

    摘录:

    SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值

    将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;

    整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;

    它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;

    有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;

    总结:
    • SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
    • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
    • 生效的配置类就会给容器中装配很多组件
    • 只要容器中有这些组件,相当于这些功能就有了
    • 定制化配置
    • 用户直接自己@Bean替换底层的组件
    • 用户去看这个组件是获取的配置文件什么值就去修改。
    xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ----> application.properties

    展开全文
  • SpringBoot的原理分析

    2019-08-26 00:55:56
    我们项目里pom文件,它父工程是spring-boot-starter-parent spring-boot-starter-parentpom文件,它父工程org.springframework.boot 然后Ctrl+右键点击org.springframework.boot进入 看到这里我们得出了...
  • SpringBoot 对Spring缺点进行改善和优化,基于约定优于配置思想,可以让开发人员不必在配置与逻辑业务之间进行思维切换,全身心投入到逻辑业务代码编写中,从而大大提高了开发效率,一定程度上缩短了...
  • 那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置二、springboot的启动类入口用过springboot的技术人员很显而易见的两者之间的差别就是视觉上很直观的:springboot有自己独立的启动类(独立程序)...
  • 那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置二、springboot的启动类入口 用过springboot的技术人员很显而易见的两者之间的差别就是视觉上很直观的:springboot有自己独立的启动类(独立程序)...
  • SpringBoot实现原理

    万次阅读 多人点赞 2018-07-20 13:11:29
    SpringBoot是一个快速开发框架,快速将一些常用第三方依赖整合(原理:通过Maven子父工程方式),简化XML配置,全部采用注解形式,内置Http服务器(Jetty和Tomcat),最终以java应用程序进行执行。 二、...
  • SpringBoot底层原理

    2020-08-23 23:38:50
    SpringBoot底层原理一.SpringBoot是什么?二.SpringBoot核心原理 一.SpringBoot是什么? 想要了解springboot底层原理必须要先知道springboot是什么?作用是什么? SpringBoot是一个基于spring快速开发框架,简化了...
  • Springboot启动原理的底层源码
  • Springboot进阶之Springboot运行原理Springboot使用到主要几个注解@SpringBootConfiguration@Configuration@Component@EnableAutoConfiguration@AutoConfigurationPackage@Import({Registrar.class})@Import({...
  • springboot运行原理springboot为我们做了自动配置。...关于springboot的原理,我们还是回归到@SpringbootApplication注解。他的核心功能主要由@EnableAutoConfiguration提供。 @Target(ElementType.TYPE) @Reten...
  • 本文参照Http编码配置源码,自己实现一...在pom.xml中修改,添加autoconfigure依赖: 4.0.0 com.springboot springboot_starter 1.0-SNAPSHOT org.apache.maven.plugins maven-compiler-plugin 2.5 1.8 1.8 jar s...
  • springboot运行原理 1、启动器 <dependency> <groupId>org.springframework.boot<...​ springboot-boot-starter:就是springboot的场景启动器。springboot将所有的功能场景都抽取
  • SpringBoot核心原理

    2020-03-03 11:36:05
    SpringBoot的主要特点 它是一个服务于spring框架的框架,能够简化配置文件,快速构建web应用,内置tomcat,无需打包部署,直接运行。 特点: 简化配置文件 内置tomcat SpringBoot的核心机制 自动配置,可以实现...
  • 文章目录SpringBoot starter 原理分析简介自动装配原理自动转配中注解介绍 SpringBoot starter 原理分析 简介 SpringBoot starter 是SpringBoot提供自动装配组件,starter引入大大减少了常规spring项目xml...
  • SpringBoot启动原理详解

    2021-01-06 17:55:43
    参考这位大佬文章SpringBoot启动原理详解
  • SpringBoot 实现原理

    2019-04-08 14:28:47
    SpringBoot是一个快速开发框架,快速将一些常用第三方依赖整合(原理:通过Maven子父工程方式),简化XML配置,全部采用注解形式,内置Http服务器(Jetty和Tomcat),最终以java应用程序进行执行。 二、...
  • SpringBoot运行原理

    2019-12-24 16:28:59
    1.SpringBoot的运行原理 SpringBoot是如何启动的呢? @Configuration 和 @Component的区别 参考: Spring @Configuration 和 @Component 区别(精简汇总版)
  • SpringBoot的核心思想:自动配置 一、分析pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSc...
  • SpringBoot工作原理

    千次阅读 2019-09-19 21:02:03
    SpringBoot工作原理 Spring Boot是由Pivotal团队提供全新框架,其设计目的是用来简化新Spring应用初始搭建以及开发过程。该框架使用了特定方式来进行配置,从而使开发人员不再需要定义样板化配置。通过这种...
  • SpringBoot 启动原理

    2020-12-07 09:27:20
    SpringBoot为我们做自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏。 我们开发任何一个Spring Boot项目,都会用到如下启动类 @SpringBootApplication ...
  • Springboot工作原理

    2019-09-09 18:00:31
    本文通过图解的方式,介绍Springboot的工作原理、执行流程,对Filter、Interceptor、ControllerAdvice、Handler等组件的用途执行流程做了详细的介绍,并附有代码示例。
  • springboot工作原理

    千次阅读 2019-06-21 09:17:48
    SpringBoot为我们做的自动配置,确实方便快捷,但一直搞不明白它的内部启动原理,这次就来一步步解开SpringBoot的神秘面纱,让它不再神秘。 @SpringBootApplication public class Application { public static ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,358
精华内容 4,143
关键字:

springboot的原理

spring 订阅