Contents
  1. 1. 启动原理
  2. 2. 习惯优于配置的原理
    1. 2.1. 示例

启动原理

@SpringBootApplication整合了3个注解:SpringBootConfiguration、EnableAutoConfiguration、ComponentScan

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}

  1. @SpringBootConfiguration:表明这是一个IOC容器的配置类,相当于说明该bean是一个spring中的xml文件。例如下面的Shiroconfig配置类也用了这个注解

    @Configuration
    public class ShiroConfig {
    @Bean
    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
    }
  2. @ComponentScan:指定了Spring中的指定MVC bean的扫描包和Spring的扫描包,扫描路径就是该类所在的所有包。SpringBoot的注解扫描所有的同路径下的类,@Controller类归位MVC类,其它类为Spring的类

    常规mvc配置指定包
    <context:component-scan base-package="com.test.Action" />
    Spring也要指定Spring的注解类的扫描路径
    <context:component-scan base-package="com.test" />
  3. @EnableAutoConfiguration:加载Spring常规相关的类,比如DataSource,核心功能有@import注解。类似的还有@EnableEurekaServer,则会自动import Eureka相关的bena

    @AutoConfigurationPackage
    @Import(EnableAutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration {}

习惯优于配置的原理

SpringBoot的Main方法里面run的时候会引用到SpringFactoriesLoader里面的loadFactoryNames,会扫描spring-boot-autoconfigure.jar配置包里发现META-INF/spring.factories,然后加载许多默认的Configuration的全限定名,然后反射生成Configuration,类里面会引入默认的配置参数,从而实现习惯优于配置

public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
String factoryClassName = factoryClass.getName();
try {
Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
List<String> result = new ArrayList<String>();
}

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

示例

  1. spring.factories中获取redisConfig的全限定名。

    org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
  2. 反射生成RedisAutoConfiguration,并且制定了已经默认填好的RedisProperties.class参数类

    @Configuration
    @ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class })
    @EnableConfigurationProperties(RedisProperties.class)
    public class RedisAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean(RedisConnectionFactory.class)
    public JedisConnectionFactory redisConnectionFactory()
    throws UnknownHostException {
    return applyProperties(createJedisConnectionFactory());
    }
    }
    @ConfigurationProperties(prefix = "spring.redis")
    public class RedisProperties {
    private int database = 0;
    private String url;
    private String host = "localhost";
    private String password;
    private int port = 6379;
Contents
  1. 1. 启动原理
  2. 2. 习惯优于配置的原理
    1. 2.1. 示例