JAVAEE 应用体系中繁重的配置、低下的开发效率、高难度的三方集成,复杂的部署流 程等等一直被开发人员所诟病。
Spring 这样的轻量级的资源整合框架,在实现其相对比较多的资源整合时,依旧需要 大量的手动依赖管理,复杂的 XML 配置(还经常没有提示)。
现在的软件生态应用也已经形成一定的规模,系统架构正在从单体架构,分布式架构, 跨越到微服务架构。随着整个架构体系的变化,企业对技术的要求也在变化,现在的企业更 注重技术的开箱即用,更注重技术在生态圈中的深度融合,更注重轻量级的运维。
由此由此 spring boot 诞生。 Spring Boot 是 Java 软件开发框架(很多人现在把它理解为一个脚手架),其设计目 的是用来简化 Spring 项目的初始搭建以及开发过程。该框架使用了特定的注解方式来进行 配置,从而使开发人员不再需要大量的 xml 配置。不再需要大量的手动依赖管理。
Spring Boot 基于快速构建理念,通过约定大于配置,开箱即用的方式,希望能够在蓬勃发展的快 速应用开发领域成为其领导者。
SpringBoot 其核心特性包含如下几个方面:
▪ 起步依赖(Starter Dependency),
--创建SpringBoot项目后,一些基本的配置以及依赖已经自动装配完毕,无需再手动配置等操作。
▪ 自动配置(Auto Configuration),
--例如数据库的连接、缓存的配置以及异步的配置等的基本配置
▪ 健康检查(Actator)-监控,
▪ 嵌入式服务(Tomcat,Jetty)等。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.3.8.RELEASEversion>
<relativePath/>
parent>
<groupId>com.cygroupId>
<artifactId>01-springboot-noticeartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>01-springboot-noticename>
<description>Demo project for Spring Bootdescription>
<properties>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
package com.cy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 启动类:由@SpringBootApplication注解描述
* 启动类在运行时都会做什么呢?
* 1)通过ClassLoader(类加载器-负责将磁盘中的类读到内存中)将指定包中的类加载到内存.
* 2)通过线程(thread)调用io(InputStream)从磁盘(Disk)读取文件(File)信息.
* 3)读取类上的描述(@Component,@Service,@Controller,.....),并基于描述构建-
* -配置对象(BeanDefinition),存储类的配置信息(类全名,作用域,....).
* 4)基于类的配置信息通过Bean工厂反射构建类的实例(对象),并进行存储(对象池-用时从池中取)
* 5)当我们需要一个类的实例时可以从对象池(Bean池)获取即可.
* JVM 参数分析
* 1)检测类的加载:-XX:+TraceClassLoading(设置位置:idea->Edit configurations->VM options)
*/
@SpringBootApplication
public class NoticeApplication {
public static void main(String[] args) {
SpringApplication.run(NoticeApplication.class, args);
}
/**
* 记住(规则):我们要交给spring容器管理的对象,一定要放在启动类所在包或子包中,
* 然后使用特性注解进行描述(@Component,@Service,....)
*
* FAQ?
* Spring是一个资源管理框架,请问资源是谁?对象
*/
}
控制台结果摘要:
启动时首先加载的是JDK;
然后会去加载启动类(此处为NoticeApplication类)的父类,此处NoticeApplication类并未直接声明父类,所以他的父类是Object类;
接着再去加载其他的类。
启动类启动时会扫描启动类所在包及其子包,因此我们写的业务代码要写在启动类所在包或者其子包里面(并且具体的业务还要使用特定的注解进行标注),否则springboot将不会对其进行管理;
Spring是一个资源管理框架,请问资源是谁? 对象
对象的创建是需要基于类来创建的,那么类在哪里? 磁盘
类在磁盘中,那么类如何读到磁盘里? 通过线程调用IO
类读到内存中就会创建该类的字节码对象,字节码对象会检查本类有没有被特定注解修饰,如果检测到了有特定注解,就会被交给springboot进行管理。
会将有注解修饰的类的配置信息存储到BeanDefinition(即配置对象)中,如果该类没有设置延迟加载,那么就会基于配置对象的配置信息通过BeanFactory构建为具体的对象,并将这些对象放在BeanPool中,使用时直接拿就好。
如果存在延时加载,则在该类对象需要被使用时,再通过BeanFactory构建对象,并使用。
springboot项目在启动时会自动去配置一些jar包,无需我们人为手动去配置,我们直接去用就可以了,从而展现了“开箱即用”的效果;
具体的实现流程:
当我们执行启动类时,程序运行run()方法,里面是这个类的字节码对象,当检测到了字节码兑现后,会去检查这个类上有没有注解,该类被@SpringBootApplication注解修饰,因此需要交给springboot进行管理;
进而去查看@SpringBootApplication注解,发现该注解也被诸多注解进行修饰,其中有个@EnableAutoConfiguration的注解,该注解就是负责自动化配置的;
查看@EnableAutoConfiguration注解源码,发现该注解上有关于自动化配置包及选择器的注解,会自动化的配置包及一些自动化jar包文件的配置;
至此就会达到一些功能及jar包文件的自动化配置,达到“开箱即用”的效果。
以上,仅供学习参考