Spring Boot 简介

本文深入解析了Spring Boot的自动配置机制,包括`@SpringBootApplication`注解的工作原理,以及如何通过`@EnableAutoConfiguration`进行条件装配。特别地,文章详细介绍了MongoDB的自动配置,展示了如何利用`MongoAutoConfiguration`类实现与MongoDB的快速集成,允许开发者通过`application.properties`修改连接配置。最后,讨论了自定义Starter的制作,并列举了一系列条件注解,如`@ConditionalOnClass`和`@ConditionalOnProperty`,用于实现精细化的bean装配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、习惯优于配置

  1. spring-boot-autoconfigure-x.x.x.x.jar该jar囊括了大多数流行的第三方技术框架,已经给我们配置好了一套默认配置
  2. spring boot默认读取application.properties配置文件

二、运行原理

  1. 核心注解@SpringBootApplication,而实际上它是有三个注解组成,分别是@Configuration、@EnableAutoConfiguration、@ComponentScan,而核心功能是由@EnableAutoConfiguration这个注解提供的
  2. 在@EnableAutoConfiguration注解里的关键功能是@Import注解,导入的配置功能
    EnableAutoConfigurationImportSelector使用SpringFactoriesLoader.loadFactoryNames方法来扫描具有META-INF/spring.factories文件的jar包,这个文件中声明了有哪些要自动配置

三、分析mongodb的自动配置

  1. 打开org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration
    package org.springframework.boot.autoconfigure.mongo;
    import com.mongodb.MongoClient;
    import com.mongodb.MongoClientOptions;
    import java.net.UnknownHostException;
    import javax.annotation.PreDestroy;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.boot.autoconfigure.mongo.MongoProperties;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.env.Environment;
    @Configuration
    @ConditionalOnClass({MongoClient.class})  
    @EnableConfigurationProperties({MongoProperties.class}) //开启属性注入。
    @ConditionalOnMissingBean(
        type = {"org.springframework.data.mongodb.MongoDbFactory"}
    ) 
    public class MongoAutoConfiguration {
        @Autowired
        private MongoProperties properties;
        @Autowired(
            required = false
        )
        private MongoClientOptions options;
        @Autowired
        private Environment environment;
        private MongoClient mongo;
        public MongoAutoConfiguration() {
        }
        @PreDestroy
        public void close() {
            if(this.mongo != null) {
                this.mongo.close();
            }
        }
        @Bean //使用java配置,当容器中没有这个bean的时候执行初始化
        @ConditionalOnMissingBean
        public MongoClient mongo() throws UnknownHostException {
            this.mongo = this.properties.createMongoClient(this.options, this.environment);
            return this.mongo;
        }
    }
    
  2. 首先这被@Configuration注解了,是一个配置类,当满足以下条件这个bean被装配:
    当MongoClient在类路径下。
    当容器中没有org.springframework.data.mongodb.MongoDbFactory这类bean的时候。
    此外,我们可以看一下通过@EnableConfigurationProperties({MongoProperties.class}) 自动注入的属性(这是习惯优于配置的最终落地点):
    @ConfigurationProperties(
        prefix = "spring.data.mongodb"
    )
    public class MongoProperties {
        public static final int DEFAULT_PORT = 27017;
        private String host;
        private Integer port = null;
        private String uri = "mongodb://localhost/test";
        private String database;
        private String authenticationDatabase;
        private String gridFsDatabase;
        private String username;
        private char[] password;
        private Class<?> fieldNamingStrategy;
    
        ......
    }
    
  3. 所以在我们什么都不干的情况下,只需要引入spring-data-mongodb这个依赖再加上默认的MongoDB server我们就能够快速集成MongoDB,用MongodbTemplate访问数据库。
    同时我们可以通过在application.properties中修改spring.data.mongodb相关的参数就能够修改连接配置,如:
    spring.data.mongodb.host=localhost
    spring.data.mongodb.port=27017
    spring.data.mongodb.username=poa
    spring.data.mongodb.password=poa
    spring.data.mongodb.database=test
    
    

四、制作自己的Starter

  1. Spring Boot自动装配
  • Bean条件装配

    @ConditionalOnBean:当容器里有指定的bean的条件下。
    @ConditionalOnMissingBean:当容器里不存在指定bean的条件下。

  • Class条件装配

    @ConditionalOnClass:当类路径下有指定类的条件下。
    @ConditionalOnMissingClass:当类路径下不存在指定类的条件下。

  • Environment装配

    @ConditionalOnProperty:指定的属性是否有指定的值,比如@ConditionalOnProperties(prefix=”xxx.xxx”, value=”enable”, matchIfMissing=true),代表当xxx.xxx为enable时条件的布尔值为true,如果没有设置的情况下也为true。

  • 其它装配

    @ConditionalOnExpression:当表达式为true时,才会实例化一个Bean。支持SpEL表达式。 @ConditionalOnJava:当存在制定Java版本的时候

  • 联合多条件

  • 自定义条件(实现Condition接口)

    @ConditionalOnClass : classpath中存在该类时起效 
    @ConditionalOnMissingClass : classpath中不存在该类时起效 
    @ConditionalOnBean : DI容器中存在该类型Bean时起效 
    @ConditionalOnMissingBean : DI容器中不存在该类型Bean时起效 
    @ConditionalOnSingleCandidate : DI容器中该类型Bean只有一个或@Primary的只有一个时起效 
    @ConditionalOnExpression : SpEL表达式结果为true时 
    @ConditionalOnProperty : 参数设置或者值一致时起效 
    @ConditionalOnResource : 指定的文件存在时起效 
    @ConditionalOnJndi : 指定的JNDI存在时起效 
    @ConditionalOnJava : 指定的Java版本存在时起效 
    @ConditionalOnWebApplication : Web应用环境下起效 
    @ConditionalOnNotWebApplication : 非Web应用环境下起效
    
    @AutoConfigureAfter:在指定的配置类初始化后再加载 
    @AutoConfigureBefore:在指定的配置类初始化前加载 
    @AutoConfigureOrder:数越小越先初始化
    
  1. 其实编写Starter与编写一个普通的Spring Boot应用没有太大区别,只要在pom文件中写好依赖,使用@Configuration和@Bean来自动装配集成。唯一的一点区别是需要告诉Spring Boot自动装配类在哪里,这是通过spring.factories文件完成的
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kse_music

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值