目录
2.1、@SpringBootConfiguration注解内容:
2.4、以DataSourceAutoConfiguration为例,了解SpringBoot如何自动装配
1、Application
典型springBoot应用的启动,一般在项目的根路径下面,一般是XXXApplication的入口类,入口会有main方法,这个是一个标准的java程序的入口。
package com.znn;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Hello world!
*
*/
@SpringBootApplication
@MapperScan("com.znn.mapper")//使用MapperScan批量扫描接口文件
public class App
{
public static void main( String[] args )
{
SpringApplication.run(App.class,args);
}
}
@SpringBootApplication:该注解开启组件扫描和自动装配。
SpringApplication.run():负责启动引导应用程序。
2、@SpringBootApplication注解
@SpringBootApplication注解是SpringBoot的核心注解,它实际上是一个组合注解,将三个主要注解组合在一起。
@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 {
...
}
@SpringBootConfiguration:表明当前是一个配置类,可以在类中配置bean,类似于SpringBoot提供的@Configuration。
@EnableAutoConfiguration:表示开启自动装配。
@ComponentScan:完成包扫描。
2.1、@SpringBootConfiguration注解内容:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
@Configuration注解是Spring框架提供的注解,表明该类是java的配置类,在SpringBoot中使用@SpringBootConfiguration注解来代替@Configuration,作用一样,仅仅是做了一层包装。/2。
2.2、@ComponentScan注解
该注解对应xml配置中的元素,功能主要是自动扫描并加载符合条件的组件或者是bean的定义,最终将bean装配到IOC容器中,默认Spring框架实现是从声明@ComponentScan所在类的package进行扫描,所以SpringBoot中的启动最好放在root package下,这样能够完成当前包以及其子包中所有注解的扫描。
2.3、EnableAutoConfiguration注解
该注解声明形式如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
EnableAutoConfiguration借助于@Import注解,收集和注册特定场景相关的bean的定义。
自动装配中核心点借助于@Import({EnableAutoConfigurationImportSelector.class}),借助于EnableAutoConfigurationImportSelector类,使用该类将所有符合条件的@Configuration配置都加载到SpringBoot的容器中。借助于Spring框架原有的工具,SpringFactoriesLoader的支持。
SpringFactoriesLoader类主要完成类的加载,主要是从指定的配置文件MENT-INF/spring.factories中加载配置。
这是SpringBoot中Autoconfiguration依赖包下MENT-INF/spring.factories的一部分,通过加载Autoconfiguration的配置,通过反射来实例化对应的@Configuration,再判断是否需要加载具体信息。
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return NO_IMPORTS;
} else {
try {
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
configurations = this.removeDuplicates(configurations);
configurations = this.sort(configurations, autoConfigurationMetadata);
Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = this.filter(configurations, autoConfigurationMetadata);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return (String[])configurations.toArray(new String[configurations.size()]);
} catch (IOException var6) {
throw new IllegalStateException(var6);
}
}
}
2.4、以DataSourceAutoConfiguration为例,了解SpringBoot如何自动装配
在自动装配类中或有很多条件性注解:
@ConditionalOnBean:当容器里有指定的bean的条件下。
@ConditionalOnClass:当类路径下有指定的类的条件下。
@ConditionalOnProperty:指定的属性是否有指定的值。
@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@EnableConfigurationProperties({DataSourceProperties.class})
@Import({Registrar.class, DataSourcePoolMetadataProvidersConfiguration.class})
public class DataSourceAutoConfiguration {
private static final Log logger = LogFactory.getLog(DataSourceAutoConfiguration.class);
public DataSourceAutoConfiguration() {
}
@Bean
@ConditionalOnMissingBean
public DataSourceInitializer dataSourceInitializer(DataSourceProperties properties, ApplicationContext applicationContext) {
return new DataSourceInitializer(properties, applicationContext);
}
@EnableAutoConfiguration会导入EnableAutoConfigurationImportSelector类,而这个类的selectImports通过SpringFactoriesLoader得到大量配置类,而每一个配置上则根据条件配置来做出决策,以实现自动装配。