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 类的情况下才会加载本类。