第2章SpringBoot入门开发
技术点要求:
- 熟练Spring框架的使用
- 熟练Maven依赖项目与项目构建
- 熟练使用Eclipse或IDEA(我的学习都是以IDEA讲解的所有,基本步骤跟着我走是没错的!)
2.1 环境要求
jdk1.8
(SpringBoot推荐jdk1.8
以上):java version “1.8_0151”
Maven 3.x
(Maven3.2以上版本):Apache Maven 3.39
Intellij IDEA
IntelliJ IDEA 2021.2.1 x64
SpringBoot
使用当前最新稳定版本:第五章web开发前2.0.6RELEASE
- 如下截图中
spring.io
官网有说明,访问页面的官网
- 如下为翻译官网后的截图说明:
2.2 修改Maven配置文件
如果没有maven
压缩包可在Maven该连接下自行下载mac与Wind
都是下载这个就可以
下载后需要编辑Maven的配置文件,在解压后的修改该目录下的apache-maven-3.8.3/conf/settings.xml
,settings.xml文件该文件默认Maven库是apache的库,所以需要修改文件中的某项依赖库。
-
简单的介绍一下
settings.xml
文件中的元素有如下结构组成,这些都是settings文件自带的组成部分<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository></localRepository> <interactiveMode></interactiveMode> <offline></offline> <pluginGroups></pluginGroups> <proxies></proxies> <servers></servers> <mirrors></mirrors> <profiles> </profiles> <activeProfiles> </activeProfiles> <usePluginRegistry></usePluginRegistry> </settings>
-
如下为相信说明每个元素结构的作用
-
localRepository
-
作用:该值表示构建系统本地仓库的路径。
其默认值:~/.m2/repository。<localRepository>${user.home}/.m2/repository</localRepository>
-
-
interactiveMode
-
作用:表示maven是否需要和用户交互以获得输入。
如果maven需要和用户交互以获得输入,则设置成true,反之则应为false。默认为true。<interactiveMode>true</interactiveMode>
-
-
offline
-
作用:这个属性表示在Maven进行项目编译和部署等操作时是否允许Maven进行联网来下载所需要的信息。如果构建系统需要在离线模式下运行,则为true,默认为false。当由于网络设置原因或者安全因素,构建服务器不能连接远程仓库的时候,该配置就十分有用。
<offline>false</offline>
-
-
pluginGroups
-
作用:当插件的组织id(groupId)没有显式提供时,供搜寻插件组织Id(groupId)的列表。该元素包含一个pluginGroup元素列表,每个子元素包含了一个组织Id(groupId)。当我们使用某个插件,并且没有在命令行为其提供组织Id(groupId)的时候,Maven就会使用该列表。默认情况下该列表包 含了org.apache.maven.plugins和org.codehaus.mojo。
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> ... <pluginGroups> <!--plugin的组织Id(groupId) --> <pluginGroup>org.codehaus.mojo</pluginGroup> </pluginGroups> ... </settings>
-
-
proxies
-
作用:用来配置不同的代理。
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> ... <proxies> <!--代理元素包含配置代理时需要的信息 --> <proxy> <!--代理的唯一定义符,用来区分不同的代理元素。 --> <id>myproxy</id> <!-- 该代理是否是激活的那个。 true则激活代理。当我们声明了一组代理,而某个时候只需要激活一个代理的时候,该元素就可以派上用处。 --> <active>true</active> <!--代理的协议。 协议://主机名:端口,分隔成离散的元素以方便配置。 --> <protocol>http</protocol> <!--代理的主机名。协议://主机名:端口,分隔成离散的元素以方便配置。 --> <host>proxy.somewhere.com</host> <!--代理的端口。协议://主机名:端口,分隔成离散的元素以方便配置。 --> <port>8080</port> <!--代理的用户名,用户名和密码表示代理服务器认证的登录名和密码。 --> <username>proxyuser</username> <!--代理的密码,用户名和密码表示代理服务器认证的登录名和密码。 --> <password>somepassword</password> <!--不该被代理的主机名列表。该列表的分隔符由代理服务器指定;例子中使用了竖线分隔符,使用逗号分隔也很常见。 --> <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts> </proxy> </proxies> ... </settings>
-
-
servers
-
作用:仓库的下载和部署是在pom.xml文件中的repositories 和 distributionManagement元素中定义的。然而,一般类似用户名、密码(有些仓库访问是需要安全认证的)等信息不应该在pom.xml文件中配置,这些信息可以配置在 settings.xml 中。
<!-- 配置服务端的一些设置。一些设置如安全证书不应该和pom.xml一起分发。 这种类型的信息应该存在于构建服务器上的settings.xml文件中。 --> <servers> <!--服务器元素包含配置服务器时需要的信息 --> <server> <!--这是server的id(注意不是用户登陆的id),该id与distributionManagement中repository元素的id相匹配。 --> <id>server001</id> <!--鉴权用户名。鉴权用户名和鉴权密码表示服务器认证所需要的登录名和密码。 --> <username>my_login</username> <!-- 鉴权密码 。鉴权用户名和鉴权密码表示服务器认证所需要的登录名和密码。 密码加密功能已被添加到2.1.0 +。详情请访问密码加密页面 --> <password>my_password</password> <!-- 鉴权时使用的私钥位置。和前两个元素类似,私钥位置和私钥密码指定了一个私钥的路径 (默认是${user.home}/.ssh/id_dsa)以及如果需要的话,一个密语。 将来passphrase和password元素可能会被提取到外部,但目前它们必须在settings.xml文件以纯文本的形式声明。 --> <privateKey>${usr.home}/.ssh/id_dsa</privateKey> <!--鉴权时使用的私钥密码。 --> <passphrase>some_passphrase</passphrase> <!-- 文件被创建时的权限。如果在部署的时候会创建一个仓库文件或者目录,这时候就可以使用权限(permission)。 这两个元素合法的值是一个三位数字,其对应了unix文件系统的权限,如664,或者775。 --> <filePermissions>664</filePermissions> <!--目录被创建时的权限。 --> <directoryPermissions>775</directoryPermissions> </server> </servers>
-
-
mirrors
- 作用:用于定义一系列的远程仓库的镜像。我们可以在pom中定义一个下载工件的时候所使用的远程仓库。但是有时候这 个远程仓库会比较忙,所以这个时候人们就想着给它创建镜像以缓解远程仓库的压力,也就是说会把对远程仓库的请求转换到对其镜像地址的请求。每个远程仓库都会有一个id,这样我们就可以创建自己的mirror来关联到该仓库,那么以后需要从远程仓库下载工件的时候Maven就可以从我们定义好的mirror站点来下载,这可以很好的缓解我们远程仓库的压力。在我们定义的mirror中每个远程仓库都只能有一个mirror与它关联,也就是说你不能同时配置多个mirror的mirrorOf指向同一 repositoryId。
<mirrors> <!-- 给定仓库的下载镜像。 --> <mirror> <!-- 该镜像的唯一标识符。id用来区分不同的mirror元素。 --> <id>mirrorId</id> <!-- 镜像名称 --> <name>PlanetMirror Australia</name> <!-- 该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 --> <url>http://downloads.planetmirror.com/pub/maven2</url> <!-- 被镜像的服务器的id。例如,如果我们要设置了一个Maven中央仓库(http://repo.maven.apache.org/maven2/) 的镜像,就需要将该元素设置成central。这必须和中央仓库的id central完全一致。 --> <mirrorOf>repositoryId</mirrorOf> </mirror> </mirrors>
- 作用:用于定义一系列的远程仓库的镜像。我们可以在pom中定义一个下载工件的时候所使用的远程仓库。但是有时候这 个远程仓库会比较忙,所以这个时候人们就想着给它创建镜像以缓解远程仓库的压力,也就是说会把对远程仓库的请求转换到对其镜像地址的请求。每个远程仓库都会有一个id,这样我们就可以创建自己的mirror来关联到该仓库,那么以后需要从远程仓库下载工件的时候Maven就可以从我们定义好的mirror站点来下载,这可以很好的缓解我们远程仓库的压力。在我们定义的mirror中每个远程仓库都只能有一个mirror与它关联,也就是说你不能同时配置多个mirror的mirrorOf指向同一 repositoryId。
-
profiles
- 作用:根据环境参数来调整构建配置的列表。settings.xml中的profile元素是pom.xml中profile元素的裁剪版本。它包含 了 id、activation、repositories、pluginRepositories和 properties元素。这里的profile元素只包含这五个子元素是因为这里只 关心构建系统这个整体(这正是settings.xml文件的角色定位),而非单独的项目对象模型设置。如果一个settings.xml中的 profile被激活,它的值会覆盖任何其它定义在pom.xml中带有相同id的profile。
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> ... <profiles> <profile> <!-- profile的唯一标识 --> <id>test</id> <!-- 自动触发profile的条件逻辑 --> <activation /> <!-- 扩展属性列表 --> <properties /> <!-- 远程仓库列表 --> <repositories /> <!-- 插件仓库列表 --> <pluginRepositories /> </profile> </profiles> ... </settings>
- 作用:根据环境参数来调整构建配置的列表。settings.xml中的profile元素是pom.xml中profile元素的裁剪版本。它包含 了 id、activation、repositories、pluginRepositories和 properties元素。这里的profile元素只包含这五个子元素是因为这里只 关心构建系统这个整体(这正是settings.xml文件的角色定位),而非单独的项目对象模型设置。如果一个settings.xml中的 profile被激活,它的值会覆盖任何其它定义在pom.xml中带有相同id的profile。
-
activeProfiles
- 作用:手动激活profiles的列表,按照profile被应用的顺序定义activeProfile。该元素包含了一组activeProfile元素,每个 activeProfile都含有一个profile id。任何在activeProfile中定义的profile id,不论环境设置如何,其对应的 profile都会被激活。如果没有匹配的profile,则什么都不会发生。例如,env-test是一个activeProfile,则在pom.xml(或者profile.xml)中对应id的profile会被激活。如果运行过程中找不到这样一个profile,Maven则会像往常一样运行。
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> ... <activeProfiles> <!-- 要激活的profile id --> <activeProfile>env-test</activeProfile> </activeProfiles> ... </settings>
- 作用:手动激活profiles的列表,按照profile被应用的顺序定义activeProfile。该元素包含了一组activeProfile元素,每个 activeProfile都含有一个profile id。任何在activeProfile中定义的profile id,不论环境设置如何,其对应的 profile都会被激活。如果没有匹配的profile,则什么都不会发生。例如,env-test是一个activeProfile,则在pom.xml(或者profile.xml)中对应id的profile会被激活。如果运行过程中找不到这样一个profile,Maven则会像往常一样运行。
-
usePluginRegistry
- 作用:maven是否需要使用plugin-registry.xml文件来管理插件版本。
如果需要让maven使用文件~/.m2/plugin-registry.xml来管理插件版本,则设为true。默认为false。<usePluginRegistry>false</usePluginRegistry>
- 作用:maven是否需要使用plugin-registry.xml文件来管理插件版本。
-
-
以下为修改依赖项库的位置将依赖项复制粘贴到该位置
- 为什么修改依赖项呢,因为默认是阿帕奇的依赖官网可能有的时候网络不好导致依赖导入错误为了避免不必要的麻烦所以将此依赖项改为阿里云的依赖国内的网速要快!
<mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
<profiles> <profile> <id>spring plugins</id> <activation> <jdk>spring plugins</jdk> </activation> <pluginRepositories> <pluginRepository> <id>spring plugins</id> <name>Spring plugins</name> <url>https://maven.aliyun.com/repository/spring-plugin</url> <layout>default</layout> <snapshotPolicy>always</snapshotPolicy> </pluginRepository> </pluginRepositories> </profile> </profiles>
- 为什么修改依赖项呢,因为默认是阿帕奇的依赖官网可能有的时候网络不好导致依赖导入错误为了避免不必要的麻烦所以将此依赖项改为阿里云的依赖国内的网速要快!
2.3 使用IDEA配置Maven的环境
-
打开IDEA在该界面下点击Customize
-
点击后在该界面下选择All settings…
-
而后在设置页面下选择Build,Execution,Deployment / Build Tools / Maven则会出现Maven的设置配置页面
-
在该界面中选择Maven home path: 最右边的 … 来选择当前你的Maven解压文件夹位置
-
而后在设置Maven页面中会出现如果字样代表配置了本地Maven成功,
而后要配置,Maven的配置文件
,选中Override后则选择左边的文件夹图标,进入到apache-maven-3.8.3目录中,进入到conf文件夹目录,选中settings.xml文件点击OK
2.4 快速构建SpringBoot项目
-
需求:浏览器发送/hello请求,服务器接受请求并处理,相应Hello World字符串
-
分析:构建Spring Boot项目,事实上建立的就是一个Maven项目
2.4.1 创建Maven项目
-
在IDEA上建一个空的jar类型的maven工程
- 首先点击New Project新建一个空的maven工程
- 而后在该界面下首先选择
Project SDK
中java版本
而后,点击左侧的maven
而后选择Next
下一步
- 进入下一步以后,首先在
Name:
中填写项目名称,而后在Location:
中选择项目保存的路径,在将Groupld:
中填写公司的域名目录的结构,而后ArtifactId:
名与Name:
名一致,Version:
中是填写版本号。
- 首先点击New Project新建一个空的maven工程
2.4.2 修改pom.xml
- 在
pom.xml
中添加SpringBoot相关的父级依赖,spring-boot-starter-parent
是一个特殊的starter
依赖项,它提供了有用的maven默认值,以及还提供了一个dependency-management
部分,以便我们可以省略version
与blessed
依赖项的标签,当该依赖项添加后无任何依赖项文件只有默认的依赖项标签值,看后面截图就会懂了(这里可以观看官方文档)
- 在刚刚父级依赖项下,添加
<dependencies></dependencies>
依赖标签可以管理项目中需要引入的其他依赖项,而后在添加spring-boot-starter-web
依赖项该依赖项必须要用<dependency></dependency>
标签包裹起来才能使用,该标签不需要添加版本号因为标签中的<parent>
父级标签已经有了默认版本号,下载该标签依赖项后会出现许多额外的依赖文件,其中包括Tomcat Web服务器与SpringBoot本身文件。(这里可以观看官方文档)。
- 附源码:
<?xml version="1.0" encoding="UTF-8"?> <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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.dgtt</groupId> <artifactId>demo</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <parent> <!-- 我们测试应用程序时,应使用 spring-boot-starter-parent 的parent父类依赖项,因为该依赖提供了 有用的 Maven 默认值 它还提供了一个 dependency-management部分, 以便您可以省略<version> <blessed>依赖项的标签 当你导入这个spring-boot-starter-parent依赖项时, 你会发现该依赖本身不提供任何依赖文件 --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.5</version> </parent> <!-- 当你导入spring-boot-starter-web 依赖项时,你会发现该依赖项本身提供的许多 依赖文件,比如slf4j还有log4j,还有一些 自动装配依赖注解以及(Tomcat Web 服务器和 Spring Boot 本身) --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
- 附源码:
2.4.3 创建控制器Controller
-
在
java
目录中添加自己喜欢的目录结构如果不知如何添加目录结构则自行百度或者,(点击这里)一般java
目录下的目录结构都是以网址的命名反写,根据自己喜欢网址反写到java
目录结构中。
-
而后创建
controller
控制器目录在该目录下创建HelloController
控制器类,
-
在HelloController控制器类中添加如下注解
@Controller
@ResponseBody
@RequestMapping("/hello")
在添加hello()
函数-
@Controller
注解应用于类上,而不是函数上要牢记 -
@ResponseBody
注解应用于函数,该注解可以返回字符串数据,如果不加则返回对应的静态页面的地址,与@RequestMapping()
可以暂时理解为是一组标签 -
@RequestMapping("请求名")
该注解应用于函数,该注解括号中的参数是请求的路径名 -
注意:hello()函数名应与
@RequestMapper("请求名")
中的请求名是一致如下图,一致只是要一种习惯便与后面区分出来请求的函数是哪个!
- 附源码:
package com.dgtt.controller; import com.dgtt.HelloMainApplication; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; /** * @author mac * @RestController 注解告诉Spring得到的字符串直接返回给调用者也就是用户所看到的页面信息, * 同时也标注了这是一个控制器层,要注意的是@RestController是标注在类之上的。 * * @ResponseBody 标注在方法上,告诉Spring得到的字符串直接返回给调用者 * * @RequestMapping 告诉 Spring 任何带有/hello请求路径的HTTP 请求都应该映射到该hello函数 */ @Controller public class HelloController { @ResponseBody @RequestMapping("/hello") public String hello() { return "hello World"; } }
- 附源码:
-
2.4.4 创建一个引导类
- 在
controller
目录的上级目录下创建一个HelloMainApplication
项目的启动入口类,而后在类之上添加@SpringBootApplication
注解,该注解作用是标示一个引导类,主方法,整个程序运行需要从当前注解下运行,而后在该类中添加main(String[] args)
而后在该main函数中添加一下Spring的静态函数方法SpringApplication.run(HelloMainApplication.class,args);
来启动项目
-
附源码:
package com.dgtt; import com.sun.glass.ui.Application; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; /** * @SpringBootApplication 用于标示一个引导类,主方法,整个程序运行需要从当前注解下运行! * Java 约定的标准方法。我们的主要方法SpringApplication通过调用委托给 * Spring Boot 的类run * * @EnableAutoConfiguration 用于标示一个引导类,主方法,整个程序运行需要从当前注解下运行! * @author mac */ @SpringBootApplication //遵循规范使用SpringBootApplication注解 public class HelloMainApplication { public static void main(String[] args){ SpringApplication.run(HelloMainApplication.class,args); } }
-
2.4.5 运行效果
-
添加完截图中需要的注解和函数后,则需要点击左边那个类似于播放按钮的那个三角形,而后运行,看截图效果。
-
而在输出的日志信息中可以找找,我们可以找到我们要访问的网址的端口号
-
而后我们可以
使用本机ip就是127.0.0.1或者localhost
外加端口号,就是刚刚项目运行时我们看到的日志信息中出现的两条日志当中告诉我们的端口号是8080
,结合起来就是127.0.0.1:8080/
以及请求的路径,就是HelloController
中的@RequestMapping("/hello")
该注解中的hello就是我们的请求路径,在结合起来就是127.0.0.1:8080/hello
,看效果。
-
附加学习项(点击这里看官方文档说明)自己查看官网自己测试一下运行效果是一样的!
-
@EnableAutoConfiguration
用于标示一个引导类,主方法,整个程序运行需要从当前注解下运行!Java 约定的标准方法。我们的主要方法SpringApplication通过调用委托给Spring Boot 的类run
-
@RestController
注解告诉Spring得到的字符串直接返回给调用者也就是用户所看到的页面信息,同时也标注了这是一个控制器层,要注意的是@RestController是标注在类之上的。
-
官方解释:
-
@EnableAutoConfiguration
。这个注解告诉 Spring Boot 根据你添加的 jar 依赖“猜测”你想如何配置 Spring。由于spring-boot-starter-web
添加了 Tomcat 和 Spring MVC,自动配置假定您正在开发 Web 应用程序并相应地设置 Spring。启动器和自动配置 自动配置旨在与“Starters”配合使用,但这两个概念并没有直接联系。您可以自由选择 starters 之外的 jar 依赖项。Spring Boot 仍然尽最大努力自动配置您的应用程序。
-
@RestController
注解告诉Spring使得到的字符串直接返回给调用者
-
-
2.4.6 简单的部署
-
创建一个可执行的jar在IDEA中添加如下配置:
-
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
-
官网文档说明文件链接点击这里即可
2.5 SpringBoot项目底层原理
2.5.1 POM.xml文件
-
spring-boot-starter-
parent
当前项目的父级依赖 -
spring-boot-starter-
parent
依赖项可以帮我们省去引入依赖时填写version
标签去定义版本,我们可以按住Ctrl然后点击spring-boot-starter-parent
。
-
将会进入到,
spring-boot-starter-parent-2.5.5.pom
文件中,你会看到和parent
这个标签中,还有一个spring-boot-dependencies
父级依赖项,证明spring-boot-starter-parent
依赖项的父级依赖项是spring-boot-dependencies
依赖,而该父级依赖项下,还管理了springboot项目中的所有依赖版本
-
spring-boot-starter-web
-
spring-boot-starter
: SpringBoot场景启动器(可以理解为运行的场景是什么场景),SpringBoot将所有的功能场景抽取出来,做成一个个的starters
(场景启动器),只需项目里引入相关场景的starter就行了,如下列截图中的spring-boot-starter-web
,这个启动器当中都有哪些依赖的其他启动器呢,wind电脑按住Ctrl
点击截图中依赖的链接。
-
点击后,你将会看到
spring-boot-starter-web
依赖项当前还依赖了,spring-boot-starter
,spring-boot-starter-json
,spring-boot-starter-tomcat
,spring-web
,spring-webmvc
,这几个依赖,我们单单引入这一个spring-boot-starter-web
这一个依赖项,就能构建web项目,比如tomcat,springmvc因为该依赖项下还附带了,这几个依赖。
-
当我们需要什么场景启动器时,就引入什么场景启动器的依赖,就等于你在一个地方早上下午特别热,你就穿短袖,晚上特别冷,那你就晚上穿大棉袄,等于是什么场景你就用什么场景启动器,这里附带官方文档点击这里,里面有各种各样的场景启动器说明,你需要什么就复制什么场景启动器,然后粘贴引入到
<dependencies></dependencies>
依赖标签中。
2.5.2 引导类
-
通常我们 *Appliaction (代表
HelloMainApplication
),这个类必须放在所有子包的父包之下,因为当这个类在运行的时候,spring
会扫描这个类的所有同级的包与这些同级包之下的子包,然后加载到spring
容器中,从而进行使用,如果不是那spring
容器中的所有组件将无法使用,这是要特别注意的,如下图HelloMainApplication
这个类它就是在dgtt
包下,HelloMainApplication
这个类同级的包就有controller
这个包,所以能被spring
扫描加载到容器中进行使用,这里我们底层分析一下@SpringBootApplication
这个注解中还有什么作用,按住Ctrl键点击@SrpingBootApplication这个注解
。
-
点击后我们则会看到
@SpringBootApplication
这个注解中还包含了以下这几个依赖,逐个讲解@SpringBootApplication @SpringBootConfiguration @Configuration @Component @EnableAutoConfiguration @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
-
@SpringBootApplication
- 作用:
@SpringBootApplication
这个注解还还依赖的其它几个注解,你可以理解前两个为配置注解因为都有config
这个单词,ComponentScan
可以理解为扫描注解,我们在往下分析,这个三个注解下面的注解。
-
@SpringBootConfiguration
- 作用:
@SpringBootConfiguration
注解下还依赖了@Configuration
注解,可这个注解还依赖了@Component
这个注解,可以总结@Configuration
这个注解作用是标注一个功能是省去定义配置文件,@Component
注解作用是标注一个类表示会被添加到Spring
容器中的一个Bean
,@SpringBootConfiguration
这个注解的功能是可以使用被spring所管理的类和省去配置文件的功能。
-
@Configuration
- 作用: 它属于
spring
中的一个注解,定义配置类,等价于配置文件,spring
的普通项目配置文件xml
文件,这里可以看看看看这篇文章
-
@Component
- 作用: 标注Spring管理的Bean,使用@Component注解在一个类上,表示将此类标记为Spring容器中的一个Bean,也就是说该注解标示的类会被添加到spring容器中进行管理,但是管理的都是Bean。
- 作用: 标注Spring管理的Bean,使用@Component注解在一个类上,表示将此类标记为Spring容器中的一个Bean,也就是说该注解标示的类会被添加到spring容器中进行管理,但是管理的都是Bean。
- 作用: 它属于
@EnableAutoConfiguration
- 作用: 该注解下依赖了
@AutoConfigurationPackage
和@Import(AutoConfigurationImportSelector.class)
而@AutoConfigurationPackage
这个注解会自动将引导类所在包及其子包下面所有的组件添加到spring
容器中,而@Import(AutoConfigurationImportSelector.class)
这个注解的作用是将自动配置类所有资源加载到spirng容器中进行管理,可以总结的是@AutoConfigurationPackage
这个注解拥有这两个注解的功能,因为依赖了这两个注解。
@AutoConfigurationPackage
- 作用:
@AutoConfigurationPackage
这个注解中有个@Import(AutoConfigurationPackages.Registrar.class)
注解的类中有个registerBeanDefinitions()
函数,而这个函数中有个参数metadata
里面加载到了,可以将引导类所在包及其子包下面所有的组件添加到spring
容器中
@Import(AutoConfigurationImportSelector.class)
- 作用:
1、将所有组件以全类名的方式返回,并且添加到spring容器中
2、会给容器中导入非常多的自动配置类(都是 *AutoConfiguration),就是导入 并配置好很多当前项目中所有需要的组件,省去我们手动编写配置然后注入到组件中
- 作用:
- 作用:
- 作用:
@ComponentScan
- 作用: 被该注解标注的类,会被spring容器进行管理和使用