SpringBoot(1)项目搭建+启动原理 您所在的位置:网站首页 springbootapplication依赖 SpringBoot(1)项目搭建+启动原理

SpringBoot(1)项目搭建+启动原理

2023-04-02 19:34| 来源: 网络整理| 查看: 265

文章目录 一、SpringBoot简介1、spring框架优点缺点分析2、SpringBoot概念简介3、什么是启动器4、Spring Boot优点5、Spring Boot版本介绍6、Spring Boot的核心 二、项目搭建1、方式11)创建一个空的maven工程2)配置maven3) 添加spring boot父工程、spring依赖3)创建启动类4、启动5、查看依赖传递6、开发一个Controller 2、方式22、方式3 三、启动原理分析1、依赖导入原理2、springboot 包扫描原理@SpringBootConfiguration@EnableAutoConfiguration

一、SpringBoot简介 1、spring框架优点缺点分析

Spring的优点分析:

Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单 的Java对象(Plain Old Java Object,POJO)实现了EJB的功能。

Spring的缺点分析

虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多XML配 置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0引入 了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。 所有这些配置都代表了开发时的损耗(配置多)。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所以编 写配置挤占了编写应用程序逻辑的时间。和所有框架一样,Spring实用,但与此同时它要求的回报也不少。 除此之外,项目的依赖管理也是一件耗时耗力的事情(依赖管理繁重)。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要 分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。

2、SpringBoot概念简介

Spring Boot是Spring公司的一个顶级项目,和Spring Framework是一个级别的。 Spring Boot实际上是利用Spring Framework 4 自动配置特性完成。编写项目时不需要编写xml文件。发展到现在,Spring Boot已经具有很很大的生态圈,各种主流技术已经都提供了Spring Boot的启动器。

3、什么是启动器

Spring框架在项目中作用是Spring整合各种其他技术,让其他技术使用更加方便。Spring Boot的启动器实际上就是一个依赖。这个依赖中包含了整个这个技术的相关jar包,还包含了这个技术的自动配置,以前绝大多数XML配置都不需要配置了。当然了,启动器中自动配置无法实现所有内容的自动配置,在使用Spring Boot时还需要进行少量的配置(这个配置不是在xml中了,而是在properties或yml中即可)。如果是Spring自己封装的启动器的artifact id名字满足:spring-boot-starter-xxxx,如果是第三方公司提供的启动满足:xxxx-spring-boot-starter。以后每次使用Spring Boot整合其他技术时首先需要考虑导入启动器。

4、Spring Boot优点

① 使用Spring Boot可以创建独立的Spring应用程序 ② 在Spring Boot中直接嵌入了Tomcat、Jetty、Undertow等Web 容器,在使用SpringBoot做Web开发时不需要部署WAR文件 ③ 通过提供自己的启动器(Starter)依赖,简化项目构建配置 ④ 尽量的自动配置Spring和第三方库 ⑤ 绝对没有代码生成,也不需要XML配置文件

5、Spring Boot版本介绍

SNAPSHOT:快照版,即开发版。 CURRENT:最新版,但是不一定是稳定版。 GA:General Availability,正式发布的版本。 在这里插入图片描述

6、Spring Boot的核心

起步依赖 起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。 简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。

自动配置 Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定 Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的。

二、项目搭建 1、方式1 1)创建一个空的maven工程

在这里插入图片描述

2)配置maven

在这里插入图片描述

3) 添加spring boot父工程、spring依赖 4.0.0 org.example springboot01 1.0-SNAPSHOT spring-boot-starter-parent org.springframework.boot 2.7.10 11 11 org.springframework.boot spring-boot-starter-web 3)创建启动类

新建启动类 Spring Boot的启动类的作用是启动Spring Boot项目,是基于Main方法来运行的。 启动类在启动时会做注解扫描(@Controller、@Service、@Repository......),扫描位置为同包或者子包下的注解,所以启动类的位置应放于包的根下

启动类与启动器区别:

启动类表示项目的启动入口

启动器表示jar包的坐标

必须在包中新建这个类,不能直接放入到java文件夹。 在com.buba下新建自定义名称的类(规范:XXXXApplication),可以是项目上下文路径Application

package com.buba; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author qlx */ @SpringBootApplication public class ApplicationStarter { public static void main(String[] args) { SpringApplication.run(ApplicationStarter.class,args); } } 4、启动 . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.7.10) 2023-03-30 16:36:30.718 INFO 7244 --- [ main] com.buba.SpringBootApplication : Starting SpringBootApplication using Java 11.0.16 on LAPTOP-TBOAMEDD with PID 7244 (D:\gitRepository\springboot01\target\classes started by qlx in D:\gitRepository\springboot01) 2023-03-30 16:36:30.718 INFO 7244 --- [ main] com.buba.SpringBootApplication : No active profile set, falling back to 1 default profile: "default" 2023-03-30 16:36:31.580 INFO 7244 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2023-03-30 16:36:31.596 INFO 7244 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2023-03-30 16:36:31.596 INFO 7244 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.73] 2023-03-30 16:36:31.674 INFO 7244 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2023-03-30 16:36:31.674 INFO 7244 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 878 ms 2023-03-30 16:36:32.018 INFO 7244 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2023-03-30 16:36:32.033 INFO 7244 --- [ main] com.buba.SpringBootApplication : Started SpringBootApplication in 1.876 seconds (JVM running for 3.714) 5、查看依赖传递

在这里插入图片描述 在这里插入图片描述

6、开发一个Controller package com.buba.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author qlx */ @RestController @RequestMapping("/test") public class TestController { @GetMapping("/getTest") public String getTest(){ return "test~~~~~~~"; } }

端口号默认8080 项目上下文路径默认 ‘’ 其实就是没有

"C:\Program Files\Java\jdk-11.0.16\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:12365,suspend=y,server=n -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -javaagent:C:\Users\qlx\AppData\Local\JetBrains\IntelliJIdea2021.2\captureAgent\debugger-agent.jar -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dfile.encoding=UTF-8 -classpath "D:\gitRepository\springboot01\target\classes;D:\Apps\repository\org\springframework\boot\spring-boot-starter-web\2.7.10\spring-boot-starter-web-2.7.10.jar;D:\Apps\repository\org\springframework\boot\spring-boot-starter\2.7.10\spring-boot-starter-2.7.10.jar;D:\Apps\repository\org\springframework\boot\spring-boot\2.7.10\spring-boot-2.7.10.jar;D:\Apps\repository\org\springframework\boot\spring-boot-autoconfigure\2.7.10\spring-boot-autoconfigure-2.7.10.jar;D:\Apps\repository\org\springframework\boot\spring-boot-starter-logging\2.7.10\spring-boot-starter-logging-2.7.10.jar;D:\Apps\repository\ch\qos\logback\logback-classic\1.2.11\logback-classic-1.2.11.jar;D:\Apps\repository\ch\qos\logback\logback-core\1.2.11\logback-core-1.2.11.jar;D:\Apps\repository\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;D:\Apps\repository\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;D:\Apps\repository\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;D:\Apps\repository\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;D:\Apps\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\Apps\repository\org\springframework\spring-core\5.3.26\spring-core-5.3.26.jar;D:\Apps\repository\org\springframework\spring-jcl\5.3.26\spring-jcl-5.3.26.jar;D:\Apps\repository\org\yaml\snakeyaml\1.30\snakeyaml-1.30.jar;D:\Apps\repository\org\springframework\boot\spring-boot-starter-json\2.7.10\spring-boot-starter-json-2.7.10.jar;D:\Apps\repository\com\fasterxml\jackson\core\jackson-databind\2.13.5\jackson-databind-2.13.5.jar;D:\Apps\repository\com\fasterxml\jackson\core\jackson-annotations\2.13.5\jackson-annotations-2.13.5.jar;D:\Apps\repository\com\fasterxml\jackson\core\jackson-core\2.13.5\jackson-core-2.13.5.jar;D:\Apps\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.5\jackson-datatype-jdk8-2.13.5.jar;D:\Apps\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.5\jackson-datatype-jsr310-2.13.5.jar;D:\Apps\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.5\jackson-module-parameter-names-2.13.5.jar;D:\Apps\repository\org\springframework\boot\spring-boot-starter-tomcat\2.7.10\spring-boot-starter-tomcat-2.7.10.jar;D:\Apps\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.73\tomcat-embed-core-9.0.73.jar;D:\Apps\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.73\tomcat-embed-el-9.0.73.jar;D:\Apps\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.73\tomcat-embed-websocket-9.0.73.jar;D:\Apps\repository\org\springframework\spring-web\5.3.26\spring-web-5.3.26.jar;D:\Apps\repository\org\springframework\spring-beans\5.3.26\spring-beans-5.3.26.jar;D:\Apps\repository\org\springframework\spring-webmvc\5.3.26\spring-webmvc-5.3.26.jar;D:\Apps\repository\org\springframework\spring-aop\5.3.26\spring-aop-5.3.26.jar;D:\Apps\repository\org\springframework\spring-context\5.3.26\spring-context-5.3.26.jar;D:\Apps\repository\org\springframework\spring-expression\5.3.26\spring-expression-5.3.26.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2021.2.3\lib\idea_rt.jar" com.buba.ApplicationStarter Connected to the target VM, address: '127.0.0.1:12365', transport: 'socket' . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.7.10) 2023-03-30 16:48:58.159 INFO 10312 --- [ main] com.buba.ApplicationStarter : Starting ApplicationStarter using Java 11.0.16 on LAPTOP-TBOAMEDD with PID 10312 (D:\gitRepository\springboot01\target\classes started by qlx in D:\gitRepository\springboot01) 2023-03-30 16:48:58.164 INFO 10312 --- [ main] com.buba.ApplicationStarter : No active profile set, falling back to 1 default profile: "default" 2023-03-30 16:48:58.950 INFO 10312 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2023-03-30 16:48:58.966 INFO 10312 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2023-03-30 16:48:58.966 INFO 10312 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.73] 2023-03-30 16:48:59.044 INFO 10312 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2023-03-30 16:48:59.044 INFO 10312 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 836 ms 2023-03-30 16:48:59.349 INFO 10312 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2023-03-30 16:48:59.365 INFO 10312 --- [ main] com.buba.ApplicationStarter : Started ApplicationStarter in 1.694 seconds (JVM running for 4.739)

访问测试 在这里插入图片描述

2、方式2

在工作中可能会出现必须继承某个项目,如果Spring Boot用了继承就不能继承别的项目了。所以Spring Boot还提供了依赖的方式。

4.0.0 org.example springboot01 1.0-SNAPSHOT 11 11 org.springframework.boot spring-boot-dependencies 2.7.10 pom import org.springframework.boot spring-boot-starter-web 2、方式3

使用idea自带springBoot项目初始化插件 在这里插入图片描述 在这里插入图片描述

三、启动原理分析 1、依赖导入原理

父项目版本控制

org.springframework.boot spring-boot-dependencies 2.7.10 pom import

ctrl+ 点击spring-boot-dependencies 进入 这里管理着springboot中所有依赖的版本,版本控制中心,导入依赖如果不写版本就用这里的版本 在这里插入图片描述 spring-boot-starter-web,也就是web启动器,导入和很多web的依赖 在这里插入图片描述

2、springboot 包扫描原理

点击进入@SpringBootApplication注解

在这里插入图片描述

@SpringBootConfiguration

@SpringBootConfiguration 上面有一个Configuration表示这是一个配置类

在这里插入图片描述

配置类上面有@Component说明也是容器中的一个组件

在这里插入图片描述

@EnableAutoConfiguration

@EnableAutoConfiguration 启用自动配置功能 springboot中没有做任何配置,springboot自动帮助我们配置,但是要通过该注解才能生效 @AutoConfigurationPackage // 自动扫描配置类包的注解 @Import(AutoConfigurationImportSelector.class)// 给容器导入一些组件的选择器,导入一些默认配置

@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; Class[] exclude() default {}; String[] excludeName() default {}; }

@AutoConfigurationPackage ,自动配置包 @Import(AutoConfigurationPackages.Registrar.class) 导入AutoConfigurationPackages.Registrar类 @Import是spring的 底层注解,给容器导入一个组件

@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Import({Registrar.class}) public @interface AutoConfigurationPackage { String[] basePackages() default {}; Class[] basePackageClasses() default {}; }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有