文章目录
一、了解SpringBoot
SpringBoot基于Spring设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。
SpringBoot所具备的特征有:
(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器;
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
(4)尽可能自动配置Spring容器;
(5)提供准备好的特性,如指标、健康检查和外部化配置;
(6)绝对没有代码生成,不需要XML配置。
二、Spring自动配置机制
代码如下(示例):
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
System.out.println("第一个SpringBoot框架!");
}
}
官方虽然没有给出我们SpringBoot自动配置的源码,但是不难看出,SpringBoot是通过@SpringBootApplication来标识一个启动类,并完成相关依赖jar包的自动配置。
其中@SpringBootApplication是一个复合注解,由@SpringBootConfig、@EnableAutoConfigration、@ComponentScan组成。
SpringBoot主要是通过这仨个注解实现自动配置
我们点进去每个注解,看他们都做了什么。
@SpringBootConfiguration详解
代码如下(示例):
@Target({
ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
@SpringBootConfiguration底层是一个@Configuration注解,其作用是将类标记为一个配置类,并交给Spring容器管理。
@EnableAutoConfiguration详解
@EnableAutoConfiguration由两个注解组合而成:@AutoConfigurationPackage、@Import,其中@AutoConfiguration负责BeanDefinition的注册,@Import根据导入的AutoConfigurationImportSelector.class,去获取META-INFO下的Spring.factories配置文件,实现自动配置
@Target({
ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage //负责实现Bean的定义与注册
@Import({
AutoConfigurationImportSelector.class}) //负责自动配置
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {
};
String[] excludeName() default {
};
}
@AutoConfiguration中同样也是一个@Import注解,其中引入了Registrar.class,是实现BeanDefinition注册的关键类
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
Registrar() {
}
//Bean注册核心类
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new AutoConfigurationPackages.PackageImports(metadata));
}
}
@ComponentScan详解
扫描启动类同级包以及子级包里所有的Bean
三、总结
SpringBoot通过@SpringBootConfig、@EnableAutoConfigration、@ComponentScan三个注解实现自动配置。
(1)@ComponentScan负责项目项目启动类所有同级包和子级包所有的Bean
(2)那么不在项目内的Bean就需要@Import去实现,而Import的内容就是META-INFO中spring.factories中读取,并通过BeanDefinitionRegister实现Bean到Spring IOC的注册。实现Bean的装配