文章目录
Spring Boot
- Spring Boot 是所有基于 Spring 开发的项目的起点。Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件。简单来说就是 SpringBoot 其实不是什么新的框架,它默认配置了很多框架的使用方式,整合了所有的框架。
- 本质作用就是为了减少配置性的工作
- 如web项目的传统开发步骤:
(1. 创建web项目结构, 包括web资源文件和web.xml
(2. 使用Spring Framework配置很多xml文件
(3. 部署到tomcat - 但是如果我们使用Spring Boot 其内置就默认了很多配置 (启动类中自动完成的工作)
搭建一个Spring Boot
- 修改pom.xml 将下面的配置加到pom.xml中
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>frank</groupId>
<artifactId>springboot-study</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 名字随意 -->
<name>springboot</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.mybatis.spring.boot</groupId>-->
<!-- <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!-- <version>2.1.1</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
-
创建启动包 (必须在一个包下创建)
-
启动包代码
package todayTest.application;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Created with IntelliJ IDEA.
* Description: If you don't work hard, you will a loser.
* User: Listen-Y.
* Date: 2020-08-17
* Time: 9:56
*/
@SpringBootApplication
public class TodayTestApplication {
public static void main(String[] args) {
SpringApplication.run(TodayTestApplication.class, args);
}
}
- 验证是否启动正常 执行main方法出现如下则正常
- 并且可以正常访问
Spring Boot的配置介绍
默认的web配置
(1. web资源文件夹: 映射静态资源文件夹
(2. 默认的web.xml文件
(3. 内置的 tomcat
自动扫描并初始化:
- (1. 扫描包: 以启动类所在的包, 为扫描的包 (所以启动类必须在一个包下)
- (2. 扫描类上的注释: 扫描Spring框架支持的注解 (初始化实例对象 依旧是单例模式)
常见类上的注释:
1. @Component
可以使用此注解描述Spring上的Bean 但他是一个泛化的概念 就是说仅仅表示一个Bean组件, 可以使用在任何层次, 使用时只需要将该注释标注在相应的类上即可
注解一个类表示这个类的将作为对象提供方出现,并且对象的创建过程完全交给 Spring 来进行。
2. @Respository
用于数据访问层(dao层) 的类标识为Spring中的Bean 其功能与@Component类似
3. @Service
常作用在业务层(Service层) 用于将业务层的类标识为Spring的Bean 其功能与@Component类似
4. Controller
常用于标识web请求响应的处理类, 通常作用在控制层 用于将控制层的Spring的Bean标识出来, 其功能与@Component类似
5. @Configuration
这是一个配置类 启动时做配置工作
6. @SpringBootApplication
会扫描被该注解修饰包下的所有的类,包括其子包下的类,以达到完成上面一些注解修饰类的创建和注入过程
6. @ControllerAdvice统一处理
- (3. 初始化: 属性和方法上有Spring支持的注解 进行初始化 (初始化实例对象 使用单例模式)
@Bean :配置类方法上的, 以返回值作为Bean的实例对象, 注册到容器中 (Bean的名称为方法名)
注意: @Bean注解方法, 如果没有被扫描到是不会起作用的 而且同一个类型要实例化多个对象时, 这种方式比较适合
@Bean和 @Component 类似, @Bean 的目的也是为了把一个 bean 对象注册到 IOC 容器中.
@Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。
@Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。
@Component(@Controller、@Service、@Repository)通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中, 而 @Bean 注解通常是我们在标有该注解的方法中定义产生这个bean的逻辑。
很多场景下都是既可以使用 @Component 也可以使用 @Bean但是当我们引用第三方库中的类, 装配到 Spring 容器中时, 就只能使用 @Bean (我们无法修改第三方类库的代码).
装配Bean的方式(注解)
- @AutoWired 这是一个属于Spring框架的一个装配Bean的方式
- @Resource JDK提供的注解表示资源 但是JDK只提供了一个规范没有提供实现(像JDBC和Servlet也是这样)
@AutoWired 与 @Resource主要区别
- 一个是Spring的 一个是JDK提供的
- 如果存在一个类型 有多个实例对象时, 默认查找bean的名称和变量名相同的那一个 如果变量名和bean的名称不一致需要手动指定 :
代码演示
- 准备工作实现一个Person类
package todayTest.application.modle;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* Created with IntelliJ IDEA.
* Description: If you don't work hard, you will a loser.
* User: Listen-Y.
* Date: 2020-08-17
* Time: 10:05
*/
@Getter
@Setter
@ToString
public class Person {
private String name;
private String Id;
private int age;
}
- 创建@Configuration用于启动时做好配置工作 使用@Bean 配置类方法上, 以返回值作为Bean的实例对象
package todayTest.application.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import todayTest.application.modle.Person;
import java.util.HashMap;
import java.util.Map;
/**
* Created with IntelliJ IDEA.
* Description: If you don't work hard, you will a loser.
* User: Listen-Y.
* Date: 2020-08-17
* Time: 10:19
*/
@Configuration
//用于启动时完成的配置工作
public class PersonConfiguration {
@Bean
//注意的方法名和返回名不一样 但是这个bean对象是以方法名作为他的名称的
public Map<String, String> test1() {
Map<String, String> map = new HashMap<>();
map.put("勒布朗", "詹姆斯");
map.put("科比", "布莱恩特");
return map;
}
@Bean
public Person person1() {
Person person = new Person();
person.setName("Listen");
person.setId("612720199900008000");
person.setAge(20);
return person;
}
@Bean
public Person person2() {
Person person = new Person();
person.setName("Frank");
person.setId("892720199900008000");
person.setAge(22);
return person;
}
}
- 创建@Controller用于web请求的处理 并使用@Resource和@AutoWired装配bean
package todayTest.application.controller;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import java.util.Map;
/**
* Created with IntelliJ IDEA.
* Description: If you don't work hard, you will a loser.
* User: Listen-Y.
* Date: 2020-08-17
* Time: 10:10
*/
//当前类型注册实例到容器中,并指定为Web请求的处理
@Controller
//@RequestMapping可以定义请求相关的配置:如路径,请求方法等等
@RequestMapping("/per")
public class PersonController {
@Resource
//@AutoWired 使用这个也是可以的
//以我们设置的变量名去查找初始化好的bean对象
private Map<String, String> test1;
@RequestMapping(value = "/test1", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, method = {RequestMethod.GET})
//设置web请求的访问路径
// produces设置返回的数据格式是uft-8
// method设置可以访问的http方法为get
@ResponseBody
//设置以json格式返回结果
public Object test1() {
return test1;
}
}
- 使用postman请求演示
- 演示如果同一个类型 有多个实例对象的时候, 并且此时变量名和bean的名称不一样时 使用@Resource和@AutoWired的不同处理方法
//使用@Resource时
@Resource(name = "person1")
private Person person;
@RequestMapping(value = "test2")
@ResponseBody
public Object test2() {
return person;
}
//使用@Autowired时
@Autowired
@Qualifier(value = "person2")
private Person person3;
@RequestMapping(value = "test3")
@ResponseBody
public Object test3() {
return person3;
}
- 使用postman请求演示