java培训
搜索分类

pringboot自动配置原理是什么?pringboot自动配置原理实现

赋能网 2023-05-09 3864

Spring Boot是基于Spring开发的,它就相当于maven整合了所有jar包,Spring Boot整合了所有框架。其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,那springboot自动配置原理是什么?下面来我们就来给大家讲解一下。

springboot自动配置工作原理

1运行原理

Spring Boot的运行是由注解@EnableAutoConfiguration提供的。

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

这里的关键功能是@import注解。EnableAutoConfigurationimportSelector使用SpringFactoriesLoader.loadFactoryNames方法来扫描具有MEAT-INF/spring.factories文件的jar包(1.5版本以前使用EnableAutoConfigurationimportSelector类,1.5以后这个类废弃了使用的是AutoConfigurationimportSelector类),下面是spring-boot-autoconfigure-1.5.4.RELEASE.jar下的MEAT-INF中的spring.factories文件的部分内容。

#
Initializers
org.springframework.context.ApplicationContextInitializer = \
    org.springframework.boot.autoconfigure.SharedmetadataReaderFactoryContextInitializer, \
    org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer# Application Listeners
org.springframework.context.ApplicationListener = \
    org.springframework.boot.autoconfigure.BackgroundPreinitializer# Auto Configuration import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationimportListener = \
    org.springframework.boot.autoconfigure.condition.ConditionevaluationReportAutoConfigurationimportListener# Auto Configuration import Filters
org.springframework.boot.autoconfigure.AutoConfigurationimportFilter = \
    org.springframework.boot.autoconfigure.condition.OnClassCondition# 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, \
    org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, \
    org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration, \
    org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration, \

里面的类都是自动配置类,SpringBoot会根据这些自动配置类去自动配置环境。

下面我们就自动动手写一个starter。

2自定义Starter

首先先介绍几个条件注解。

@ConditionalOnBean:当容器里有指定的Bean为true

@ConditionalOnClass:当类路径下有指定的类为true

@ConditionalOnMissingBean:当容器里没有指定的Bean为true

@ConditionalOnProperty:指定的数据是否有指定的值

...

了解了条件注解后,我们开始自定义Starter。

1、在自定义Starter之前先要在Maven中填写依赖。

              

2、完成TestProperties类,这个类定义了默认的属性值,如该类中,只有一个属性值msg,默认为world。@ConfigurationProperties注解会定义一个匹配,如果想修改属性值,可以在application.properties中使用“匹配.属性=修改的值”进行修改。如test.msg = tan

@ConfigurationProperties(prefix = "test")
public class TestProperties
{
    private static final String MSG = "springboot";
    private String msg = MSG;
    public String getMsg()
    {
        return msg;
    }
    public void setMsg(String msg)
    {
        this.msg = msg;
    }
}

3、完成服务类。服务类是指主要的功能类,如果没有SpringBoot,这些服务类在Spring中都是需要自己去配置生成的。如SpringMVC中的DispatcherServlet、Mybatis的DataSource等。

public class TestService
{
    private String msg;
    public String sayHello()
    {
        return "Hello " + msg;
    }
    public String getMsg()
    {
        return msg;
    }
    public void setMsg(String msg)
    {
        this.msg = msg;
    }
}

4、完成自动配置类。自动配置类主要作用是SpringBoot的配置核心,它会写在MEAT-INF/spring.factories中,告知SpringBoot在启动时去读取该类并根据该类的规则进行配置。

@EnableConfigurationProperties注解根据TestProperties类开启属性注入,允许在application.properties修改里面的属性值。

@ConditionOnClass会检测是否存在TestService类

@ConditionOnProperty类会查看是否开启该自动配置。默认开启(true)。

@ConditionOnMissingBean会检测容器中是否有TestService类的对象,如果没有则生成一个。

@Configuration
@EnableConfigurationProperties(TestProperties.class)
@ConditionalOnClass(TestService.class)
@ConditionalOnProperty(prefix = "test", value = "enabled", matchIfMissing = true)
public class TestServiceAutoConfiguration
{
    @Autowired
    TestProperties testProperties;
    @Bean
    @ConditionalOnMissingBean(TestService.class)
    public TestService testService()
    {
        TestService testService = new TestService();
        testService.setMsg(testProperties.getMsg());
        return testService;
    }
}

5、最后一步,不要忘记在在MEAT-INF文件夹中创建spring.factories文件。内容很简单,告诉SpringBoot去读取TestServiceAutoConfiguration类。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.miaolovezhen.TestServiceAutoConfiguration

这就是SpringBoot自动配置的原理,SpringBoot能够快速创建独立运行的Spring项目以及主流框架集成,可以简化开发,是开发人员更加高效的开发项目!最后大家如果想要了解更多其他工具教程知识,敬请关注赋能网。

发表评论
0评