SpringBoot 笔记 ( 一 ):启动流程

SpringBoot 笔记(一): 启动流程

1. 配置开发环境

1. 创建 Maven 项目

然后我们首先在项目里面加上编译环境,防止每一次更新 Maven 的时候导致项目的语言级别自动被改成 Java5 然后导致编译不通过的问题。

123456789101112

<profile> <id>jdk‐1.8</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties></profile>

2. Maven 中添加依赖

   一开始加上最基础的依赖就是 parent 父项目和 web 的 starter 。

1234567891011

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version></parent><dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency></dependencies>

  其实很明显父工程的作用就是用来版本控制的,为什么这么说?我们跟踪一下父工程,来到父工程的 pox.xml 看到如下的配置。

123456

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.9.RELEASE</version> <relativePath>../../spring-boot-dependencies</relativePath> </parent>

   继续跟踪这个父工程可以看到以下内容。

123456789101112

<properties> <!-- Dependency versions --> <activemq.version>5.14.5</activemq.version> <antlr2.version>2.7.7</antlr2.version> <appengine-sdk.version>1.9.59</appengine-sdk.version> <artemis.version>1.5.5</artemis.version> <aspectj.version>1.8.13</aspectj.version> <assertj.version>2.6.0</assertj.version> <atomikos.version>3.9.3</atomikos.version> .... ....</properties>

   好的,现在终于算是找到源头了,这些 properties 就是用来规定 springboot 整合的这些框架的版本,所以说我们只用管好 springboot 的版本,对于里面封装的各个组件我们不用操心,他都帮我们配置好了。但是我们也是可以自己继续进行定制的,后面会说到相关的东西。

   可以看到里面添加的另外一个 starter 就是 web 的 starter ,其实在 springboot 中的 starter 的命名很规范一眼就能看出是干嘛的。什么是 starter ? 简单来说就是 springboot 用来整合各个框架的包,我们需要什么框架什么功能就添加上这些对应的 starter 在 springboot 中就可以享受开箱即用的快感了!

3. 编写主类

   做完了这些最简单的配置,我们就可以开始写启动代码了,代码非常简单只有几行。

123456789

// @SpringBootApplication 来标注一个主程序类@SpringBootApplicationpublic class MainApplication { public static void main(String[] args) { // Spring启动!SpringApplication.run(MainApplication.class,args); }}

   很神奇这样我们就写好了一个完全可以跑起来的 springboot 应用,我们只是写了一个注解和一行代码而已,为什么会这么简单,让我们看看 @SpringBootApplication 注解。

1. @SpringBootApplication 注解

   首先可以看到的是这是一个组合注解,里面有如下内容:

12345

@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

   好一个个的来看:

  1. @SpringBootConfiguration 这个注解就是标注这是一个 springboot 的配置类,也就是可以进行 springboot 的配置,配置类就等于配置文件,我们要有这个等价的概念。
  2. @EnableAutoConfiguration 他是用来开启自动配置,也就就是 springboot 的核心,其实最终起作用的就是 spring-boot-configuration-processor-1.5.9.RELEASE.jar 这个包在起作用,后面会分析到。看看这个注解里面的内容!12@AutoConfigurationPackage@Import(EnableAutoConfigurationImportSelector.class)

两个注解,第一个是自动导组件的注解,底层调用了Spring 底层注解(@Import)给容器中导入一个组件。第二个就是导入一个 Seletor 组件,这个组件底层就是各种 beanFactory 也就是我们 Spring 底层的 Ioc 容器,然后就是向容器里面导入我们的自动配置类,xxxAutoConfiguration 这种类,也就是 spring-boot-configuration-processor-1.5.9.RELEASE.jar 包里面的内容。 那么具体把这个包里面的哪些 xxxAutoConfiguration 加入到容器里面呢? 这就需要看一个方法。在这个 Selector 的底层有一个 getCandidateConfigurations 方法,这个方法就是去扫描所有包下面的 META-INF/spring.factories 文件,然后这些文件中就会说我要配置这个组件要导入哪些 xxxAutoConfiguration 类对这个组件进行自动配置。可以看一眼里面的具体内容:

123456789

org.springframework.boot.test.autoconfigure.orm.jpa.AutoConfigureDataJpa=\org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration

   可以看到这就是他的自动配置机制!

  1. 最后还有一个包扫描的注解,这个注解其实就是扫码主类所在包及其子包的组件添加的 Spring 容器。所以说我们必须把其他的类放到与主类平行的其他包中,否则没办法加载这些类到容器里。

2. run 方法

在这个方法的底层 new 了一个 SpringApplication 的东西,这个很明显就是真正的 springboot 的启动类了。最后调用到了 public ConfigurableApplicationContext run(String... args) 这里面做了一些列的启动操作,就不具体看了。然后我们传入的那个类被放到了 sources = new LinkedHashSet(); 这个数据结构里面。感觉没怎么被使用。

   这样其实我们的 springboot 应用已经可以开始跑起来了。但是我们不能访问任何页面,主要是因为我们没有 controller !好的接着编写一个简单的 controller。

4. controller 编写

12345678

@Controller //标注他是 controller@ResponseBody //能够返回数据public class HelloController { @GetMapping("/hello") //url映射 public String hello(){ return "Hello World!"; }}

   @Controller 、@ResponseBody 这两个注解我们可以合并采用 @RestController 这个其实就是上面两个注解的组合注解。然后下面的那个 @GetMapping 就是采用的 get 方式请求时候的映射,然后对应的还有 post、put、delete 等等,这些都是 restful 接口中有规定的在何种情况使用何种请求方式。

   此时我们去访问 localhost:8080/hello 就会显示 “Hello World!” 了!

5. 打包部署

   这个在 springboot 中打包部署非常容易就是采用一个 Maven 插件我们就可以打包成 jar 而非 war 。那么也就是说我们可以直接使用 java -jar 命令来运行这个 jar 包。等等 !难道不需要 tomcat 之类的 web 容器吗? 对的!因为springboot 是内嵌了 tomcat 所以我们根本没有部署到 web 容器这一说,所以说部署简洁。那么我们需要加入打包插件。

12345678

<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins></build>

   接下来只需要在 Maven 中执行 package 命令就可以在 target 目录生成 jar 包。并且我们可以使用 java -jar 来执行这个 jar 。

6. resource 目录结构

resources文件夹中目录结构:

  • static:保存所有的静态资源如 js css images。
  • templates:保存所有的模板页面 html 模板。
  • application.properties:Spring Boot应用的配置文件。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT笔记

SpringBoot开发案例之奇技淫巧

程序员都有着一种天生的好奇心,这种好奇心引导着我们的编程生涯。写几行代码,装载到计算机里,让它按照你的思路工作,这是非常有趣的事情。但随着开发的东西越来越多,我...

1K10
来自专栏好好学习吧

linux基础学习整理

1054
来自专栏一个会写诗的程序员的博客

第9章 Spring Boot开发者工具第9章 Spring Boot开发者工具

Spring Boot Maven Plugin,提供了使用Maven构建Spring Boot 工程的支持。我们可以用这个插件完成打包功能。支持打可执行jar...

1962
来自专栏懒人开发

AndroidStudio简单使用(一):基础面板

用android studio也比较长时间了 一直没有怎么总结过, 看了 徐宜生 的 android群英传: 神兵利器 后,才感觉到, 其实 除了代码以外...

6811
来自专栏一个会写诗的程序员的博客

《Spring Boot 实战:从0到1》第3章 零XML配置的Spring Boot Application第3章 零XML配置的Spring Boot

Spring Boot 提供了一种统一的方式来管理应用的配置,允许开发人员使用属性properties文件、YAML 文件、环境变量和命令行参数来定义优先级不同...

1574
来自专栏IT技术精选文摘

Spring核心——Stereotype组件与Bean扫描

在注解自动装载中介绍了通过注解(Annotation)自动向Bean中注入其他Bean的方法,本篇将介绍通过注解(Annotation)向容器添加Bean的方法...

1344
来自专栏决胜机器学习

SpringBoot工作机制

SpringBoot工作机制 (原创内容,转载请注明来源,谢谢) 一、概述 Spring Boot是对于Spring框架“约定优于配置”理念的实践产物。 一个最...

4136
来自专栏IT笔记

SpringBoot开发案例之奇技淫巧

spring-boot-starter-parent包含了大量配置好的依赖管理,在自己项目添加这些依赖的时候不需要写<version>版本号

3836
来自专栏后台及大数据开发

docker:(4)利用WebHook实现持续集成

在项目调试测试阶段,可能经常需要重复上面的步骤,以便将最新代码部署到特定环境供测试人员或其他人员使用

1101
来自专栏JavaNew

Spring Boot实战:逐行释义HelloWorld

3025

扫码关注云+社区

领取腾讯云代金券