启动类:

  1. @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

 从@SpringBootApplication开始入手,点击进入是以下代码:

@Target(ElementType.TYPE)            // 注解的适用范围,其中TYPE用于描述类、接口(包括包注解类型)或enum声明
@Retention(RetentionPolicy.RUNTIME)  // 注解的生命周期,保留到class文件中(三个生命周期)
@Documented                          // 表明这个注解应该被javadoc记录
@Inherited                           // 子类可以继承该注解
@SpringBootConfiguration             // 继承了Configuration,表示当前是注解类
@EnableAutoConfiguration             // 开启springboot的注解功能,springboot的四大神器之一,其借助@import的帮助
@ComponentScan(excludeFilters = {    // 扫描路径设置@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
...
}

其中,最重要的三个注解是@SpringBootConfiguration 、@EnableAutoConfiguration、@ComponentScan

  1. @SpringBootConfiguration本质上还是@Configuration注解 

    @Configuration  JavaConfig形式定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。简化了通过XML方式配置bean的方式,两者的区别如下:

  • 表达形式层面                    
    基于XML配置的方式是这样:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"default-lazy-init="true"><!--bean定义-->
    </beans>

    基于JavaConfig的配置方式是这样:

    @Configuration
    public class MockConfiguration{//bean定义
    }

  • 注册bean定义层面
    基于XML配置形式

    <bean id="mockService" class="..MockServiceImpl">...
    </bean>

    基于JavaConfig的配置方式是这样:

    @Configuration
    public class MockConfiguration{@Beanpublic MockService mockService(){return new MockServiceImpl();}
    }

    任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id。

  • 表达依赖注入层面
    基于XML中配置是这样:

    <bean id="mockService" class="..MockServiceImpl"><propery name ="dependencyService" ref="dependencyService" />
    </bean><bean id="dependencyService" class="DependencyServiceImpl"></bean>

    基于java config是这样:

    @Configuration
    public class MockConfiguration{@Beanpublic MockService mockService(){return new MockServiceImpl(dependencyService());}@Beanpublic DependencyService dependencyService(){return new DependencyServiceImpl();}
    }

  1. @ComponentScan作用是自动扫描符合条件的组件,并最后加入到容器当中,默认情况下在@ComponentScan所在类的package扫描的,所以最好将启动类放在root package,默认不指定路径

    1. @EnableAutoConfiguration 包含以下几个注解

      @SuppressWarnings("deprecation")
      @Target(ElementType.TYPE)
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      @Inherited
      @AutoConfigurationPackage
      @Import(EnableAutoConfigurationImportSelector.class)
      public @interface EnableAutoConfiguration {...
      }

      其中,@AutoConfigurationPackage、 @Import(EnableAutoConfigurationImportSelector.class)是比较重要的两个注解

      @AutoConfigurationPackage 

      static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {@Overridepublic void registerBeanDefinitions(AnnotationMetadata metadata,BeanDefinitionRegistry registry) {register(registry, new PackageImport(metadata).getPackageName());}

      注册了一个Bean的定义,new PackageImport(metadata).getPackageName(),它其实返回了当前主程序类的 同级以及子级 的包组件。(这也是为什么把启动类放在根目录的原因)

      @Import(EnableAutoConfigurationImportSelector.class) 
        EnableAutoConfigurationImportSelector.class继承AutoConfigurationImportSelector,AutoConfigurationImportSelector中selectImports方法,里面调用getCandidateConfigurations,getCandidateConfigurations里面通过
      SpringFactoriesLoader读取META_INF/spring.factories文件的配置,并返回字符串数组

转载于:https://www.cnblogs.com/jwnote/p/10076958.html

入门SpringBoot-关于启动原理(五)(转)相关推荐

  1. springboot应用启动原理(一) 将启动脚本嵌入jar

    Spring Boot Takes an opinionated view of building production-ready Spring applications. Spring Boot ...

  2. 面试官:能说下 SpringBoot 启动原理吗?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 Spri ...

  3. Spring Boot:(二)启动原理解析

    Spring Boot:(二)启动原理解析 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏. ...

  4. Spring Boot(18)---启动原理解析

    Spring Boot(18)---启动原理解析 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会 ...

  5. springboot启动原理及其流程

    springboot启动原理精简版 spring,springMVC和spring有什么区别? 一 springboot启动流程及其相关流程概览. 二 springboot的启动类入口 三 sprin ...

  6. 雷神SpringBoot入门和自动装配原理

    SpringBoot-helloWord! 首先让当前的工程作为Springboot的子工程 <parent><groupId>org.springframework.boot ...

  7. SpringBoot系列3-----Docker SpringBoot与数据访问 启动原理 自定义starters

    五.Docker 1.简介 Docker是一个开源的应用容器引擎:是一个轻量级容器技术 Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜 ...

  8. Springboot启动原理解析

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 我们开发任何一个Spring Boot项目,都会用到如下的启动类 @SpringBootAppl ...

  9. 手把手带你剖析 Springboot 启动原理!

    作者:平凡希 cnblogs.com/xiaoxi/p/7999885.html 我们开发任何一个Spring Boot项目,都会用到如下的启动类 @SpringBootApplication pub ...

最新文章

  1. 零基础能学好UI设计吗
  2. 彩色直方图均衡化实现
  3. Python 路径问题:cv2.error: OpenCV(4.1.0)...size.width>0 size.height>0 in function ‘cv::imshow‘. 解决方法
  4. 随机森林c语言编程,一种基于随机森林的C语言源代码静态评分方法与流程
  5. C#对window 硬件类操作,ManagementObjectSearcher
  6. jax-rs jax-ws_JAX-RS Bean验证错误消息国际化
  7. Spring集成文件轮询和测试
  8. C++中dynamic_cast的简介
  9. python 成语库_python正则表达式抓取成语网站
  10. 电脑长时间不用的文件找不到怎么恢复
  11. 2018年最新_5小时学会微信小程序视频教程网盘地址
  12. SpringMvc从入门到入魔
  13. Google 2018 IO 大会要点
  14. Java Socket通信实现多人多端网络画板聊天室
  15. 使用java+OpenCV进行图片对比并标记差异部分(支持中文图片路径)
  16. android微信post提交表单,微信自带浏览器不支持form表单post提交方案解决
  17. html5 3d引擎 星空,使用3D引擎threeJS实现星空粒子移动效果
  18. 移动硬盘加密方法加密后对硬盘读写的影响
  19. AI 产品如何做产品定位分析?
  20. java怎么在控制台输入数字,并保存到数组里?

热门文章

  1. 英语作文计算机国际会议开幕词,英语作文会议开幕词
  2. 物联网传感技术——无线传感网概述
  3. 无线传感网络的定位和时间同步技术简述
  4. 电源硬件设计----降压-升压(Buck-Boost)变换器基础
  5. CCF 模拟题,公共钥匙盒
  6. [树莓派]基于Python开发树莓派软件流程
  7. 网上找到的有效的关闭UAC的方法。
  8. 买笔记本的13个验机步骤
  9. 如何将本地文件(windows)复制(传输)到虚拟机中
  10. 最新《python自动化开发网络班项目实战》