精华内容
下载资源
问答
  • 注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心, @EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类。 筛选有效的自动配置类。 每一个...

    注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心,
    @EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类。
    筛选有效的自动配置类。
    每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能


    Spring Boot的自动配置原理源码分析

    展开全文
  • SpringBoot的自动配置原理是什么 主要Spring Boot的启动类上的核心注解SpringBootApplication注解主配置类,有了这个主配置类启动时就会为SpringBoot开启一个@EnableAutoConfiguration注解自动配置功能。 有了这个...

    SpringBoot的自动配置原理是什么
    主要是Spring Boot的启动类上的核心注解SpringBootApplication注解主配置类,有了这个主配置类启动时就会为SpringBoot开启一个@EnableAutoConfiguration注解自动配置功能。
    有了这个EnableAutoConfiguration的话就会:
    1,从配置文件METAINF/Spring.factories加载可能用到的自动配置类
    2、去重,并将exclude和excludeName属性携带的类排除
    3、过滤,将满足条件(@Conditional)的自动配置类返回

    展开全文
  • 就是自动配置的核心, @EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类。 筛选有效的自动配置类。 每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能...

    注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass
    就是自动配置的核心,

    @EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类。

    筛选有效的自动配置类。

    每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能

    展开全文
  • SpringBoot为什么可以自动配置

    千次阅读 2018-09-30 16:57:16
    最近工作变动,以前公司使用的一直都spring,到了新公司后项目都使用了springboot,而我对springboot可以做到没有配置文件还可以智能配置非常感兴趣,所以就大致研究了下springboot的自动配置的源码,本文也只会...

    最近工作变动,以前公司使用的一直都是spring,到了新公司后项目都使用了springboot,而我对springboot可以做到没有配置文件还可以智能配置非常感兴趣,所以就大致研究了下springboot的自动配置的源码,本文也只会解释springboot自动配置的原理,老规矩,写的不好的地方可以喷,喷完最好可以告诉我最佳答案。

    springboot自动配置的源头便在于启动类上的注解 @SpringBootApplication,进入该注解我们会看到它是由下列注解一起构成:

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan
    

    我们分别看下这些注解起到了上面作用

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited 
    

    这四个注解可以称之为元注解,可以理解成它们就是专门用在注解类上的。
    @Target() “目标” 表示@SpringBootApplication的使用位置,ElementType.TYPE表示用在类上。
    1.CONSTRUCTOR:用于描述构造器
    2.FIELD:用于描述域
    3.LOCAL_VARIABLE:用于描述局部变量
    4.METHOD:用于描述方法
    5.PACKAGE:用于描述包
    6.PARAMETER:用于描述参数
    7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
    @Retention() “保留” 表示@SpringBootApplication的存在阶段。
    1.RetentionPolicy.SOURCE —— 这种类型的Annotations只在源代码级别保留,编译时就会被忽略
    2.RetentionPolicy.CLASS —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将 会忽略
    3.RetentionPolicy.RUNTIME —— 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用.
    @Documented “文档” 注解表明这个注解应该被 javadoc工具记录
    @Inherited “继承” 修饰@SpringBootApplication后,那么@SpringBootApplication用在哪个类上,且该类有子类的话,子类是可以继承父类中的@SpringBootApplication

    既然这4个注解是元注解,可以用在所有的注解上,肯定跟springboot的自动配置没关系了,@SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan

    这三个注解才是@SpringBootApplication可以自动配置的关键。所以本文的重点之一就是好好唠唠这三个注解。

    @SpringBootConfiguration点进去看@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }发现本质就是@Configuration,在类上加上该注解的表明这个类是一个javaconfig,我们继续点进去看@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component会发现@Component注解。在spring的xml配置<context:component-scan /> 或者 @ComponentScan,容器启动的时候会扫描所有含有@Component的类,通过反射机制将类的信息加载到内存中给IOC使用(这里就不啰嗦,感兴趣可以自行百度).
    而javaConfig的配置形式如下:

    @Configuration
    public class Configuration {
        // 任何标志了@Bean的方法,其返回值将作为一个bean注册到Spring的IOC容器中
        // 方法名默认成为该bean定义的id
        @Bean
        public BookBean book() {
            return new Book();
        }
    }
    

    它的作用等同于在spring的xml文件中< bean id="book" class="com.jd.bean.Book" />
    所以总结一下,就是
    **@SpringBootConfiguration注解会标注一个类是javaConfig,在spring或者springboot启动的时候会被扫描。可以根据@Bean注解实例化对象,作用等于在spring的xml文中定义一个< bean > < /bean> **

    @ComponentScan上文中已经简提到,注解对应XML配置形式中的 元素,表示启用组件扫描,Spring会自动扫描所有通过注解配置的bean,然后将其注册到IOC容器中。我们可以通过 basePackages等属性来指定 @ComponentScan自动扫描的范围,如果不指定,默认从声明 @ComponentScan所在类的 package进行扫描。正因为如此,SpringBoot的启动类都默认在 src/main/java下,自定义的类的路径一定要和启动类平级或者下级。

    现在看下最关键的注解
    @EnableAutoConfiguration,点进去会发现
    @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class})
    一眼就可以看到核心就是@Import({AutoConfigurationImportSelector.class})。写过代码的都知道import是用于导入类的,其实这个注解的作用也是一样,在初始化的时候需要依赖AutoConfigurationImportSelector.class,所以通过@import导入。重点看下AutoConfigurationImportSelector中的selectImports方法。

        @Override
        public String[] selectImports(AnnotationMetadata annotationMetadata) {
            if (!isEnabled(annotationMetadata)) {
                return NO_IMPORTS;
            }
            // 从配置文件"META-INF/spring-autoconfigure-metadata.properties"中加载 AutoConfigurationMetadata
            AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
                    .loadMetadata(this.beanClassLoader);
            //从注解中加载exclude和excludeName
            AnnotationAttributes attributes = getAttributes(annotationMetadata);
            //从所有jar包下的/META-INF/spring.factories的文件中获取到候选的自动配置类,
            //使用内部工具SpringFactoriesLoader加载spring.factories文件中
            // key为org.springframework.boot.autoconfigure.EnableAutoConfiguration 的value
            //建议大家可以自己去文件中看下,此处随意选几个配置类展示
            //org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
            //org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
            //org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration
            //org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
            //等等
            List<String> configurations = getCandidateConfigurations(annotationMetadata,
                    attributes);
            //去重复
            configurations = removeDuplicates(configurations);
            //去掉注解中特意exclude的配置类
            Set<String> exclusions = getExclusions(annotationMetadata, attributes);
            checkExcludedClasses(configurations, exclusions);
            configurations.removeAll(exclusions);
            // 应用过滤器AutoConfigurationImportFilter,
            // 对于 spring boot autoconfigure,定义了一个需要被应用的过滤器 :
            // org.springframework.boot.autoconfigure.condition.OnClassCondition,
            // 此过滤器检查候选配置类上的注解@ConditionalOnClass,如果要求的类在classpath
            // 中不存在,则这个候选配置类会被排除掉
            configurations = filter(configurations, autoConfigurationMetadata);
            //经过上面的filter,已经过滤掉不需要实例化的配置类,也就是没有在pom文件引入相关jar包
            fireAutoConfigurationImportEvents(configurations, exclusions);
            return StringUtils.toStringArray(configurations);
        }
    

    我们在这看一下springboot的配置类,只选择redis的配置类作为例子,其他的配置类也是一样的:

    @Configuration//告诉springboot这是个配置类
    @ConditionalOnClass({RedisOperations.class})//当类路径下有指定类的条件下才会实例化
    @EnableConfigurationProperties({RedisProperties.class})//可以设置属性
    @Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})//导入另外redis相关的配置类
    public class RedisAutoConfiguration {
        public RedisAutoConfiguration() {
        }
    
        @Bean
        @ConditionalOnMissingBean(//当类路径下不存在指定类的条件下
            name = {"redisTemplate"}
        )
        public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
            RedisTemplate<Object, Object> template = new RedisTemplate();
            template.setConnectionFactory(redisConnectionFactory);
            return template;
        }
    
        @Bean
        @ConditionalOnMissingBean//当类路径下不存在指定类的条件下
        public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
            StringRedisTemplate template = new StringRedisTemplate();
            template.setConnectionFactory(redisConnectionFactory);
            return template;
        }
    }
    

    selectImport()方法,顾名思义也就是从配置文件中筛选出需要可以实例化的配置类进行实例化。

    springboot的自动配置可以简单的理解成就是同过一系列的注解,让springboot在启动的时候从配置文件中加载需要自动配置的类,如果该配置类有引入相应的jar的时候,springboot便会实例化,大家就可以在后面的代码中不做任何配置直接使用了。如果是没有在pom文件中引入相关的jar包,springboot也便不会给你自动实例化配置类。
    springboot在启动的时候实例化了配置文件中的哪些配置类,没有实例化哪些配置类都在debug级别的启动日志中有打印出

    展开全文
  • 前言 本来没有计划这一篇文章的,只是在看完SpringBoot核心原理后,突然想到之前开发中遇到...SpringBoot MVC的自动配置,问题这样的,当我们需要自己配置MVC时,有三种选择: 实现WebMvcConfigurer接口 继承WebMvcC
  • 1. 什么是自动配置 简单来说,就是将传统的ssm项目中,我们需要在xml中写入大量配置文件,用来配置我们所需的组件。而springboot帮助我们完成了简化,一种更便利的开发方式:自动配置。在自动配置中,我们只需要引入...
  • springboot——自动配置

    千次阅读 2018-02-10 14:47:49
    什么是自动配置?举例来讲,当你通过@Autowired或@Resource注解,自动注入一个类实例之前,被注入进来的这个类实例需要被spring容器纳管,不然肯定会注入失败。往往我们会在xml通过`bean id="dfdf"` 或者...
  • springboot自动配置是如何实现的?

    千次阅读 2019-03-28 17:33:29
    什么是SpringBoot自动配置? ​ springboot的自动配置,指的是springboot会自动将一些配置类的bean注册进ioc容器,我们可以需要的地方使用@autowired或者@resource等注解来使用它。 ​ “自动”的表现形式就是我们...
  • SpringBoot自动配置

    2020-03-05 13:11:28
    1. 配置文件到底是什么?怎么写? 自动配置原理 SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration; @EnableAutoConfiguration作用: 1) 利用...
  • 如图所示,无状态地址自动配置 (SLAAC) IPv6 的动态主机配置协议(有状态 DHCPv6) 一.SLAAC SLAAC 一种可以在没有 DHCPv6 服务器服务的情况下获取 IPv6 全局单播地址的方法。SLAAC 的核心 ICMPv6。IC.
  • springboot 2.x自动配置原理简单分析

    千次阅读 2019-03-09 20:58:39
    1、什么是自动配置? 在学习SSM开发项目时,我们需要自己引入spring、springMVC以及mybatis的依赖,并且需要使用配置文件或者java config来进行配置,比如配置视图解析器等等组件。但springboot 为我们提供了一种...
  • 什么是SpringCloudBus?如何使用SpringCloudBus实现自动更新配置功能? 】 大家好,我是IT修真院郑州分院第11期的学员何爽,一枚正直纯洁善良的后端程序员,今天给大家分享一下,修真院官网java(职业)任务10,...
  • springboot自动配置原理

    2020-08-06 10:06:15
    自动配置:*****AutoConfiguration这个名字的就是什么自动配置类:例如:DataSourceAutoConfiguration即数据源自动配置类。 以DataSourceAutoConfiguration来简单介绍一下自动配置原理。 //表示这一个配置类,和...
  • 1、fatal: unable to access '...2、上述报错中,gitlab.example.com这个主机什么地方配置的?
  • SpringBoot 自动配置原理

    千次阅读 2019-03-10 18:16:47
    对于配置文件来说到底在配置文件里面可以进行配置那些内容,自动配置的原理又是什么东西呢? 自动配置原理 在SpringBoot启动的时候加载主配置类,开启了自动配置的功能,通过@EnableAutoConfiguration注解开启自动...
  • 原因很简单,就是写的少,简单,毕竟是自动配置的嘛。但是这里的自动并不是我们什么都没做,Spring就帮我们做好了,最起码我们还需要告诉Spring我们需要用自动配置方案,Spring才知道我们采取这种方法。即自动配置中...
  • SpringBoot自动配置原理

    2019-07-03 22:22:27
    SpringBoot帮我们简化了大量繁琐的代码以及许多工具类,它的自动配置是一个比较好用的东西,今天就学习了一下SpringBoot的自动配置原理,现在总结一下: 1、自动配置原理: a.SpringBoot启动的时候会加载主配置类,...
  • SpringBoot的核心就是自动配置自动配置基于条件判断来配置Bean。关于自动配置的源码在spring-boot-autoconfigure-2.0.0.RELEASE.jar 在讲springBoot自动配置之前我们应该思考,为什么要有自动配置,有什么...
  • springBoot自动配置原理

    2021-03-20 10:28:38
    一、自动装配是什么? 自动装配就是spring容器启动后,一些自动配置类就自动装配的IOC容器中,不需要我们手动去注入。 二、自动配置原理 SPI:server provider interface 的简写,字面意思服务发现接口,我理解...
  • 有一个问题一直让我好奇,为什么在SpringBoot中有的bean 我们都没有配置却能够自动注入,这个比如说我们使用JdbcTemplate 的时候那个对象明明我们都没有配置但是却能获取到。再比如SpringBoot在结合Redis的时候,...
  • 一个自动配置的注解; 在这个注解里有一个类SpringFactoriesLoader,这个类可以读取文件META-INF/spring.factories中的中的key为 org.springframework.boot.autoconfigure.EnableAutoConfiguration的内容所有...
  • 自动配置原理 配置文件到底能写什么?怎么写? SpringBoot官方文档中有大量的配置,我们无法全部记住 分析自动配置原理 我们以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理; //表示这一...
  • 当SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration 点击进入@SpringBootApplication @EnableAutoConfiguration #开启自动配置功能; @Target({ElementType.TYPE}) @Retention...
  • 什么是自动配置? Spring 和 SpringMVC 的问题在于需要配置大量的参数。 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>...
  • 该文章主要介绍SpringBoot的自动配置原理以及如何自己创建一个自动化的配置。 一、SpringBoot是什么? 简单来说SpringBoot一个脚手架,对Spring整合其他资源框架的封装。 二、自动配置原理 ...
  • Springboot自动配置原理

    2021-04-13 23:54:41
    Springboot自动配置原理 springboot简化开发,只需要一个启动类就可以开启我们的代码之旅。在启动类上,我们通常添加一个注解@SpringBootApplication,这个注解就是自动配置的核心。 该注解个组合注解,组合了@...
  • 下班后闲着无聊看了下 SpringBoot 中的自动配置,把我的理解跟大家说下。 配置文件能写什么? 相信接触过 SpringBoot 的朋友都知道 SpringBoot 有各种 starter 依赖,想要什么直接勾选加进来就可以了。想要自定义的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,959
精华内容 5,183
关键字:

什么是自动配置