2.Spring Boot 入门程序及基本自动配置分析

2.Spring Boot 入门程序

  • 由于SpringBoot是一个约定大于配置的框架,所以需要我们做的事情很少,基本都是springBoot自动装配了

第一步:创建一个SpringBoot项目

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

​ 第二步:编写controller接口进行测试

  • 这里需要注意的就是自己创建的包名要与SpringBoot的主启动类在同一级目录下
package com.xuan.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * xuan
 * 2020/7/22
 * 1870136088@qq.com
 **/
@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello(){
        return "hello springboot";
    }
}

​ 第三步:启动Springboot01HelloworldApplication,访问页面

  • 访问 localhost:8080/hello 页面出现 hello springboot 就算第一个springBoot项目测试成功

2.1 入门程序深入分析

​ 为什么我们只是做了极其简单的配置,就能做到spring复杂配置后的效果呢?

2.1.1 先从配置文件进行分析
  • 先从配置文件来分析
  • spring-boot-starter-parent这是springBoot场景启动器的父项目(父依赖)
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
  • Ctrl+鼠标左键跟进去 能够看到SpringBoot的依赖集合,再点进去
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-dependencies</artifactId>
  <version>2.3.1.RELEASE</version>
</parent>
  • properties标签处能够看到SpringBoot为我们导入了很多可能用到的依赖(下面就分享一些常用的)
<properties>
  <activemq.version>5.15.12</activemq.version>
  <jedis.version>3.3.0</jedis.version>
  <junit.version>4.13</junit.version>
  <log4j2.version>2.13.3</log4j2.version>
  <aspectj.version>1.9.5</aspectj.version>
  <assertj.version>3.16.1</assertj.version>
  <logback.version>1.2.3</logback.version>
  <lombok.version>1.18.12</lombok.version>
  <spring-security.version>5.3.3.RELEASE</spring-security.version>
  <mysql.version>8.0.20</mysql.version>
  <jstl.version>1.2</jstl.version>
  ............
</properties>properties>
  • 再来看看我们勾选web依赖帮我们做了什么
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • 跟进进去spring-boot-starter-web
  • json场景启动器 记不记得我们在ssm中使用json需要引入jackson-databind依赖,以及配置一些aop:annotation-driven标签中配置json乱码问题解决配置,这些springBoot的json场景启动器帮我们做了
  • tomcat场景启动器:SpringBoot是内嵌(内置)了tomcat的,所以我们并没有配置tomcat就能运行了,tomcat默认端口是8080
  • spring-web,spring-webmvc依赖:这相当于帮我们引入了所有关于spring的组件配置(spring7大组件都包含了)这里面其实还帮我们配置了spring的核心配置文件applicationContext.xml中的视图解析器,处理器映射器,处理器适配器等等以及web.xml 我们的DispatchServlet、CharacterEncodingFilter都不需要配置了
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.3.1.RELEASE</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-json</artifactId>
    <version>2.3.1.RELEASE</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <version>2.3.1.RELEASE</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <scope>compile</scope>
  </dependency>
</dependencies>
2.1.2.从主启动类进行分析
  • SpringBoot自动配置原理无非就是在启动的时候去读取"META-INF/spring.factories"这个文件的自动配置
  • 那如何读取呢?
  • 跟进@SpringBootApplication第一个关键注解就是**@SpringBootConfiguration**跟进就只能发现他是一个被加入到SpringIOC容器的一个组件
  • 另一个关键注解是**@EnableAutoConfiguration跟进关键就是AutoConfigurationImportSelector**这个类
AutoConfigurationImportSelector这个类下的selectImports这个方法中调用了getAutoConfigurationEntry方法这个方法里面就主要是读取配置文件里面有这样一段List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);于是我们跟进getCandidateConfigurations这个方法这个方法有一段message会说找META-INF/spring.factories下资源,但是他下面的loadFactoryNames方法才是关键 里面直接加载资源classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
  • 基于以上我们就能找到META-INF/spring.factories通过在启动时扫描这个文件内容看哪些已经有添加进pom.xml从而实现自动装配

  • 为什么spring.factories启动加载全部自动配置类还是有一些没有生效,这个的关键就是**@ConditionOnXXX**注解(是需要条件的)

package com.xuan;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Springboot01HelloworldApplication {

    public static void main(String[] args) {
        SpringApplication.run(Springboot01HelloworldApplication.class, args);
    }

}

总结:SpringBoot在启动时会扫描自动配置包下的META-INF/spring.factories目录,这个目录已经包含了几乎所有的自动配置类全限定类名,SpringBoot会根据导入的场景启动器将特定的类扫描到并添加到SpringIOC容器中而这些AotoConfiguration会有很多个@Bean组件都会根据条件注入到IOC容器中。

run方法启动原理

  • 第一步:判断是普通项目还是web项目
  • 第二步:推断当前的主类(main)
  • 第三步:run方法中有监听器,是全局的能够获取上下文内容 监听bean的生命周期

2.2 入门程序结构目录分析

​ resources类路径下的资源文件夹

  • static目录:是放静态资源的 比如css js plugins pages
  • templates目录:是放置模板引擎的(springboot默认是打jart包的 默认支持嵌入式tomcat) 这个放不了jsp 所以可以添加的的jsp模板为(freemaker,thymeleaf)
  • application.propertise目录:springBoot的配置文件 可以修改默认配置也可以写成application.yml(yaml的格式看起来更加舒服,层次清晰)

​ java类路径下的资源文件以及类

  • 标有@SpringBootApplication的主启动类是SpringBoot程序的入口
  • 此外还可以在同级目录下创建我们开发所需的包及类,例如pojo、service、controller、utils、config等等

2.3 将项目打成jar包外部运行

​ 第一步:我们一开始创建项目的时候就是选择了打jar包的方式对应配置如下

  • pom.xml中打jar包代码
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

​ 第二步:将项目打成jar包

  • 找到右边Maven 在生命周期中选择package打包方式,双击运行

在这里插入图片描述

第三步:BUILD SUCCESS后在target找到我们打包的项目,复制

在这里插入图片描述

​ 第四步:复制完随便找个文件夹扔进去(当然你也可以找到你项目对应target目录下的jar包,我这里就纯粹方便测试而已) cmd 进入命令行模式 实行java -jar 加上项目名

  • 于是项目就启动了,你可以在页面进行测试 还是能访问到controller配置的输出结果的

**加粗样式**

​ 基于以上我们将项目打成jar包测试就成功了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值