Spring Boot能快速创建出生产级别的Spring应用,使spring开发变得简单,无需编写各种配置。
Spring Boot是整合Spring技术栈的一站式框架。
Spring Boot是简化Spring技术栈的快速开发脚手架。
Spring Boot优点:
创建独立的Spring应用。内嵌web服务器。自动stater依赖,简化构建配置。自动配置Spring以及第三方功能。提供生产级别的监控,健康检测以及外部化配置。无代码生成,无需编写XML。
Spring Boot缺点:
人称版本帝,迭代快,需要时刻注意变化。封装太深,内部原理复杂,不容易精通。
创建Spring Boot项目
1.快速新建Spring Boot,注意联网
2.创建maven项目,在pom中导入一个父工程
![](https://img-blog.csdnimg.cn/238e0eb0a511429fbd88790f44ae131d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYm9zc1_nvqHnjpY=,size_20,color_FFFFFF,t_70,g_se,x_16)
SpringBoot要集成SpringMvc进行Controller的开发, 所以项目要导入web的启动依赖
![](https://img-blog.csdnimg.cn/d4d5e065c89549d9ba381c59b315c06f.png)
接下来编写一个启动类,在类上标注注解SpringBootApplication,启动类默认扫描配置类的包底下的子包及其所有类
package com.springboot;
import com.springboot.config.MyConfig;
import com.springboot.domain.cat;
import com.springboot.domain.pepole;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
//这是一个Spring Boot应用
public class MySpringBootApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(MySpringBootApplication.class, args);
}
}
在controller中,如果想让当前方法返回字符串,不再拼接视图,需要在方法上添加注解@ResponseBody。
如果想让当前controller中所有方法均返回字符串,那么在controller上的注解就可以是@RestController,不再是@Controller
简化配置
Spring Boot把所有配置都固定在application.properties里,文件名是固定写法(后缀properties,yml,yaml)。
在修改配置之前的运行信息
![](https://img-blog.csdnimg.cn/600eb6468d43499788501023e0508917.png)
可以看到端口号为8080,项目名为''。
创建application.yml,规定端口号为9999,项目名为sboot(需要注意项目名前一定要加上"/"不然会报错)
![](https://img-blog.csdnimg.cn/04798f87eb724b32b3cc4a7363ded0a7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYm9zc1_nvqHnjpY=,size_20,color_FFFFFF,t_70,g_se,x_16)
修改后运行消息
![](https://img-blog.csdnimg.cn/2b0c7e6a24194c7f8ae6861aede25302.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYm9zc1_nvqHnjpY=,size_20,color_FFFFFF,t_70,g_se,x_16)
可以看到端口号更改为9999,项目名也更改了。
打包
当前项目还没有打包方式,默认为jar包,创建一个可执行的jar包,只要引入了 Spring Boot 的 maven 插件,就可以将项目自动打包成一个可执行的 jar 包
<!-- 打包插件 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
点击右侧 maven,将我们的项目 clean、package 运行一下
![](https://img-blog.csdnimg.cn/0b958cfa6dff49b7a470246474238736.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYm9zc1_nvqHnjpY=,size_20,color_FFFFFF,t_70,g_se,x_16)
进入jar包目录打开cmd,在此目录下输入java -jar xxxxxx.jar运行jar包。
父项目做依赖管理
每个Spring Boot应用都有一个父工程,子项目会继承父项目中的依赖,子项目在使用父项目中的依赖时,就不用指定版本号了。如果想用插件的某些版本也是可以指定的。
开发导入stater场景启动器
在项目中,无需关注各种依赖,只需要导入一个场景启动器(一组依赖的集合描述)即可。
自动配置特性
自动配置好了tomcat,SpringMvc
当我们引入了 web 包后,我们的 tomcat 场景启动器,webmvc 就被 引入了,我们开发 web 的所有 jar 包就被引入了。
自动配置好了web功能,例如字符编码
包结构
只要是主程序所在包及其子包都可以被扫描到。如果无需包结构配置,那么可以在启动类上添加注解@ComponentScans("com.spb")或者@ComponentScans(@ComponentScan("com.spb")),这样会扫描spb包下所有类。注意:添加的扫描包不能为与启动类同级,与@SpringBootApplication冲突
按需加载所有自动配置项
只有导入当前场景的启动器,当前场景的自动配置 类才会生效 这就是按需加载我们所用到的场景下的所有依赖
底层注解
Spring Boot可以编写配置类来添加组件,这个类就等同于xml配置文件
//告诉Spring Boot这是一个配置类
@configuration
public class MyConfig {
/**
Bean的作用就是给容器中添加组件,
以方法名作为组件id,也可以在Bean中自定义id
返回值类型就是组件类型,
返回值就是在容器中保存的实例
*/
@Bean
public cat cat() {
cat cat = new cat("猫", "吃", moues());
return cat;
}
@Bean
public moues moues() {
moues moues = new moues("老鼠");
return moues;
}
}
Spring Boot基于5.2以后,多了一个属性proxyBeanMethods默认为true,直译就是代理bean的方法
Spring Boot 在底层 @Configuration 的两个配置
![](https://img-blog.csdnimg.cn/25a6badd205f4c51b2dcfb7c68b42622.png)
Full(全配置):proxyBeanMethods = true * 容器中会保存一个配置类的代理对象,每次调用配置类方法,都会去容器中来获取我们具体的 * 组件对象 *
Lite(轻量级配置):proxyBeanMethods = false * 容器中不会保存配置类的代理对象,每次调用配置类方法,都会重新创建一个新的对象。
需要注意的是当两个类中有引用关系时,必须为单例
springboot轻量级优点:会跳过检查容器中有没有该组件,加快项目运行速度 * 如果是全模式,外部调用方法,springboot都会来检查容器中的对象,消耗项目运行时间
除了编写配置类来注册组件,还可以使用原先的注解,将组件注册到IOC中,比如:@Compontent、@controller、@Service、@Repository
此外还有一种给容器添加组件@Import
@Import注解需要添加到容器中的组件的类上,比如Controller,Service,Repository,Component,Configuration,还有主配置类等
它有一个 value 属性,值为数组,也就是说我们可以导入非常多的组件,只要我们将这些组件放到数组 中就可以
![](https://img-blog.csdnimg.cn/75d179a8801e4626b185bf4fd5d44afa.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYm9zc1_nvqHnjpY=,size_20,color_FFFFFF,t_70,g_se,x_16)
条件装配-@Conditional
@ConditionalOnBean(name = "moues")如果容器中由moues组件则进行注入该组件@ConditionalOnMissingBean(name = "weicunzai")不存在该组件进行注入
解析顺序
在 spring ioc 的过程中,优先解析 @Component,@Service,@Controller 注解的类。其次解析配置 类,也就是 @Configuration 标注的类。最后开始解析配置类中定义的 bean 。
导入自定义配置文件中的资源-@ImportResource
项目中自定义的配置文件(beans.xml)中定义组件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--普通方式注入容器,直接写不会扫描-->
<bean id="cattt" class="com.springboot.domain.cat">
<property name="name" value="小猫"/>
<property name="eat" value="吃"/>
<property name="moues" ref="moues"/>
</bean>
</beans>
让该xml生效需要在配置类上添加注解@ImportResource("classpath:xxxx.xml"),这样容器中就有了该xml文件中的bean
绑定配置-@ConfigurationProperties
在项目中将经常变化的东西编写到配置文件中,例如数据库信息。那么将配置文件中的数据信息封装到实体对象中,就只需要在类中添加一个注解@ConfigurationProperties
配置文件中声明属性
![](https://img-blog.csdnimg.cn/5147d1338e494018a368a0afa607ec4c.png)
那么对应的实体类就必须注册到容器中,并且实体类属性名和配置文件中属性名必须一致
package com.springboot.domain;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "peo")
public class pepole {
private String name;
private String addres;
public pepole() {
}
public pepole(String name, String addres) {
this.name = name;
this.addres = addres;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddres() {
return addres;
}
public void setAddres(String addres) {
this.addres = addres;
}
@Override
public String toString() {
return "pepole{" +
"name='" + name + '\'' +
", addres='" + addres + '\'' +
'}';
}
}
此外还有一种方式可以使配置文件中属性绑定到实体类中@EnableConfigurationProperties(xxx.class)
首先将实体类从组件中移除,并在配置类上方开启实体类的配置绑定功能
![](https://img-blog.csdnimg.cn/0c18d5fc1cc34f86b2328d551f2dcd7e.png)
@Order
![](https://img-blog.csdnimg.cn/6e1de81e87b34764bf419e2f3b2ff35b.png)
简单实践
Lombok
在之前的开发中,实体类中的属性封装后,必须向外界提供setter/getter方法,有参,无参构造等,但Lombok就大大简化了这些写法
在项目中引入lombok依赖
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
只是引入依赖还不够,需要在插件市场下载插件
file->settings->plugins,然后搜索Lombok
那么实体类就只需要添加注解
@Data就有了setter/getter方法
@ToString会在编译时生成toString方法
@AllArgsConstructor全参构造
@NoArgsConstructor无参构造
@EqualsAndHashCode重写equals和hashCode方法
@Slf4j打印日志,它会自动为当前类注入一个log属性,在方法中使用log.info("xxxxxxx");
热部署
在每次修改完页面或者java代码,都需要关掉项目,重启进行测试,较为麻烦。devtools使得不用重启就可以更新代码进行测试
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
在编写新的代码后ctrl+f9重新编译即可
配置文件用法
基本用法
key: value;kv之间有空格
大小写敏感 使用缩进表示层级关系
缩进不允许使用 tab,只允许空格
相同层级的元素左对齐即可
'#' 表示注释
数据类型
单个的date、boolean、string、number、null
k: v
对象:键值对的集合map、hash、set、object
#行内写法
k: {k1:v1,k2:v2,k3,v3}
#多行写法
k:
k1: v1
k2: v2
k3: v3
数组:一组按次序排列的值array、list、queue
#行内写法
k: [v1,v2,v3]
#多行写法
k:
-v1
-v2
-v3