SpringBoot 自动化配置,以quartz为例
总结来说:
SpringBoot的自动化配置是这样实现的,启动时会去加载jar包(一般是spring-boot-autoconfigure-2.1.1.RELEASE.jar)中如下路径的“META-INF/spring.factories”内容,如下:
org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\
org.springframework.boot.autoconfigure.reactor.core.ReactorCoreAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,
然后以上述的全类名加载相关的bean,比如QuartzAutoConfiguration进行自动化配置,如下:
package org.springframework.boot.autoconfigure.quartz; import java.util.Map; import java.util.Properties; import javax.sql.DataSource; import org.quartz.Calendar; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.Trigger; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AbstractDependsOnBeanFactoryPostProcessor; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.core.io.ResourceLoader; import org.springframework.scheduling.quartz.SchedulerFactoryBean; import org.springframework.scheduling.quartz.SpringBeanJobFactory; import org.springframework.transaction.PlatformTransactionManager; /** * {@link EnableAutoConfiguration Auto-configuration} for Quartz Scheduler. * * @author Vedran Pavic * @author Stephane Nicoll * @since 2.0.0 */ @Configuration @ConditionalOnClass({ Scheduler.class, SchedulerFactoryBean.class, PlatformTransactionManager.class }) @EnableConfigurationProperties(QuartzProperties.class) @AutoConfigureAfter({ DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class }) public class QuartzAutoConfiguration { private final QuartzProperties properties; private final ObjectProvidercustomizers; private final JobDetail[] jobDetails; private final Map calendars; private final Trigger[] triggers; private final ApplicationContext applicationContext; public QuartzAutoConfiguration(QuartzProperties properties, ObjectProvider customizers, ObjectProvider jobDetails, ObjectProvider
那启动时是如何加载spring.factories文件中的类并生成对象的呢
这块每个版本的SpringBoot项目实现是不一样的,此处以2.1.1版本为例说明:
1、启动类的:
@SpringBootApplication
2、SpringootApplication的@EnableAutoConfiguration注解:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication {
3、@EnableAutoConfiguration中的@Import(AutoConfigurationImportSelector.class)注解:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration {
4、@Import注解的作用就是生成bean,而生成哪些bean就是根据他的参数AutoConfigurationImportSelector.class来决定。
5、AutoConfigurationImportSelector中定义了需要生成的bean的列表。
Scheduler