SpringBoot自动装配原理-3

目录

1、Application

2、@SpringBootApplication注解

2.1、@SpringBootConfiguration注解内容:

2.2、@ComponentScan注解

2.3、EnableAutoConfiguration注解

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得到大量配置类,而每一个配置上则根据条件配置来做出决策,以实现自动装配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值