zoukankan      html  css  js  c++  java
  • 【SpringBoot】入门程序和机制分析

    一、初建项目

    首先要导入SpringBoot的Maven依赖

    
    <!-- Inherit defaults from Spring Boot -->
    <!-- 这是SpringBoot的核心依赖,所有的项目都要导入此依赖,SpringBoot通过此依赖管理SpringBoot的依赖关系,以及版本-->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.0.RELEASE</version>
        </parent>
    
    <!-- 这里引入了web的启动器,SpringBoot将模块分成一个个的启动器,如果使用到某一个模块,就要引入相关的启动器 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring‐boot‐starter‐web</artifactId>
        </dependency>
    
    /**
    * @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用 */
    @SpringBootApplication
    public class HelloWorldMainApplication{ 
        public static void main(String[] args) {
        // Spring应用启动起来
        SpringApplication.run(HelloWorldMainApplication.class,args);
        }
    }
    

    在SpringBoot启动类上面要加入@SpringBootApplication注解
    此注解表明是SpringBoot的启动类,运行此类就可以启动项目,SpringBoot项目内嵌了Tomcat服务器,

    二、关于@SpringBootApplication

    标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot 就应该运行这个类的main方法来启动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 {
        //...代码省略...
    }
    

    2.1 SpringBootConfiguration

    源码如下

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Configuration
    public @interface SpringBootConfiguration {
    
    }
    

    标注在某个类上,表示这是一个Spring Boot的配置类;

    2.2 EnableAutoConfiguration

    以前我们在Spring中需要配置的东西,Spring Boot帮我们自动配置;
    @EnableAutoConfiguration告诉SpringBoot开启自动配置功能;这样自动配置才能生效;

    源码如下:

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage  //自动配置包
    @Import(AutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration {
        // ....
    }
    

    AutoConfigurationPackage

    Spring的底层注解@Import,给容器中导入一个组件;导入的组件由AutoConfigurationPackages.Registrar.class;将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器;

    @Import(AutoConfigurationImportSelector.class)

    • 给容器中导入组件? EnableAutoConfigurationImportSelector:导入哪些组件的选择器;
    • 将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中;会给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入这个场景需要的所有组件, 并配置好这些组件;

    Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就自动配置工作,以前我们配置的东西,就交由自动配置类帮我们配置。

    public class AutoConfigurationImportSelector
            implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware,
            BeanFactoryAware, EnvironmentAware, Ordered {
            
            // ....代码省略...
            @Override
        public String[] selectImports(AnnotationMetadata annotationMetadata) {
            if (!isEnabled(annotationMetadata)) {
                return NO_IMPORTS;
            }
            try {
                AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
                        .loadMetadata(this.beanClassLoader);
                AnnotationAttributes attributes = getAttributes(annotationMetadata);
                List<String> configurations = getCandidateConfigurations(annotationMetadata,
                        attributes);
                configurations = removeDuplicates(configurations);
                configurations = sort(configurations, autoConfigurationMetadata);
                Set<String> exclusions = getExclusions(annotationMetadata, attributes);
                checkExcludedClasses(configurations, exclusions);
                configurations.removeAll(exclusions);
                configurations = filter(configurations, autoConfigurationMetadata);
                //通过此方法来加载META-INF/spring.factories,将自动配置类加入容器中
                fireAutoConfigurationImportEvents(configurations, exclusions);
                return StringUtils.toStringArray(configurations);
            }
            catch (IOException ex) {
                throw new IllegalStateException(ex);
            }
        }
    }
    
    
            // ....代码省略...
    
  • 相关阅读:
    17-电话号码字母的组合
    16-最接近的三数之和
    牛客网上的java面经,JVM
    15-三数之和
    mybatis 懒加载不生效
    @ControllerAdvice
    异常
    @ExceptionHandler处理异常
    spring aop annotation
    return 与 system.exit(0) 区别
  • 原文地址:https://www.cnblogs.com/haoworld/p/springboot-ru-men-cheng-xu-he-ji-zhi-fen-xi.html
Copyright © 2011-2022 走看看