资讯专栏INFORMATION COLUMN

【Java入门】SpringBoot自动配置原理

468122151 / 2815人阅读

摘要:作者谭淼一运行原理的运行是由注解提供的。完成自动配置类。自动配置类主要作用是的配置核心,它会写在中,告知在启动时去读取该类并根据该类的规则进行配置。会检测是否存在类类会查看是否开启该自动配置。

作者:谭淼

一、运行原理

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。

二、自定义Starter

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

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

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

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

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

...

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

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



   4.0.0
 
   cn.miaolovezhen
   spring-boot-starter-test
   0.0.1-SNAPSHOT
   jar
 
   spring-boot-starter-test
   Demo project for Spring Boot
 
   
      org.springframework.boot
      spring-boot-starter-parent
      1.5.6.RELEASE
       
   
 
   
      UTF-8
      UTF-8
      1.8
   
 
   
      
         org.springframework.boot
         spring-boot-autoconfigure
         1.5.4.RELEASE
      
   
 

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

好啦,搞定!下面可以使用maven install命令把starter存到本地,其他SpringBoot项目需要使用这个starter,直接导入就可以啦。

 

参考:《java EE开发的颠覆者:springboot实战》

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72832.html

相关文章

  • SpringBoot自动配置原理

    摘要:开启自动配置功能后文详解这个注解,学过的同学应该对它不会陌生,就是扫描注解,默认是扫描当前类下的。简单来说,这个注解可以帮助我们自动载入应用程序所需要的所有默认配置。简单理解这二者扫描的对象是不一样的。 前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面Spring的文章(以学习...

    Rainie 评论0 收藏0
  • SpringBoot基础入门

    摘要:基础入门篇简介可以基于轻松创建可以运行的独立的生产级的应用程序。对平台和第三方类库我们有自己看法和意见约定大于配置。官网目前最新版本是我们接下来就在这个版本的基础上面进行学习。变成项目引入依赖。 SpringBoot基础入门篇 简介 Spring Boot可以基于Spring轻松创建可以运行的、独立的、生产级的应用程序。 对Spring平台和第三方类库我们有自己看法和意见(约定大于配置...

    Edison 评论0 收藏0
  • spring boot - 收藏集 - 掘金

    摘要:引入了新的环境和概要信息,是一种更揭秘与实战六消息队列篇掘金本文,讲解如何集成,实现消息队列。博客地址揭秘与实战二数据缓存篇掘金本文,讲解如何集成,实现缓存。 Spring Boot 揭秘与实战(九) 应用监控篇 - HTTP 健康监控 - 掘金Health 信息是从 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring...

    rollback 评论0 收藏0

发表评论

0条评论

468122151

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<