Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。
Spring Boot 现在已经成为Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。成为SpringBoot全家桶。
如果项目中出现parent标签报错/插件报错说明:
1.parent标签报错:
2.maven插件报错
pom.xml
它产生整个项目目录,其实我们只需pom.xml文件,覆盖本地maven工程的pom.xml文件。
注:可以使用idea直接创建springboot项目,其本质也是去调用上面的网站,只不过在本地访问外网https://start.spring.io
修改pom.xml后,把项目进行maven-update 操作,下载依赖的jar包。
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>cn.tedugroupId>
<artifactId>jkartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>jkname>
<description>Demo project for Spring Bootdescription>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.4.2version>
<relativePath/>
parent>
<properties>
<java.version>1.8java.version>
<skipTests>trueskipTests>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
<groupId>com.jtgroupId>
<artifactId>springboot_demo01artifactId>
<version>0.0.1-SNAPSHOTversion>
<name>springboot_demo01name>
<description>Demo project for Spring Bootdescription>
parent标签的作用
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.5.3version>
<relativePath/>
parent>
dependency标签作用
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
build标签作用
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>2.5.3version>
plugin>
plugins>
build>
File - New - Project - 选择Spring Initializr - next - 输入Group名和Artifact名和选择java8 - next - 选中Spring(Spring Web) - next - ok
package cn.tedu.cgb2106boot01;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController //接受浏览器的请求 并返回json数据
public class HelloBoot {
@RequestMapping("hi") //只匹配一个路径,规定了浏览器的地址栏怎么写
public String hello(){
return "hello spring boot";
}
}
@Value为属性赋值
# 语法说明
## 语法1: 数据结构 -- key-value结构
## 语法2: 写法 -- key:(空格)value
## 语法3: yml文件 -- 默认字符集是UTF-8 中文部乱码
## 语法4: yml文件 -- 有层级效果 注意缩进
server:
port: 8080
# SpringBoot启动时 默认加载yml文件
msg:
hello: "今天下雨,记得打伞。~~~"
package com.jt.springboot_demo01.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
/**
* 规则:
* 1. 当Spring容器启动时,会加载yml配置文件。会将内部的key-value结构 加载到spring维护的内存空间中
* 2. @Value功能,从spring容器中根据key 动态赋值
* 3. springel表达式 简称:spel
* 使用场景:
* 如果代码中需要给成员变量赋值时,一般采用动态的赋值方式
*/
@Value("${msg.hello}")
private String msg;
@RequestMapping("get")
public String get(){
return msg;
}
}
业务优势会大量动态赋值,如果将大量业务数据写入到yml文件中,会导致代码混乱,最好的方式指定properties文件,为业务赋值
# 语法1:
# 数据结构: key-value
# 注意事项:不要添加 "" 号,本身就是字符串.
# 字符集编码:写法采用utf-8,程序读取采用ISO-8859-1
pro.msg=配置信息
package com.jt.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
//spring负责加载指定的配置文件
//如果注解中只需要一个属性,名称为value,则可以省略不写,但又多个属性时,不可以省略
@PropertySource(value="classpath:/msg.properties",encoding = "utf-8") //只要看到xxxSource注解就写classpath:/,格式(classpath:是加载的意思)
public class HelloController {
/**
* 规则:
* 1. 当Spring容器启动时,会加载yml配置文件。会将内部的key-value结构 加载到spring维护的内存空间中
* 2. @Value功能,从spring容器中根据key 动态赋值
* 3. springel表达式 简称:spel
* 使用场景:
* 如果代码中需要给成员变量赋值时,一般采用动态的赋值方式
*/
@Value("${msg.hello}")
private String msg;
@Value("${pro.msg}")
private String proMsg;
@RequestMapping("get")
public String get(){
return msg+ "||"+ proMsg;
}
}
说明: 通过 java -version 检查JDK是否配置正常.
如果提示java不是内部命令 则环境变量配置一定有问题.
环境变量配置:
如果项目发布成功之后,需要关闭。则直接关闭dos命令窗口即可。
如果依然不能正常关闭,则杀死进程/或者重启计算机。
说明:当通过dos命令 启动tomcat服务器时,可能由于误操作。锁定当前dos窗口
解决方案:万能取消指令 ctrl + c
@Target(ElementType.TYPE) — 该注解对类有效
@Retention(RetentionPolicy.RUNTIME) — 该注解在运行期有效
@Documented — 生成源码时 是否动态生成注释文档
@Inherited — 标识注解是否可以被继承
说明:当SpringBoot启动时,会实例化很多的对象,但是需要排除特定的类型
原因:SpringBoot内部兼容了很多的第三方框架,但是其中个别加入之后会影响整个代码流程,所以通过这样的方式将个别的类排除在外。
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
关键词:配置文件/配置类
作用:整合第三方框架(配置)
@Configuration: 该注解一般标识类文件,告知SpringBoot程序 这个类是用来整合第三方框架/配置的。
该注解表示自动配置的包扫描的路径.
工作原理: 该注解会动态的获取主启动类当前的包路径.之后开启包扫描的机制.
知识点: 以后写代码都应该在主启动类的同包及子包中.
知识回顾: SpringBoot使用体现了"开箱即用"的思想,用户引入jar包之后 可以直接使用(少量配置).
思考: dependencies代表程序的依赖项,(将其他的包加载到自己的项目中), 只是加载不负责执行.
当SpringBoot主启动项执行时,内部会加载@Import(AutoConfigurationImportSelector.class),
该注解的作用就是根据依赖信息,根据SpringBoot内部的配置信息,依次加载执行.
当匹配了用户添加的启动器之后,程序负责实例化框架(执行jar包中的内容).
如果匹配不到,则继续向下执行.最终SpringBoot程序加载成功.
问题: 用户暂时不需要数据库的配置. 问:能否先行添加数据源的启动项?? (不添加任何注解!!!)
答案: 不可以,因为启动项执行需要完整配置,数据源信息并未添加.导致报错.
总结: SpringBoot项目中的依赖包尤其启动项,添加时慎重. 如果需要添加启动器,则必须保证配置完整(当匹配了用户添加的启动器之后,程序负责实例化框架(执行jar包中的内容)).否则程序启动必然失败!!!.
要求: 不管是几个环境,要求配置项都必须相同,值可以不同
语法:
1.使用 - - - 实现YML配置文件的分割
2.定义环境名称
3.定义默认环境名称
#指定默认的环境
spring:
profiles:
active: test
---
#关于YML配置文件说明
# 1.数据结构 key=value
# 2.数据类型 默认都是字符串 如果需要类型转化,则框架已经在内部完成
# 3.yml写法: 1.key: (空格)value 2.有层级结构 编辑时注意
# 4.字符集编码: 默认程序加载时都是UTF-8
#定义环境名称
spring:
config:
activate:
on-profile: dev
server:
port: 8080
#项目发布的路径
servlet:
# /缺省值 localhost:8080/jt/xxxx请求路径
context-path: /
#2.为属性赋值 hello代表前缀 key=hello.msg
hello:
msg: "我喜欢开发"
#环境分割线
---
spring:
config:
activate:
on-profile: test
server:
port: 8090
#项目发布的路径
servlet:
# /缺省值 localhost:8080/jt/xxxx请求路径
context-path: /
#2.为属性赋值 hello代表前缀 key=hello.msg
hello:
msg: "我喜欢测试"
说明:有时由于业务需要,需要进行单元测试,单元测试中的对象可能会依赖Spring容器
需求:需要Spring容器管理一个User对象,id=101 name=“张三”
分析:难点:定制化属性的内容!!! 具体的业务功能.利用配置类实现!!!
Spring容器怎么管理对象???
IOC管理对象的2种方式
– 1.层级代码用@Controller等注解
– 2.业务需求用 @Configuration + @Bean
package com.jt.config;
import com.jt.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//配置类
//作用:将自己需要的对象交给Spring容器管理
@Configuration //标记这是一个配置类
public class UserConfig {
/**
* 思路:1.Spring内部维护了一个Map集合
* 2.Map集合key/value 分别是谁???
* -- key是方法名,value是方法的返回值 Map
* 3.IOC管理对象的2种方式
* -- 1.层级代码用@Controller等注解
* -- 2.业务需求用 @Configuration + @Bean
*
* 1.注解组合:@Configuration + @Bean
* 2.什么是bean? -- 被Spring管理的对象
* 3.@Bean注解的作用
* 将方法的返回值对象交给Spring管理
* 4.Spring如何管理对象???
* 数据结构:Map集合 Map
* key:对象的ID
* value:实例化之后的对象
* demo1:Spring如何管理对象
* key是方法名
* value是方法的返回值
* Map
* demo2:
* @Controller
* HelloController{}
* key:helloController 首字母小写
* value:Spring通过反射创建的HelloController对象
*/
@Bean
public User user2(){
return new User(101,"张三");
}
}
Spring容器怎么依赖注入???
对象注入的方式:
1.构造方法注入
2.set方法注入
3.集合注入
set方法注入:
package com.jt;
import com.jt.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
/**
* 原理说明:
* 1.当测试类执行时,会根据SpringBoot的配置动态启动Spring容器
* 2.当spring启动时,会加载所有的注解和配置类,最终将所有的对象交给Spring容器管理 Map集合
* 3.@SpringBootTest 通过这个注解,可以动态的从Spring容器中获取对象
*/
@SpringBootTest
class TestSpring {
/**
* 对象注入的方式:
* 1.构造注入
* 2.Set注入
*
* Set注入方式:
* 1.根据类型注入(默认规则)
* 2.根据名称注入 -- 下面两个注解必须一起使用
* @Autowired
* @Qualifier(value = "user2") -- 这个value="???"的值是Map集合中的key
*/
@Autowired //根据类型注入(默认规则)
// @Qualifier("user2") // 根据名称注入
private User user;
@Test
public void testUser(){
System.out.println(user.toString());//User(id=101, name=张三)
}
}
浏览器输入的url,就会被解析后传入web中间件(/hi),web中间件再会进一步的解析,找到对应的Controller的某个注解里对应的url @RequestMapping({"/","/hi"}) ,从而就找到HelloController的hi()方法。最终利用反射执行这个类的方法(将来这个方法中就用来编写实现业务逻辑代码)。因为使用了@RestController,返回的String字符串对象底层会使用json工具类转换java对象为json字符串,返回给浏览器,浏览器将字符串回显(展示)在页面上。
Tomcat服务不会自动关闭,需要手动关闭,如不关闭,下次启动就会报下面错误:
port 8080 was already in use. 端口8080已经被占用。关闭服务,重新启动即可。
仍未解决的话,以下三种方式任选一个来测试.
1,需要执行DOS命令处理:
C:\Users\lpx>netstat –ano --查看所有端口号,找到8080端口对应的PID号
C:\Users\lpx>taskkill -pid 688 –f --杀死688进程号 ```
2,可能是因为电脑里安装过Oracle数据库:
要找到Oracle的服务OracleXETNSListener,停掉.
3,直接使用yml方式配置修改端口号:
在src/main/resources下添加application.yml文件,内容如下:
server:
port: 8090
清除项目缓存,再次重启服务,测试即可: http://localhost:8090/hi
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML文件、图片文件、查询结果等)。
怎么浏览器输入url就可以找到我们写的controller进行执行并且返回呢?
其实这底层是有一套标准的,这个标准称为HTTP协议。我们浏览器成输入的http://这就代表执行http协议。