温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Spring boot是怎么完成自动配置的?

发布时间:2020-06-02 21:50:27 来源:亿速云 阅读:281 作者:Leah 栏目:编程语言

这篇文章给大家分享的是有关springboot的自动配置原理的内容。小编觉得挺实用的,因此分享给大家学习。如下资料是关于springboot的自动配置原理的内容

springboot和ssm之间最大的区别就在于它的自动配置,springboot自动配置原理也是springboot的精髓,可以说掌握了它就掌握了springboot的90%,便可以游刃有余的使用springboot,我来说说springboot的自动配置原理:

我们创建好一个springboot项目它是从这里开始执行的:

@SpringBootApplication

public class SpringbootDemoApplication {

 

   public static void main(String[] args) {

      SpringApplication.run(SpringbootDemoApplication.class, args);

   }

}

似乎没有什么特别之处,除了@SpringBootApplication注解,spirngboot的神奇能力正是由它带来的,我们看看这个注解:

@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注解,通过这个注解开启了springboot的自动配置:

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@AutoConfigurationPackage

 

@Import({AutoConfigurationImportSelector.class})

 

public @interface EnableAutoConfiguration {

...

它上面有一个注解:@Import({AutoConfigurationImportSelector.class}),这个注解可以利用AutoConfigurationImportSelector扫描所有jar包类路径下的META-INF/spring.factories文件并且获取到文件中 EnableAutoConfiguration的值(也就是各种自动配置类),将他们放入spring容器中。

在spring-boot-autoconfigure中spring.factories文件如下

# 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,\

org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\

org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\

...

所有的以 AutoConfiguration为后缀的类的对象都被放入spring容器中,就是用他们来完成自动配置。

以HttpEncodingAutoConfiguration (http编码自动配置)为例看看它是如何完成自动配置:

@Configuration(           //表示他是一个配置类

    proxyBeanMethods = false

)

@EnableConfigurationProperties({HttpProperties.class}) //启用HttpProperties类上的ConfigurationProperties

@ConditionalOnWebApplication(     //判断当前应用是否是web应用,如果是则当前配置类生效

    type = Type.SERVLET

)

@ConditionalOnClass({CharacterEncodingFilter.class}) //判断当前项目有没有CharacterEncodingFilter

                                                   //spring mvc中解决乱码问题的),如果有则当前配置类生效

@ConditionalOnProperty(                  //判断当前项目中是否有spring.http.encoding.enabled配置如果有

                                         //或者没有设置该属性则当前配置类生效

    prefix = "spring.http.encoding",

    value = {"enabled"},

    matchIfMissing = true

)

public class HttpEncodingAutoConfiguration {

    private final Encoding properties;

 

    public HttpEncodingAutoConfiguration(HttpProperties properties) {

        this.properties = properties.getEncoding();

    }

 

    @Bean             //CharacterEncodingFilter对象放入spring容器

    @ConditionalOnMissingBean

    public CharacterEncodingFilter characterEncodingFilter() {

        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();

        filter.setEncoding(this.properties.getCharset().name());

        filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST));

        filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));

        return filter;

    }

...

@EnableConfigurationProperties({HttpProperties.class}) 注解可以启用HttpProperties类上的ConfigurationProperties,当我们在配置文件中设置或修改属性时就会映射到HttpProperties类中的属性。

@ConfigurationProperties( //将配置文件中的值和HttpProperties类绑定,

                         

    prefix = "spring.http"

)

public class HttpProperties {

       public static class Encoding {

        public static final Charset DEFAULT_CHARSET;

        private Charset charset;

        private Boolean force;

...

例如:我可以在springboot配置文件application.properties中配置:spring.http.charset的值,它会被映射到HttpProperties类中的charset属性。

因此我们在配置文件中所做的配置都会被映射到一个 以properties为后缀的类,也就是说当我们需要对某一个功能做配置的时候能去配置什么可以参考该功能对应的属性类。

@ConditionalOnWebApplication,@ConditionalOnClass,@ConditionalOnProperty都是根据条件判断HttpEncodingAutoConfiguration自动配置类是否能够生效。

如果这些条件都满足,HttpEncodingAutoConfiguration自动配置类生效,则:

@Bean    //CharacterEncodingFilter对象放入spring容器

@ConditionalOnMissingBean

public CharacterEncodingFilter characterEncodingFilter() {

    CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();

    filter.setEncoding(this.properties.getCharset().name());

    filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST));

    filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));

    return filter;

}

CharacterEncodingFilter 对象会被放入spring容器,在这个方法中有一行代码:

filter.setEncoding(this.properties.getCharset().name());表示设置编码,在获取编码的时候是从

properties中获取的

 private final Encoding properties;     

public HttpEncodingAutoConfiguration(HttpProperties properties) {        

this.properties = properties.getEncoding();     }

从这里可以看出properties是HttpProperties 类型的对象,从前面的分析我们知道springboot中的配置会被映射到HttpProperties类,所以我们可以通过修改springboot的配置文件来修改他的值。

总结一下:springboot会扫描所有jar包类路径下的META-INF/spring.factories文件,加载大量功能的自动配置类,某个功能的自动配置类,在满足条件生效以后会向spring容器中放入相应对象,这些对象的属性可以通过以properties为后缀的配置类来设置,而配置类又和springboot的配置文件绑定,因此我们可以通过修改配置文件来设置这些对象的属性。

知道了springboot自动配置的原理,如果我们要开发一个功能首先可以去找一下看看有没有相应的自动配置类,如果有再看看这个自动配置类中配置了哪些对象,有没有我们需要的,如果有直接用就ok,没有就需要我们自己去开发了。

关于springboot的自动配置原理就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果喜欢这篇文章,不如把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI