目录
技能准备:
- 熟悉spring框架
- 熟练使用maven进行项目构建和依赖管理
环境准备:
- idea或者eclipse,本文idea
- jdk1.8
- maven3.x
- spring Boot2.0
创建项目
new Project
一路下一步
配置maven,也可以不配idea自带maven
目录结构
resources文件夹中目录结构
-
static:保存所有的静态资源; js css images;
-
templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使用模板引擎(freemarker、thymeleaf);
-
application.properties:Spring Boot应用的配置文件;可以修改一些默认设置;
导入spring Boot 依赖
<?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.bufanli</groupId>
<artifactId>spring_boot_hello_word</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<!--版本管理-->
<properties>
<!--打包时跳过测试-->
<skipTests>true</skipTests>
<!--maven使用jdk1.8进行编译 -->
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--springboot web 启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- 这个插件,可以将应用打包成一个可执行的jar包;-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
编写启动springboot应用的启动类
package com.bufanli;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author BuShuangLi
* @date 2019/6/12
* @SpringBootApplication 说明这是一个springBoot应用
*/
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
//固定格式
SpringApplication.run(HelloWorldApplication.class,args);
}
}
编写controller
HelloWorldController.java
package com.bufanli.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* @author BuShuangLi
* @date 2019/6/12
*/
@RestController
public class HelloWorldController {
@RequestMapping("/hello")
public Map hello(){
Map<Object, Object> msg = new HashMap<>();
msg.put("msg","success");
return msg;
}
}
启动项目:
默认端口8080
部署项目
打包成,jar
完成后jar包所在目录
打开cmd 命令行
页面访问
细节:
pom文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
他的父项目是
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
- 可以看到他这里管理了很多依赖版本
以后导入依赖绝大部分不需要写版本号的,也有没有被管理需要写版本号
- 导入的spring-boot-starter-web 启动器
spring-boot-starter场景启动器 导入了web组件所需要的依赖 可以进去看一下
spring Boot 将所有的功能场景抽取,版本由spring Boot自动控制,用什么场景就导入什么场景starter 启动器
主程序启动类
-
@SpringBootApplication 组合注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
...
}
-
@SpringBootConfiguration springBoot配置类 组合类 就是容器中的组件
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
-
自动配置 @EnableAutoConfiguration 组合注解 开启自动配置功能
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
...
}
@Import(AutoConfigurationImportSelector.class) 导入那些组件的选择器,以数组的形式返回组件的全类名,添加到容器中,有了自动配置类减少了手动配置
这些类路径都是从根目录下的 /META-INF/spring.factories文件中获取的
javaEE整体自动配置解决包 路径 /org/springframework/boot/autoconfigure
@AutoConfigurationPackage 自动配置包 注意 @Import 注解 给容器导入了一个组件
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
}
AutoConfigurationPackages.Registrar.class
- 包扫描
断点启动项目可以看到,他拿到了启动类所在的包,其实他是对这个包以及包下的子包的spring组件进行扫描,所以启动类要放到靠前的包相当于包扫描的作用