spring boot自动配置原理

spring boot 在启动时,会加载spring boot autoconfigigure  /META-INF/spring.factories,定义了初始化设置类,将初始化的环境纳入spring 的容器中.如下:


当我们运行XXXApplication的main方法的时候 springApplication.run(xx.class)会首先执行springApplication的初始化方法,

    private void initialize(Object[] sources) {
        if (sources != null && sources.length > 0) {
            this.sources.addAll(Arrays.asList(sources));
        }

        this.webEnvironment = this.deduceWebEnvironment();
        this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
        this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
        this.mainApplicationClass = this.deduceMainApplicationClass();
    }
public abstract class SpringFactoriesLoader {
    private static final Log logger = LogFactory.getLog(SpringFactoriesLoader.class);
    public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
 


 举例:redis

首先是从spring.factories属性是定义redis相关的内容:

org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\

org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\

表明单工程开启的时候,首先会找RedisAutoConfiguration.Class 和RedisRepositoriesAutoConfiguration文件 

@Configuration
@ConditionalOnClass({Jedis.class, EnableRedisRepositories.class})
@ConditionalOnProperty(
    prefix = "spring.data.redis.repositories",
    name = {"enabled"},
    havingValue = "true",
    matchIfMissing = true
)
@ConditionalOnMissingBean({RedisRepositoryFactoryBean.class})
@Import({RedisRepositoriesAutoConfigureRegistrar.class})
@AutoConfigureAfter({RedisAutoConfiguration.class})
public class RedisRepositoriesAutoConfiguration {
    public RedisRepositoriesAutoConfiguration() {
    }
}

这个类表明要加载redis的其他文件后参能运行

@conditionalOnClass({a.class , b.class})

Spring容器中是否存在对应的实例。可以通过实例的类型、类名、注解、昵称去容器中查找(可以配置从当前容器中查找或者父容器中查找或者两者一起查找)这些属性都是数组,通过"与"的关系进行查找

个人理解是,表示只有存在a b 类的情况下才会加载本类。


表明在application.properties里的书写规则

猜你喜欢

转载自blog.csdn.net/cclovezbf/article/details/80292705