精华内容
下载资源
问答
  • SpringBoot自动配置的原理及实现

    万次阅读 多人点赞 2018-11-13 14:22:34
    SpringBoot自动配置的实现原理 SpringBoot的核心就是自动配置,自动配置又是基于条件判断来配置Bean。关于自动配置的源码在spring-boot-autoconfigure-2.0.3.RELEASE.jar 回顾配置属性 在通常需要我们在property中...

    整理日志

    2018-11-13 写blog
    2020-11-13 参考其他blog添加流程图
    2021-3-17 评论区说跨域的包没引入,这是我当时写脚手架时加的,对于当前blog没什么用,我加上了注释 //,免得被喷

    SpringBoot自动配置的实现原理

    SpringBoot的核心就是自动配置,自动配置又是基于条件判断来配置Bean。关于自动配置的源码在spring-boot-autoconfigure-2.0.3.RELEASE.jar

    在这里插入图片描述

    回顾配置属性

    在通常需要我们在property中配置信息时,通常使用@ConfigurationProperties(pefix=“前缀”)注解的方式从配置文件中获取配置,如下:

    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    @RestController
    @ConfigurationProperties(prefix = "test")
    //@Component //如果这里添加了注解那么在自动配置类的时候就不用添加@enableConfigurationProperties(HelloProperties.class)注解.
    public class Demo {
    
     
    	
        private String msg="default";//现在我们在配置文件写hello.msg=world,因为简单就不再展示;如果那么默认为default.
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
    	}
    	
    	
    	@RequestMapping("/msg")
    	public Object index(){
    		return this.msg;
    	}
    
    }
    
    

    application.yml中配置信息

    test:
      msg: bamboo
    

    访问url获取配置信息返回的值
    http://localhost:8080/msg

    如果把application.yml中的配置信息注释掉则默认使用default值,否则使用配置信息中的值,以上便是普通配置方式

    解析

    SpringBoot运行原理
    先看@SpringBootApplication

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(excludeFilters = {
            @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
            @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
    public @interface SpringBootApplication {
    ...
    }
    

    主要关注的几个注解如下
    @SpringBootConfiguration:标记当前类为配置类
    @EnableAutoConfiguration:开启自动配置
    @ComponentScan:扫描主类所在的同级包以及下级包里的Bean
    关键是@EnableAutoConfiguration

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    @Import(AutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration {
       String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
       Class<?>[] exclude() default {};
       String[] excludeName() default {};
    }
    
    

    最关键的要属@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器:通过@Import(AutoConfigurationImportSelector.class)导入的配置功能,
    AutoConfigurationImportSelector中的方法getCandidateConfigurations,得到待配置的class的类名集合,这个集合就是所有需要进行自动配置的类,而是是否配置的关键在于META-INF/spring.factories文件中是否存在该配置信息

      protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
                AnnotationAttributes attributes) {
            List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
                    getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
            Assert.notEmpty(configurations,
                    "No auto configuration classes found in META-INF/spring.factories. If you "
                            + "are using a custom packaging, make sure that file is correct.");
            return configurations;
        }
    

    打开,如下图可以看到所有需要配置的类全路径都在文件中,每行一个配置,多个类名逗号分隔,而\表示忽略换行
    在这里插入图片描述

    在这里插入图片描述
    整个流程如上图所示

    样例讲解

    以SpringApplicationAdminJmxAutoConfiguration类来看其主要构成部分

    @Configuration
    @AutoConfigureAfter({JmxAutoConfiguration.class}) //配置完JmxAutoConfiguration后再配置当前类型
    // spring.application.admin为前缀,属性为enabled,有值时为true,没有匹配到则为false:以上条件为true则实例化,否则不是实例化
    @ConditionalOnProperty( prefix = "spring.application.admin", value = {"enabled"}, havingValue = "true",  matchIfMissing = false)
    public class SpringApplicationAdminJmxAutoConfiguration 
    
    

    都能看到各种各样的条件判断注解,满足条件时就加载这个Bean并实例化
    此类的条件注解是:@ConditionalOnProperty

    @ConditionalOnBean:当容器里有指定Bean的条件下
    @ConditionalOnClass:当类路径下有指定的类的条件下
    @ConditionalOnExpression:基于SpEL表达式为true的时候作为判断条件才去实例化
    @ConditionalOnJava:基于JVM版本作为判断条件
    @ConditionalOnJndi:在JNDI存在的条件下查找指定的位置
    @ConditionalOnMissingBean:当容器里没有指定Bean的情况下
    @ConditionalOnMissingClass:当容器里没有指定类的情况下
    @ConditionalOnWebApplication:当前项目时Web项目的条件下
    @ConditionalOnNotWebApplication:当前项目不是Web项目的条件下
    @ConditionalOnProperty:指定的属性是否有指定的值
    @ConditionalOnResource:类路径是否有指定的值
    @ConditionalOnOnSingleCandidate:当指定Bean在容器中只有一个,或者有多个但是指定首选的Bean
    这些注解都组合了@Conditional注解,只是使用了不同的条件组合最后为true时才会去实例化需要实例化的类,否则忽略
    这种spring4.X带来的动态组合很容易后期配置,从而避免了硬编码,使配置信息更加灵活多变,同时也避免了不必要的意外异常报错。使用的人只要知道配置的条件即可也不用去阅读源码,方便快捷,这也是sprignboot快捷方式带来的好处

    参考HttpEncodingAutoConfiguration配置信息如下

    @Configuration
    @EnableConfigurationProperties(HttpEncodingProperties.class)
    @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
    @ConditionalOnClass(CharacterEncodingFilter.class)
    @ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
    public class HttpEncodingAutoConfiguration {
    

    @Configuration:标明为配置类
    @EnableConfigurationProperties(HttpEncodingProperties.class)声明开启属性注入
    @ConditionalOnClass(CharacterEncodingFilter.class)当CharacterEncodingFilter在类路径的条件下
    @ConditionalOnProperty(prefix = “spring.http.encoding”, value = “enabled”, matchIfMissing = true)当spring.http.encoding=enabled的情况下,如果没有设置则默认为true,即条件符合
    @ConditionalOnMissingBean当容器中没有这个Bean时新建Bean

    案例扩展

    
    /**
     * @author wuweifeng wrote on 2017/11/25.
     * 根据部署环境动态决定是否启用eureka
     线上的环境开启eureka,就在application-prod.yml里配上open.eureka=true,
     其他的yml什么也不写就行了。这样本地启动时就相当于没有开启EnableDiscoveryClient
     */
    @Component
    @ConditionalOnProperty(value = "open.eureka")
    @EnableDiscoveryClient
    public class JudgeEnableDiscoveryClient 
    

    自己实现一个自己的自动配置

    项目

    xm-common:普通jar项目
    - src/main
        java
            BambooServer.java  需要被实例化的服务类
            BambooServerProperties.java 配置信息属性类
            BmbooServiceAutoConfiguration.java 自动配置类
        resources
            META-INF/spring.factories 配置自动配置的属性文件
    demo:普通springboot-web项目
    

    需要实例化的服务类

    public class BambooServer {
        private String name;
    
        public String sayServerName(){
            return "I'm " + name + "! ";
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }
    

    配置信息对应的属性映射类,需要pom中加入spring-boot-starter依赖

    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    @ConfigurationProperties(prefix = "bamboo")
    public class BambooServerProperties {
    
        private static final String NAME = "bamboo_server0";
    
        private String name = NAME;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    自动配置文件

    /**
     * Author: bamboo
     * Time: 2018/11/25/025
     * Describe: 自动配置类
     * 根据条件判断是否要自动配置,创建Bean
     */
    @Configuration
    @EnableConfigurationProperties(BambooServerProperties.class)
    @ConditionalOnClass(BambooServer.class)//判断BambooServer这个类在类路径中是否存在
    @ConditionalOnProperty(prefix = "bamboo",value = "enabled",matchIfMissing = true)
    public class BmbooServiceAutoConfiguration {
    
        @Autowired
        private BambooServerProperties mistraServiceProperties;
    
        @Bean(name = "bambooServer")
        @ConditionalOnMissingBean(BambooServer.class)//当容器中没有这个Bean时(BambooServer)就自动配置这个Bean,Bean的参数来自于BambooServerProperties
        public BambooServer mistraService(){
            BambooServer mistraService = new BambooServer();
            mistraService.setName(mistraServiceProperties.getName());
            return mistraService;
        }
    }
    

    在创建如下路径文件src/main/resources/META-INF/spring.factories

    # Auto Configure
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.bamboo.common.autoconfigure.bamboo.BmbooServiceAutoConfiguration
    

    必须是自动配置类的全路径

    mvn install 该项目

    创建一个springboot-mvc项目pom依赖上面的jar

    @SpringBootApplication
    @RestController
    //@Import(value = {CorsConfig.class, LogFilter.class}) //跨域,接口访问请求日志
    public class DemoApplication {
    	@Autowired
    	private BambooServer bmbooService;
    
    	public static void main(String[] args) {
    		SpringApplication.run(DemoApplication.class, args);
    	}
    
    	@RequestMapping("/")
    	public Object index(){
    		return "helll demo"+bmbooService.getName()+DateUtils.getDate();
    	}
    }
    

    http://localhost:8080/则返回当前服务的默认值

    在applicaton.yml中加,重启刷新则会更新为如下信息

    bamboo:
      name: 测试服务
    

    总结图

    在这里插入图片描述
    SpringBoot自动化配置关键组件关系图
    mybatis-spring-boot-starter、spring-boot-starter-web等组件的META-INF文件下均含有spring.factories文件,自动配置模块中,SpringFactoriesLoader收集到文件中的类全名并返回一个类全名的数组,返回的类全名通过反射被实例化,就形成了具体的工厂实例,工厂实例来生成组件具体需要的bean。

    参考blog

    https://www.cnblogs.com/xiaoxi/p/7999885.html

    展开全文
  • SpringBoot自动配置

    2020-02-03 21:12:38
    SpringBoot自动配置原理 @SpringBootApplication SpringBoot应用程序能够实现自动配置主要依靠引导类上的一个注解:@SpringBootApplication package com.lin.missyou; import org.springframework.boot....

    SpringBoot自动配置原理

    @SpringBootApplication

    SpringBoot应用程序能够实现自动配置主要依靠引导类上的一个注解:@SpringBootApplication

    package com.lin.missyou;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class MissyouApplication {
        public static void main(String[] args) {
            SpringApplication.run(MissyouApplication.class, args);
        }
    }
    

    在这里插入图片描述
    查看@SpringBootApplication的源码可以看出@SpringBootApplication包含了3个主要注解
    在这里插入图片描述

    @SpringBootConfiguration

    @SpringBootConfiguration标注在类上,表示MissyouApplication这个入口文件是一个超级大的配置类。这个超级大的配置类内部会分别去加载一个一个小的配置类和模块。

    @EnableAutoConfiguration

    @EnableAutoConfiguration是SpringBoot自动配置最核心的注解,表示开启自动配置功能。主要的作用就是加载多个Bean,然后把这些Bean加入到IOC容器。(@EnableAutoConfiguration本质上与@Configuration类似,部分属性要写在配置文件里,允许从配置文件里修改配置Bean下面相关的属性,加载不同的Bean并加入到IOC容器。但是@Configuration是处理我们自己写的类的,@EnableAutoConfiguration是加载一些第三方的SDK、jar包的)

    AutoConfigurationImportSelector

    @EnableAutoConfiguration中导入(@Import)了一个AutoConfigurationImportSelector。AutoConfigurationImportSelector中有一个非常重要的方法selectImports(),在这个方法中加载第三方配置类。
    在这里插入图片描述
    在这里插入图片描述
    在AutoConfigurationImportSelector的getCandidateConfigurations()方法中,SpringFactoriesLoader.loadFactoryNames()读取所有候选配置类的名字。
    在这里插入图片描述

    spring.factories

    SpringFactoriesLoader中可以找到配置文件的路径:META-INF/spring.factories
    在这里插入图片描述
    spring.factories这个配置文件中是一个一个的key:value,所有要加载的配置类都是在这个配置文件中记录。
    在这里插入图片描述

    自动配置的意义

    Spring一直围绕着如何更灵活的把Bean加入到IOC容器。SpringBoot比其他框架多了一个IOC容器,SpringBoot自动配置实际上解决了通过读取配置文件把配置的Bean加入到IOC容器,省去了我们手动编写配置注入功能组件的工作。

    展开全文
  • Springboot自动配置

    2020-05-19 13:08:33
    Springboot自动配置原理解析 Springboot框架介绍 SpringBoot框架基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过...

    Springboot自动配置原理解析

    Springboot框架介绍

    SpringBoot框架基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架,很好的解决了依赖包的版本冲突,以及引用的不稳定性等问题。

    自动配置

    首先我们先看一下入口类:

    @SpringBootApplication
    public class MyApplication {
        public static void main(String[] args) {
        	SpringApplication.run(MyApplication .class, args);
        }
    }
    

    在这个入口类里有一个main方法,这个方法其实就是一个标准的Java应用的入口方法,一般在main方法中使用SpringApplication.run()来启动整个应用。这个入口类必须声明SpringBoot的核心注解,也就是@SpringBootApplication注解。
    我们进入到这个注解里面

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(excludeFilters = {
            @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
            @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
    public @interface SpringBootApplication {
        // 略
    }
    

    找到@EnableAutoConfiguration这个注解,很明显通过这个名字就可以看出它是要开启自动配置的,让我们来看下@EnableAutoConfiguration的源码。

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    @Import(EnableAutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration {
        // 略
    }
    

    在@EnableAutoConfiguration注解内使用到了@import注解来完成导入配置的功能,而EnableAutoConfigurationImportSelector内部则是使用了SpringFactoriesLoader.loadFactoryNames方法进行扫描具有META-INF/spring.factories文件的jar包。

    其实最主要的注解就是@enableAutoConfiguration,而这个注解会导入一个EnableAutoConfigurationImportSelector的类,而这个类会去读取一个spring.factories下key为EnableAutoConfiguration全限定名对应值。

    # Auto Configure
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
    org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
    org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
    //省略
    

    所以如果需要我们可以在我们的resources目录下创建spring.factories下添加类似的配置即可。

    展开全文
  • SpringBoot 自动配置

    2020-05-13 17:54:39
    Springboot 自动配置原理 关注 “弋凡”(YiFan)微信公众号吧 记录简单笔记 做你的最爱 配置文件官方文档 添加链接描述 自动配置原理 spring-boot-dependencies:核心依赖在父工程中 我们在添加Springboot...

    Springboot 自动配置

    关注 “弋凡”(YiFan)微信公众号吧 记录简单笔记 做你的最爱

    Springboot 是什么呐?

    我管她是什么,好用就行了啊!!!
    spring相信大家都用过了,那一堆的配置,用起来就麻烦,好比是饭面,但是你需要自己加调料啦
    springboot 就是简化配置 好比一碗香飘飘牛肉面,哇吃起来真香,用起来也一定很简单吧~

    配置文件官方文档
    添加链接描述

    自动配置原理

    • spring-boot-dependencies:核心依赖在父工程中

      • 我们在添加Springboot依赖时不需要指定版本号,
      • 就是因为在这些版本在 spring-boot-dependencies 中指定
    • @ComponentScan 扫描包

    • SpringBoot启动的时候加载主配置类 @SpringBootApplication

    注解

    @SpringBootConfiguration   Springboot的配置
    	@Configuration  spring配置类
    	@Component 说明这也是一个spring的组件
    	
    @EnableAutoConfiguration   自动配置
    	@AutoConfigurationPackage 自动配置包
    		@Import(AutoConfigurationPackages.Registrar.class)  自动配置 包注册
    	@Import(AutoConfigurationImportSelector.class) 自动导入选择配置
    		获取所有的配置 
            List<String> configurations =
            	getCandidateConfigurations(annotationMetadata, attributes);
    @ComponentScan  扫描当前启动类同级的包
    
    • 获取候选的配置
    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    		List<String> configurations = 	SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
    				getBeanClassLoader());
    		Assert.notEmpty(configurations,
              "No auto configuration classes found in METAINF/spring.factories. If you "
    				+ "are using a custom packaging, make sure that file is correct.");
    		return configurations;
    	}
    
    • 核心自动配置

    结论:

    • springboot 所有的自动配置都是在启动的时扫描加载
    • 配置类都在 spring.factories 里面 但是不一定都生效 要满足条件(@ConditionalOnClass)
    • (只要导入了对应的 start ,就有了对应的启动器,有了启动器,自动配置就生效了)

    1,springboot项目启动的时候会自动加载 METAINF/spring.factories 下的配置

    2,自动将这些配置类导入容器中,自动配置就会生效,帮我们自动配置

    3,以前我们需要的自动配置 springboot就帮我们自动配置了

    4,springboot所有的配置的东西都在 spring-boot-autoconfigure-2.2.5.RELEASE.jar 中

    Springboot @Conditional 条件注解

    在这里插入图片描述

    快来关注“弋凡”微信公众号吧

    快来关注“弋凡”微信公众号把

    展开全文
  • SpringBoot自动配置原理源码解读1.@SpringBootApplication:通过这个注解,不仅仅标记这是一个SpringBoot应用,而且还开启自动配置的功能主要注解EnableAutoConfiguration@Target1.程序启动入口SpringApplication启动...
  • springboot自动配置

    2019-10-25 20:54:57
    比如说使用SSM框架的时候,我们需要去写mybatis的xml配置文件,使用springboot只需要引入一个mybatis的jar包,只需要在springboot的全局配置文件application.properties配置数据库信息就行了,如果不配置就会出错。...
  • SpringBoot自动配置原理前言:SpringBoot的最大的特点就是帮助我们自动配置了很多场景启动器,我们之前利用SSM开发一个项目时,那些繁琐的配置再也不需要自己配置了,自动配置原理也是面试必问的关于SpringBoot的知识点,...
  • springboot自动配置属性

    2018-08-08 19:25:28
    springboot自动配置属性整理文档,方便查看属性范围。
  • Springboot自动配置原理

    2021-01-12 13:20:03
    Springboot自动配置原理
  • SpringBoot自动配置原理

    2020-06-02 20:25:09
    SpringBoot自动配置原理
  • SpringBoot自动配置Redis原理

    千次阅读 2019-06-01 17:57:01
    SpringBoot自动配置Redis原理 目录 SpringBoot自动配置Redis原理 一.SpringBoot自动配置Redis原理 一.自动配置redis RedisAutoConfiguration 二.配置环境 为什么会在满足俩个条件的情况下加载呢? 总结: ...
  • SpringBoot自动配置理解

    2020-06-13 22:26:26
    SpringBoot自动配置理解 SpringBoot自动配置原理 首先我们先看SpringBoot项目的启动类 @SpringBootApplication是一个复合注解或派生注解,在@SpringBootApplication中有一个注解@EnableAutoConfiguration,翻译成人...
  • springboot自动配置原理

    2020-08-27 09:34:53
    springboot自动配置原理 非常不错,记录一下
  • 主要介绍了浅谈springboot自动配置原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • SpringBoot自动配置报告

    千次阅读 2020-10-12 15:55:57
    第二章 2.12 SpringBoot自动配置报告,可通过自动配置报告查看哪些组件被加载进容器,哪些组件没有被加载进容器
  • 讲讲springboot自动配置原理 讲讲springboot自动配置原理 上图是springboot自动配置大致流程图,我们都知道springboot框架使用起来非常方便,我们只要引入相关组件的maven包,然后配置少量的配置就可以正常使用...
  • SpringBoot自动配置 SpringBoot自动配置的注解是@EnableAutoConfiguration  所以来看@EnableAutoConfiguration注解的源码: 1、首先@EnableAutoConfiguration是包含在@SpringBootApplication组合注解中 2、使用...
  • 【springboot源码】springboot自动配置源码分析1.测试用例2.springboot自动配置原理分析2.1 @EnableAutoConfiguration 开启自动配置功能 注:本文阅读前提,对springboot基本使用有所了解,此外,其他一些源码解读,...
  • 主要介绍了全面解析SpringBoot自动配置的实现原理的相关资料,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,186
精华内容 7,274
关键字:

springboot自动配置

spring 订阅