zoukankan      html  css  js  c++  java
  • springBoot学习

     
    第一部分:SpringBoot应用回顾
     
    1.1 概念
    约定优于配置,又称按约定编程,是一种软件设计规范,大大减少了配置项,只有在偏离这个约定的时候才需要做相关的配置。
     
    1.2 特性
    1)SpringBoot Starter(起步依赖):他将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中。
    起步依赖:就是把具有某种功能坐标的打包到一起,并提供一些默认功能。
    解决问题:依赖管理的坐标信息比较繁杂;容易产生依赖版本冲突。
    2)使编码变得简单,SpringBoot采用JavaConfig的方式对Spring进行配置,并且提供了大量的注解,极大地提高了工作效率。
    如果想在Spring Boot中生成一个bean对象存到Ioc容器中,可以使用@Configuration+@bean的方式(Spring框架怎么生成一个bean对象的呢?@Component)
    0
    3)自动配置:SpringBoot的自动配置特性利用了Spring对条件化配置的支持,合理的推测应用所需要的bean并自动化配置它们。
    SpringBoot在启动的过程中(根据依赖引入的情况),会自动将一些配置类的bean进行创建,并且添加到Ioc容器中。
    4)使部署变得简单,SpringBoot内置了三种servlet容器,Tomcat,Jetty,undertow,我们只需要一个java运行环境就可以跑SpringBoot项目了,SpringBoot项目可以打成一个jar包。
     
    1.3 案例实现
    Spring Initiallizr是一个web项目,它提供了一个基本的项目结构,能够帮我们快速构建一个基础的Spring Boot项目
    案例实现过程中的疑问:
    1. starter是什么?我们如何去使用这些starter?
    2. 为什么包扫描只会扫描核心启动类所在的包及其子包
    3. 在springBoot启动的过程中,是如何完成自动装配的?
    4. 内嵌Tomcat是如何被创建及启动的?
    5. 使用了web场景对应的starter,springmvc是如何自动装配?
     
    1.4 热部署
    1.4.1 热部署设置
    1)导包
     
    org.springframework.boot
    spring-boot-devtools
     
    2)idea工具热部署设置
    见讲义
    3)热部署原理
    引入热部署插件后,插件会监控我们classpath的资源变化,当classpath有变化时,会触发重启。
     
    插件重启快速的原因:这里对类加载采用了两种类加载器,对于第三方jar包采用base-classloader来加载,对于开发人员自己开发的代码使用restartClassLoader来进行加载,这使得比停掉服务要快的多,因为使用插件只是重启开发人员编写的代码的部分。
     
    1.5 全局配置文件
    1.5.1 概述及优先级
    全局配置文件可以对一些默认配置值修改和自定义配置
    默认配置文件名:application.properties,application.yml
    优先级:
    0
     
    1.6 属性注入
    1)属性注入常用注解
    0
    0
    1.7 SpringBoot日志框架
    SpringBoot框架默认使用SLF4J+LogBack,默认日志级别为INFO
     
    第二部分:SpringBoot源码剖析
    2.1 依赖管理
    1)为何导入dependency不需要指定版本号(部分依赖不需要指定版本号)
    pom.xml中的两个核心依赖:
    spring-boot-starter-web,spring-boot-starter-parent
    spring-boot-starter-parent的父依赖spring-boot-dependencies里面定义了springboot相关的版本。
     
    2) spring-boot-starter-parent父依赖启动器的主要作用是进行版本统一管理,那么项目
    运行依赖的JAR包是从何而来的?
    spring-boot-starter-web依赖启动器的主要作用是打包了Web开发场景所需的底
    层所有依赖(基于依赖传递,当前项目也存在对应的依赖jar包)
     
    2.2 SpringBoot自动配置(原理)
    自动配置:根据我们添加的jar包依赖,会自动将一些配置类的bean注册进Ioc容器,我们可以在需要的地方使用@AutoWired或@Resource等注解来使用它。
     
    问题:Spring Boot到底是如何进行自动配置的,都把哪些组件进行了自动配置?
    SpringBoot的应用程序入口是@SpringBootApplication注解标注类中的main方法。
     
    2.2.1 @SpringBootApplication注解
    @SpringBootApplication注解是一个组合注解,除了 4 个元注解外, 还使用了 3 个核心注解:@SpringBootConfiguration(标明该类是配置类)、@EnableAutoConfiguration(启动自动配置)、
    @ComponentScan(注解扫描)
    0
    2.2.2 @SpringBootConfiguration
    @SpringBootConfiguration注解内部有一个核心注解@Configuration,该注解是Spring框架提供的,表示当前类为一个配置类(XML配置文件的注解表现形式),并可以被组件扫描 器扫描。
    由此可见,@SpringBootConfiguration注解的作用与@Configuration注解相同,都是标识一个可以被组件扫描器扫描的配置类,只不过@SpringBootConfiguration是被Spring Boot进行了重新封 装命名而已.
    0
    2.2.3 @EnableAutoConfiguration注解
    0
    Spring 中有很多以 Enable 开头的注解,其作用就是借助 @Import 来收集并注册特定场景相关的 Bean ,并加载到 IOC 容器。 @EnableAutoConfiguration就是借助@Import来收集所有符合自动配置条件的bean定义,并加载到 IoC容器。
    1)@AutoConfigurationPackage
    0
    AutoConfigurationPackages.Registrar这个类就干一个事,注册一个 Bean ,这个 Bean 就是 org.springframework.boot.autoconfigure.AutoConfigurationPackages.BasePackages ,它有 一个参数,这个参数是使用了 @AutoConfigurationPackage 这个注解的类所在的包路径,保存自动配置 类以供之后的使用,比如给 JPA entity 扫描器用来扫描开发人员通过注解 @Entity 定义的 entity 类。
    2)@Import(AutoConfigurationImportSelector.class)
    @Import({AutoConfigurationImportSelector.class}) :将 AutoConfigurationImportSelector 这个类导入到 Spring 容器中, AutoConfigurationImportSelector 可以帮助 Springboot 应用将所有符合条件的 @Configuration 配置都加载到当前 SpringBoot 创建并使用的 IOC 容器( ApplicationContext )中。
     
    跟自动配置逻辑相关的入口方法在 DeferredImportSelectorGrouping 类的 getImports 方法处---》或者AutoConfigurationImportSelector里的process()方法
    0
    0
    上述[1]AutoConfigurationEntry 方法主要做的事情就是获取符合条件的自动配置类,避免加载不必要的自 动配置类从而造成内存浪费
    AutoConfigurationEntry主要做的事情如下:
    [1]加载每个jar包下的MATA-INF/spring.factories配置文件里key为EnableAutoConfiguration的所有可以自动配置的工厂类的全路径
    0
     
    0
    至此,只是把满足条件的自动配置类筛选出来,把这些自动配置类注册到Ioc容器里还要交给Spring去处理

    1. 从spring.factories配置文件中加载自动配置类;
    2. 加载的自动配置类中排除掉 @EnableAutoConfiguration 注解的 exclude 属性指定的自动配置
    类;
    3. 然后再用 AutoConfigurationImportFilter 接口去过滤自动配置类是否符合其标注注解(若有
    标注的话) @ConditionalOnClass , @ConditionalOnBean 和
    @ConditionalOnWebApplication 的条件,若都符合的话则返回匹配结果;
    4. 然后触发 AutoConfigurationImportEvent 事件,告诉 ConditionEvaluationReport 条件评
    估报告器对象来分别记录符合条件和 exclude 的自动配置类。
    5. 最后spring再将最后筛选后的自动配置类导入IOC容器中
     
    0
    2.2.4 @ComponentScan注解
    主要是从定义的扫描路径中,找出标识了需要装配的类自动装配到spring 的bean容器中。
    当前@ComponentScan注解没有标注basePackages及value,所以扫描路径默认为@ComponentScan注解的类所在的包为基本的扫描路径
    (也就是标注了@SpringBootApplication注解的项目启动类所在的路径)
    这也是为何SpringBoot启动时只会扫描核心启动类所在的包及其子包的原因!
     
    2.4 源码剖析-Run方法执行流程
    点进去run方法--》调用其重载run方法---》该方法做了两件事:1)初始化SpringApplication;2)执行run方法
    2.4.1 初始化SpringApplication
    0
    2.4.2 run()方法执行过程
    0
    1)EventPublishingRunListener监听器是Spring容器的启动监听器。 listeners.starting(); 开启了监听事件。
    2)应用上下文环境包括什么呢?包括计算机的环境,Java环境,Spring的运行环境,Spring项目的配置(在SpringBoot中就是那个熟悉的application.properties/yml)等等。
     
    0
     
    0
    3)应用上下文可以理解成IoC容器的高级表现形式,应用上下文确实是在IoC容器的基础上丰富了一 些高级功能。应用上下文对IoC容器是持有的关系。他的一个属性beanFactory就是IoC容器 (DefaultListableBeanFactory)。所以他们之间是持有,和扩展的关系。
    在这一步,Ioc也创建了。
    4)将一些bean注册进Ioc容器,包括主配置类,发布容器已加载事件
    5)Ioc的初始化过程(分为以下三步):
     
    0
     
    0
     
    0
    2.5 自定义starter
     
    2.6 内嵌Tomcat
    SpringBoot是如何启动内置tomcat的?
    Spring项目启动--》调用run方法---》SpringBoot相关的处理工作完成后,会调用一个refreshConext()方法刷新容器---》内部调用Spring的refresh()方法(该方法是实现IOC和AOP的关键,AbstractApplicationContext类的方法)
    ---》进入refresh()方法后,该方法又调用了一个onRefresh()方法,该方法会调用ServletWebServerApplicationContext中的createWebServer()方法,该方法用于启动web服务器
     
    0
    SpringBoot为什么可以响应请求,他是如何配置的SpringMvc
    1)SpringBoot引入了SpringMVC的相关依赖,可以使用RequestMapping注解配置请求的url
     
    SpringMVC的前端控制器DispatcherServlet必须注册到ServletContext中才可以响应请求(如何被注册的?)
    DispatcherServlet如何创建的及如何注册的?
    2)
    springboot mvc的自动配置类是DispatcherServletAutoConfigration,主要做了两件事: 1)配置DispatcherServlet 2)配置DispatcherServlet的注册Bean(DispatcherServletRegistrationBean)
     
    SpringBoot自动装配SpringMvc其实就是往ServletContext中加入了一个 Dispatcherservlet
     
    servletContext.addServlet(name, this.servlet);
     
    第三部分:SpringBoot数据访问
     
    第四部分:SpringBoot缓存深入
     
    第五部分:SpringBoot部署于监控
  • 相关阅读:
    [EF]vs15+ef6+mysql code first方式
    Asp.net MVC]Asp.net MVC5系列——布局视图
    Asp.net MVC]Asp.net MVC5系列——Routing特性
    Asp.net MVC]Asp.net MVC5系列——Razor语法
    Asp.net MVC]Asp.net MVC5系列——实现编辑、删除与明细信息视图
    Asp.net MVC]Asp.net MVC5系列——在模型中添加验证规则
    Asp.net MVC]Asp.net MVC5系列——在模型中添加
    Django跨域(前端跨域)
    Stark组件
    Admin组件
  • 原文地址:https://www.cnblogs.com/bingyimeiling/p/14747356.html
Copyright © 2011-2022 走看看