🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿
🍟欢迎来到老胡的博文,本文主要讲解的是SpringBoot的基础知识,通过这篇博文,希望你有所收益!🍟
🍕我是老胡,一个正在为秋招准备的学弟🍕🥞喜欢的朋友可以关注一下,下次更新不迷路🥞
文章目录
初识SpringBoot
SpringBoot底层是Spring Framework,SpringBoot是整合Spring技术栈的一站式框架,是简化技术栈的快速开发脚手架.
SpringBoot优点:
创建独立的Spring应用
自动starter依赖,简化构建依赖
内嵌web服务器
自动配置Spring以及第三方功能
提供生产级别的监控,健康检查以及外部化配置
无代码生成,无需编写xml
SpringBoot缺点
版本迭代快
封装太深,内部原理复杂,不容易精通.
helloworld
导入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
主程序
package com.h.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author
* @Date 2022/4/11 15:59
* @Version 1.8 (版本号)
*/
//告诉springboot这是一个springboot应用
//标注SpringBootApplication的是主程序类,是启动的入口
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class,args);
}
}
业务逻辑层
package com.h.boot.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author
* @Date 2022/4/11 16:05
* @Version 1.8 (版本号)
*/
//相当于@ResponseBody和@Controller
@RestController
public class HelloController {
@RequestMapping("/hello")
public String handel1(){
return "helloworld";
}
}
简化配置
创建一个配置文件直接在文件中修改配置即可.
简化部署
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
把项目打成jar包,直接在目标服务器执行即可
依赖管理
引入依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
引入依赖的父项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
在他的父项目中,几乎声明了开发中常用的版本号
自动仲裁
引入的依赖可以不关注 版本号(前提是springboot依赖的父项目中存在该依赖)
如果不存在,则需要写版本号.
场景启动器
spring-boot-starter-* , *就某种场景,且场景需要我们自动引入.
场景启动器最底层依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.4.RELEASE</version>
<scope>compile</scope>
</dependency>
自动配置
通过引入spring-boot-starter-parent,自动引入Tomcat依赖,并配置好了Tomcat,自动引入SpringMVC全套组件并配置好了常用组件
SpringBoot帮我们配置好了所有web开发的常见场景,主程序所在的包和子包都会被默认扫描,不需要配置之前的包扫描,引入了的场景自动配置才会开启
默认配置最终都是映射到某一个类上,配置文件的值会绑定上某个类上,这个类会在容器中创建对象并按照需求加载所有的自动配置项.
容器功能
组件添加
只有容器中的组件,才可以拥有SpringBoot提供的强大功能
方式一
@Configuration基本使用
package com.h.boot.config;
import com.h.boot.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author
* @Date 2022/4/11 18:39
* @Version 1.8 (版本号)
*/
// 告诉springBoot这是一个配置类
// 配置类本身也是一个组件
// proxyBeanMethods:代理bean的方法
// 这两个模式SpringBoot2新增的
// Full(proxyBeanMethods = true)模式保证每个@Bean方法被调用多次返回的组件都是单实例
// Lite(proxyBeanMethods = false)模式保证调用多少次返回的组件都是新创建的
// 组件依赖必须使用Full模式默认。其他默认是否Lite模式
@Configuration(proxyBeanMethods = false)
public class MyConfig {
// 给容器添加组件,以方法名作为组件的id,返回类型作为组件类型,返回的值就是组件在容器中的实列
// 默认单实例
@Bean
public User user1(){
return new User(12,"tom");
}
}
主程序类测试
package com.h.boot;
import com.h.boot.bean.User;
import com.h.boot.config.MyConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
/**
* @Author 胡俊伟
* @Date 2022/4/11 15:59 (可以根据需要修改)
* @Version 1.8 (版本号)
*/
// 告诉springboot这是一个springboot应用
// 标注SpringBootApplication的是主程序类,是启动的入口
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
// 返回我们IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
// 返回容器组件
String[] names = run.getBeanDefinitionNames();
// 查看容器里面的组件
for (String name:names){
System.out.println(name);
}
// 从容器中获取组件
User user = run.getBean("user1",User.class);
User user1 = run.getBean("user1",User.class);
System.out.println(user==user1);
MyConfig bean = run.getBean(MyConfig.class);
System.out.println(bean);
}
}
方式二
使用之前的@Bean @Component @Controller Service @Repository
方式三
@ComponentScan和@Import
// import 将对应组件导入进去,可以自动的给容器中创建出类型组件
@Import({User.class})
方式四
@Conditional
条件装配,满足条件注入
@ConditionalOnBean(name = "user")
@ConditionalOnMissingBean(name = "tom")
原生配置文件引入
@ImportResource
允许我们用之前的原生文件
@ImportResource("classpath:beans.xml")
配置绑定
使用java读取配置文件properties中的内容,并将他封装到javaBean中
方式一
@ConfigurationProperties
@ConfigurationProperties(prefix = "user")
方式二
@Component + @ConfigurationProperties
//标注一个类为Spring容器的Bean
@Component
//开启属性配置功能,将组件自动注入容器中
@ConfigurationProperties(User.class)
自动配置原理
加载自动配置类
@SpringBootApplication
等价于
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
@SpringBootConfiguration
代表当前类是一个配置类
@EnableAutoConfiguration
等价于
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
@AutoConfigurationPackage
自动配置,给容器中导入一系列组件
将MainApplication所在包下的所有组件扫描进来
@Import(AutoConfigurationImportSelector.class)
1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2、调用List configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map<String, List> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
4、从META-INF/spring.factories位置来加载一个文件。
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META- INF/spring.factories
@ComponentScan
指定要扫描的内容
补充:SpringBoot加载所有的自动配置类
按需求开启自动配置项
虽然127场景自动配置,启动时默认全部加载,但是使用的时候按照需求开启自动配置项.
每个自动配置类按照条件进行生效,默认绑定配置文件给定的值
生效的配置类就会给容器中装配组件
修改配置类
@Bean
@ConditionalOnBean(MultipartResolver.class) //容器中有这个类型组件
@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) //容器中没有这个名字 multipartResolver 的组件
public MultipartResolver multipartResolver(MultipartResolver resolver) {
//给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。
//SpringMVC multipartResolver。防止有些用户配置的文件上传解析器不符合规范
// Detect if the user has created a MultipartResolver but named it incorrectly
return resolver;
}
给容器中加入了文件上传解析器;
SpringBoot默认开启所有组件,但是用户配置的优先
@Bean
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() { }
只要用户有自己配置的,用户优先
用户直接自己@Bean替换底层的组件
用户去看这个组件是获取的配置文件什么值就去修改。
查看自动配置了哪些:
配置文件中debug=true开启自动配置报告。Negative(不生效)或Positive(生效)
开发技巧
Lombok
简化JavaBean开发(2021的idea自带,之前版本需要安装lombok插件)
//引入插件
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
@Data
@ToString
//全参构造器
@AllArgsConstructor
//无参构造器
@NoArgsConstructor
//重写equals和hashcode
@EqualsAndHashCode
//注入日志功能
@Log4j
dev-tools
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
热更新(ctrl+F9)
Spring Initailizr
项目初始化向导
创建项目时勾选后会创建号对应的项目结构,引入相应依赖