IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot自动装配原理-3 -> 正文阅读

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

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-14 23:36:51  更:2022-04-14 23:41:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:02:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码