SpringBoot
![image-20220322205111812](https://i-blog.csdnimg.cn/blog_migrate/4f2e7a234bbd6bca36cc1e2df91880c1.png)
1.概述
1.1 为什么需要springboot?
现有的SSM(spring+springMVC+mybatis)框架存在的问题
- 大量的maven冗余配置,依赖
- 每次构建项目都需要花费大量时间来编写大量的相同配置
- 整合第三方技术都需要编写相关配置文件
- 项目测试每次都需要部署到Tomcat
1.2 引言
Spring Boot是由Pivotal团队提供的全新框架
,其设计目的是用来简化Spring应用的 初始搭建以及开发过程
。该框架使用了特定的方式来进行配置
,从而使开发人员不 再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应 用开发领域(rapid application development)成为领导者。
Spring Boot 全新框架 作用: 简化spring应用初始搭建和开发过程
如何简化: 开发人员使用springboot只要基于特定方式进行配置 简化spring使用
SpringBoot 微框架: 5分钟 完成之前ssm中环境
springboot(微框架) = springmvc(控制器) + spring core(项目管理)
1.3 spring的优势
创建完整的独立的Spring应用程序
spring springmvc 只有一个容器嵌入的Tomcat,无需部署WAR文件
springboot 内嵌tomcat 应用跑在内嵌服务器简化Maven配置,自动配置Spring Springmvc,没有XML配置
几个依赖- 用来springboot spring应用再无xml
1.4 SpringBoot的约定
-
springboot 项目中必须在**src/main/resources中放入application.yml(.properties)核心配置文件 名字必须为:application
-
springboot 项目中必须在**src/main/java中所有子包之外构建全局入口类型,xxApplication,入口类一个springboot项目只能有一个
约定的项目结构:
2.HelloWorld(第一个springboot)
2.1 搭建步骤
- pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!--引入springboot的web支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
-
引入配置文件application.yml
src/main/resources/application.yml
server: port: 8181 #自定义访问的端口号 servlet: context-path: /boot #项目的根目录
-
编写入口类
@SpringBootApplication public class Boot01Application { //main方法里面必须有SpringApplication.run()方法,且参数为该入口类的class对象和main的参数args public static void main(String[] args) { SpringApplication.run(Boot01Application.class, args); } }
-
启动项目测试运行
没有报错的话表示项目环境搭建正常可以继续进行下一步操作
-
建立并创建控制器Controller
/** * @author Liu */ @RestController public class HelloController { @RequestMapping("hello") public String hello(){ System.out.println("hello"); return "hello"; } }
-
访问项目
项目的路径为http://localhost:8181/boot/hello
http://localhost:(配置的端口号) / (配置的项目路径) / (访问路径)
-
测试访问
这里第一个简单的hello world就搭建完成了,比传统的ssm开发简洁了不少
2.2 相关注解说明
入口类 SpringApplication
- SpringBootApplication: 全局入口类 有且只能有一个
- main 函数参数可以在启动时指定jvm参数覆盖默认配置
@SpringBootApplication 注解等价于:
- @SpringBootConfiguration 标识这是一个springboot的配置类,默认自定配置Spring环境
- @EnableAutoConfiguration 自动与项目中集成的第三方技术进行集成
- @ComponentScan 扫描入口类所在子包以及子包后代包中注解
2.3 配置文件
2.3.1 配置文件的拆分
说明: 在实际开发过程中生产环境和测试环境有可能是不一样的 因此将生产中的配置和测试中的配置拆分开,是非常必要的在springboot中也提供了配置文件拆分的方式. 这里以生产中项名名称不一致为例:
-
生产中项目名为:
boot_prod
-
开发中项目名为:
boot_dev
-
端口同时为: 8080
application.yml
#主配置文件 书写公共配置
server:
port: 8181 #自定义访问的端口号
#在主配置文件中,指定哪一个环境生效
spring:
profiles:
active: dev #指定那个环境配置生效 dev为环境配置文件的简名
application-dev.yml
#development:开发环境
server:
servlet:
context-path: /boot_dev
application-prod.yml
#product 生产环境的配置文件
server:
servlet:
context-path: /boot_prod #项目访问路径
测试路径:
2.3.2 启动指定的配置文件
说明: 往往在企业级开发过程中为SpringBoot应用启动时指定一个完整外部配置也是经常用到的,在SpringBoot中也提供这个方式来启动项目如
- 创建一个完整的配置文件
- 启动时指定配置文件位置
–spring.config.location=C:\Users\ASUS\IdeaProjects\JavaWeb\review\review\boot-01\src\main\resources\application-local.yml
3.工厂创建对象
3.1 创建单个对象
在springboot中可以管理单个对象可以直接使用spring框架中注解形式创建。
@Component
通用的对象创建注解@Controller
用来创建控制器对象@Service
用来创建业务层对象@Repository
用来创建DAO层对象- 以上注解都有value属性,value属性用来指定工厂中对象名称
3.2 创建多个对象
如何在springboot中像spring框架一样通过xml创建多个对象,在SpringBoot中也提供了相同注解如**@Configuration + @Bean
**注解进行创建
@Configuration
代表这是一个spring的配置类相当于Spring.xml配置文件@Bean
用来在工厂中创建这个@Bean注解标识的对象- 默认使用@Bean创建对象在工厂中唯一标识为方法名称
- 修改在工厂中对象标识可以在使用**@Bean(“工厂中名字”)指定一个名字**
管理复杂对象的创建
/**
* @author Liu
* SpringBoot配置类
*/
@Configuration
public class Beans {
// 复杂对象的创建
@Bean
public Calendar calendar(){
return Calendar.getInstance();
}
}
使用复杂对象还是通过@AutoWired注入属性
@SpringBootTest
class Boot01ApplicationTests {
@Autowired
private Calendar calendar;
@Test
void contextLoads() {
System.out.println("hello world");
System.out.println(calendar.getTime());
//hello world
//Mon Mar 21 13:41:30 CST 2022
}
}
-
@Configuration 用来在工厂中一次性创建多个对象
-
@Component 用来创建单个对象
4.属性注入
4.1 通过@Value 实现基本属性注入
实例:
注入基本类型、数组、日期类型、String
-
配置文件:
#基本数据类型 + string + date name: 张三 age: 21 sex: true price: 22.22 birthday: 2000/11/29 05:20:00 #spring中的日期格式为 #数组类型 array: arr1,arr2,arr3,arr4 list: list1,list2,list3,list4 map: "{'aa':'1234','bb':'2344'}"
-
测试:
@SpringBootTest
class Boot01ApplicationTests {
//基本数据类型 + string + date
@Value("${name}")
private String name;
@Value("${age}")
private Integer age;
@Value("${sex}")
private Boolean sex;
@Value("${price}")
private Double price;
@Value("${birthday}")
private Date birthday;
//数组类型
@Value("${array}")
private String[] array;
@Value("${list}")
private List<String> list;
@Value("#{${map}}")
private Map<String,String> map;
@Test
void di(){
System.out.println("基本数据类型 + string + date");
System.out.println("name = " + name);
System.out.println("age = " + age);
System.out.println("sex = " + sex);
System.out.println("price = " + price);
System.out.println("birthday = " + birthday);
System.out.println("数组类型");
System.out.println("array = ");
for (String s : array) {
System.out.println(s);
}
System.out.println("list = " + list);
System.out.println("map = " + map);
// 基本数据类型 + string + date
// name = 张三
// age = 21
// sex = true
// price = 22.22
// birthday = Wed Nov 29 05:20:00 CST 2000
// 数组类型
// array =
// arr1
// arr2
// arr3
// arr4
// list = [list1, list2, list3, list4]
// map = {aa=1234, bb=2344}
}
}
注意map集合的取值为 @Value("#{${map}}")
4.2 通过对象方式实现属性注入
注意:这种方式需要提供set方法
- 配置文件:
#对象方式注入
user:
id: 1
username: 李四
age : 23
birthday : 2020/02/02
#对象属性集合类型
users:
- {
id: 1, name: zhangsan, age: 20 ,birthday: 2000/11/16 }
- {
id: 2, name: lisi, age: 21 ,birthday: 2000/12/11 }
- {
id: 3, name: wangwu, age: 22 ,birthday: 2000/11/29 }
- 测试代码
- 注意:
- 必须提供@component
- 必须提供属性的set方法
- 修饰范围在类上,用来指定前缀的属性,注入到对象中的属性名一致的属性当中
- 可以将对象集合注入
- 注意:
@SpringBootTest
@Component //必须提供component
@ConfigurationProperties(prefix = "user") //修饰范围在类上,用来指定前缀的属性,注入到对象中的属性名一致的属性当中
@Setter//必须提供属性的set方法
public class Test1 {
private Integer id;
private String username;
private Integer age;
private Date birthday;
private List <User> users;
@Test
void test(){
System.out.println("id = " + id);
System.out.println("username = " + username);
System.out.println("age = " + age);
System.out.println("birthday = " + birthday);
users.forEach(user -> System.out.println(user));
// id = 1
// username = 李四
// age = 23
// birthday = Sun Feb 02 00:00:00 CST 2020
// User(id=1, name=zhangsan, age=20, birthday=Thu Nov 16 00:00:00 CST 2000)
// User(id=2, name=lisi, age=21, birthday=Mon Dec 11 00:00:00 CST 2000)
// User(id=3, name=wangwu, age=22, birthday=Wed Nov 29 00:00:00 CST 2000)
}
}
引入依赖构建自定义的元数据,否则idea会提示异常
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
5.JSP模板集成
5.1 步骤
jsp相关
<!--c标签库-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--让内嵌tomcat具有解析jsp功能-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
引入jsp运行插件
<build>