springboot
@SpringBootApplication(自动配置,本身也是个配置类的bean,自动扫包主启动类平级和其子类下的内容)
springboot和ssm的区别:
自动配置:xml配置的太繁琐,约定优于配置:将spring的依赖,jar包引进来就可以直接使用
还有一些功能的增强:使工程更加健壮的安全检测。
注解的作用:扫包,作为切面对类和方法等的增强,传递(import())
springboot的自动装配:
本身是一个容器,项目一启动引入的依赖就被加载,依赖相关的bean都注入容器,它是通过@EnableAutoConfiguration 注解开启了自动配置的功能,随后用@Import(AutoConfigurationImportSelector.class)注解将boot中的一些配置类加载到META-INF/spring.factories内。但此时还厄密完成bean的初始化,之后根据condition注解来加载满足条件的Bean(满足条件:引入了该bean的类的依赖)就完成了bean的初始化。
- @EnableAutoConfiguration 注解开启了自动配置的功能,内部使用 @Import(AutoConfigurationImportSelector.class)来加载配置类。
- 配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,当 SpringBoot 应用启动时,会自动加载这些配置类,初始化Bean
- 并不是所有的Bean都会被初始化,在配置类中使用Condition来加载满足条件的Bean
springboot的启动流程:
SpringBoot流程分析-初始化new
- 配置启动引导类(判断是否有启动主类)
- 判断是否是Web环境,资源加载是否完成
- 获取初始化类、监听器类
SpringBoot流程分析-run
-
启动计时器(定义的一个stopwatch定时器对启动计时)
-
执行监听器(用的迭代器,监听所有启动的结果)
-
准备环境
-
打印banner(启动sprinboot后控制台打印一个springboot的标志):可以resource下粘贴自定义的banner
-
创建context
refreshContext(context);
执行refreshContext方法后才真正创建Bean(refreshContext():new 所有成功的可初始化到容器的bean)
一 . 概述:
1 . 构建springBoot工程:
创建maven:引入父工程springboot依赖:随后在依赖中引入web的依赖
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SqC6J75V-1681790513420)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221221170508261.png)]
<!--springboot工程需要继承的父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
</parent>
<dependencies>
<!--web开发的起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
创建主启动类:run(HelloApplication.class,args)运行HelloApplication类 ,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NxC0nVJb-1681790513421)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221221170544050.png)]
@SpringBootApplication //表示这个类是springboot的一个主启动类
public class HelloApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(HelloApplication.class, args);
}
}
随后我们建立一个controller:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8vto2cgX-1681790513421)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221221171044897.png)]
随后我们运行后主启动类的main方法后,我们看见已经启动了tomcat且在8080端口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b1wNs5aq-1681790513422)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221221171131648.png)]
我们再浏览器:输入请求:http://localhost:8080/hello/test显示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H6YxfUZN-1681790513422)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221221171145694.png)]
总结:
1启动springboot一个web工程
1pom 规定父工程,导入web的起步依赖
2主启动类 @SpringBootApplication、main
3业务逻辑 controller,service,dao
- SpringBoot在创建项目时,使用jar的打包方式。 java -jar xxx.jar
- SpringBoot的引导类,是项目入口,运行main方法就可以启动项目。
- 使用SpringBoot和Spring构建的项目,业务代码编写方式完全一样。
2 . 快速构建springboot工程:
上述操作可以更加简便:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1jNjq6Cc-1681790513422)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670143201392.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e23qIC58-1681790513423)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670147420425.png)]
随后我们创建controller:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XKSVpjSx-1681790513423)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670147451738.png)]
启动后输入请求:http://localhost:8080/hello/test
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QXvAYt9P-1681790513423)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670147504782.png)]
我们创建一个.yml文件可以在该文件内修改默认端口为8081:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ik8KKwJj-1681790513424)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670149629683.png)]
重启后,输入请求http://localhost:8081/hello/test:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QgpRlNbu-1681790513424)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670149656634.png)]
同理.properties与.yml与.yaml文件相同的。但是.properties文件优先级最高,.yml的优先级大于.yaml文件。
.yml和.yaml使用格式相同的,但.properties文件的使用格式:是等于号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qtt0Nj7M-1681790513424)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670149794357.png)]
在现实生产中大多用的.yml文件。
3 . yml的语法格式:
严格区分大小写。
数值前必须有空格作为分隔符[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mktJMtP3-1681790513424)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670150351187.png)]
如果不空格则为错误白色:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dzz4lphe-1681790513425)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670150414307.png)]
如上,有缩进。
4 . yml数据格式:
定义对象:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8JOQyNxA-1681790513425)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670151585665.png)]
数组:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SNqHJypz-1681790513425)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670151569352.png)]
纯量:单个的、不可再分的值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JHwx8SNF-1681790513426)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670151685864.png)]
参数引用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rfMZqE76-1681790513426)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670162086460.png)]
5 . 设置完数据后,获取数据:
(1)@Value(“${}”)常用
已知yml的数据设置完成:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wl0l6l7g-1681790513426)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670162787770.png)]
获取数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H2F0eXdM-1681790513426)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670162839082.png)]
运行后输入请求:http://localhost:8080/hello/test显示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9j9ScnNL-1681790513427)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670162862694.png)]
后台控制台:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ge1rwE5l-1681790513427)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670162889124.png)]
(2)@Autowired :(不常用)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AlOxYQlz-1681790513427)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670164185297.png)]
(3)@ConfigurationProperties:(不常用)
已知yml配置数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q4VLBu2L-1681790513428)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670166910538.png)]
对应类:(prexfix必须要写):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zh2u85Zh-1681790513428)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670166967100.png)]
获取值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lMkjgcaY-1681790513428)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670167106805.png)]
6 . 多环境配置:
(1)配置多种环境:active来激活要使用的环境(不常用)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vN5Lc1fx-1681790513428)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670169089103.png)]
如果大型项目,那么就要写特别多,到时候看着眼睛都看花了,也不方便查找。
(2)配置多种环境:
在独立的文件上配置一个环境:三个文件配置三种环境:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QqyX298G-1681790513429)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670218724375.png)]
在主配置文件上选定使用哪个环境的配置:选择test的配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E061na2i-1681790513429)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670218762549.png)]
运行后:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KH3YC9lE-1681790513429)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670218797341.png)]
7 . 内部配置文件顺序:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-56fM3fUI-1681790513429)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670222323523.png)]
classpath:/config/:
在config的配置文件的优先级高于外面的application.yml。所以config的application.yml的配置生效
在当前项目的根目录:
我们把application.yml配置为8083
放到当前父工程根目录下,此时该配置文件优先级高于在子工程config中的配置文件,运行后,首先生效的该配置文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hUWTLHts-1681790513430)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670222574196.png)]
同理:
如果我们在父工程下建立config的文件夹,将该配置文件放到config下,此时该配置文件优先级更高。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HNZ4QLgW-1681790513430)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670224193142.png)]
8 . 整合框架 (重要)
(1)整合junit:
已知父工程依赖:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Z1Mx8Wt-1681790513430)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670226141911.png)]
子工程依赖:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oRGOTrr4-1681790513430)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670226176763.png)]
子工程建立启动springboot启动类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZN7eHiJq-1681790513431)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670226227256.png)]
service下的类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TGs1lUqr-1681790513431)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670226246391.png)]
建立测试类测试:
从spring容器拿到测试类的bean,并将junit的框架整合
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yJYtHufj-1681790513431)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221221202359911.png)]
运行测试类后显示:如下,说明成功整合了junit框架:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-khuCixl5-1681790513431)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670226336302.png)]
(2)整合mybatis(重要):
子工程引入依赖:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dtrGyltK-1681790513432)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221221202626479.png)]
实体类:
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
对应配置yml连接数据库表:
# datasource
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/springboot?serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
数据库建表:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eZ2VjIwT-1681790513432)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221221202955927.png)]
创建测试类连接数据库,
通过mybatis注解的方式查询表中数据:
创建mapper接口:
@Mapper//这是mybatis的一个mapper,启动后容器中就有了这个usermapper
public interface UserMapper {
@Select("select * from user")
public List<User> findAll();
}
创建测试类:
@SpringBootTest(classes = SpringbootDemo1Application.class)
@RunWith(SpringRunner.class)
public class MybatisTest {
@Autowired
UserMapper userMapper;
@Test
public void testFindAllByXml() {
List<User> all = userMapper.findAll();
System.out.println(all);
}
}
测试运行后:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FS67P6oP-1681790513432)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20230113181732128.png)]
⑥xml开发 新建接口
@Mapper
public interface UserXmlMapper {
public List<User> findAll();
}
对应xml:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-etk0vjvm-1681790513433)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20230113182100202.png)]
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cgboy.springbootdemo1.mapper.UserXmlMapper">
<select id="findAll" resultType="com.cgboy.springbootdemo1.domain.User">
select * from user
</select>
</mapper>
主配置扫包:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ef3ek6GF-1681790513433)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222101104453.png)]
测试:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KTy4t7d0-1681790513433)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222100118510.png)]
(3)整合redis:(重要)
引入子工程依赖“:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
开启windows的redis服务器:输入cmd进入
输入指令:redis-server.exe redis.windows.conf开启服务器:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VPNOb5oP-1681790513433)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222102643622.png)]
设置springboot主启动类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4VOcmPhd-1681790513434)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222102330302.png)]
设置redis端口ip:上面的是默认的不写也可:
测试,现在redis设置值,随后测试拿到值:
@SpringBootTest
class SpringbootRedisApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void testSet() {
redisTemplate.boundValueOps("name").set("zhangsan");
}
@Test
void testGet() {
Object name = redisTemplate.boundValueOps("name").get();
System.out.println(name);
}
}
二 . 进阶部分
1 . @Conditional注解:
已知user类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZOw1JkSA-1681790513434)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670333269245.png)]
user的配置类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CSKyEwUa-1681790513434)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670333340934.png)]
配置bean是否生成的类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1i53I9Iq-1681790513434)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670333301804.png)]
在主启动类拿到user对象:
因为我们的判断方法返回的true,则user的bean对象能够创建,拿到了bean对象,如果为false则不能创建bean对象:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LOs3y72I-1681790513435)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670333448326.png)]
(1)Condition的使用:
引入jedis的依赖:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Db4aJeYk-1681790513435)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670336602133.png)]
User的配置类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pGbuKF3C-1681790513435)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670336809997.png)]
Condition判断配置User的bean是否生成的类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hlJUjIkr-1681790513435)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670336645895.png)]
运行主启动类:拿到bean
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aTi7gHaP-1681790513436)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670336680696.png)]
如果我们把引入依赖删除,则没有jedis了,condition就拿不到jedis就为false,也就不创建user的bean了。
(2)Condition高级使用:
建立一个注解:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2fYwdyeG-1681790513436)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670375922893.png)]
condition实现类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W9WRDZUw-1681790513436)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670376301143.png)]
user配置类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SN7zvgVg-1681790513437)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670376328913.png)]
主启动类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LqN8lpNo-1681790513437)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670376345794.png)]
因为我们引入了jedis依赖,运行后拿到了userbean对象。
上述只是简单解释下springboot框架如何给我们创建bean的,其实都不用我们自己写,简单了解下原理。
如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-szpTS1h3-1681790513437)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670377311248.png)]
配置文件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bL9DyHmU-1681790513437)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670378596389.png)]
运行主启动类后也能拿到user的bean。
2 . 切换内置web服务器:
面试问题:为甚恶魔引入了starter-data-redis,我们就能在项目中直接拿redistemplate?****
springboot中的autoconfig工程里把常用的对象的配置类都有了,只要工程中,引入了相关起步依赖,这些对象在我们本项目的容器中就有了。
设置两个springboot工程:enable和enableother:
在enableother中:
user类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xMuoqIDg-1681790513438)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670382450394.png)]
配置类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uyeL3WhG-1681790513438)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670382463303.png)]
将enableother的引来引入到enable的工程中:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-li0VpOyC-1681790513438)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670383323445.png)]
随后在enable主启动类:运行后拿不到user的bean
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WS8i9qUF-1681790513438)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670383363998.png)]
引入了依赖,也就拥有了enableother工程的内容,可是运行确实没有拿到user的bean,这是因为@SpringBootApplication注解只能扫到本包和子包下的内容,你引入的依赖都不是在该范围的所以没找到。
(1)使用@Import注解:
导入配置类:
在enable工程引入enableother工程依赖后,使用@import指定引入目标类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-miCQlHRM-1681790513439)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670386309635.png)]
运行后拿到user的bean
但这样也不简便,通常是让第三方自定好注解,我们直接使用即可,如下:
已知配置类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gHkPblMk-1681790513439)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670386440425.png)]
自定义注解:在该注解内制定了目标配置类:(如果有多个就多写几个import)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5JBKOkCW-1681790513439)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670386575235.png)]
随后在enable工程引入enableother工程后:在主启动类:使用该自定义注解:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2MmOXNrz-1681790513439)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670386693228.png)]
运行后也能拿到user的bean
导入Bean:
我们把第三方工程所有的配置都注解掉,只留一个user类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mu1gVB8n-1681790513440)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670388118777.png)]
随后当前工程引入第三方工程依赖后,直接引入该类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SI2dDYOk-1681790513440)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670387888902.png)]
导入ImportSelector实现类:
已知引入的第三方工程只有user和role两个类:
创建ImportSelector实现类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CHIb3KvY-1681790513440)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670389670200.png)]
主启动类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A5oXkPzC-1681790513440)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670389691720.png)]
运行后也能拿到bean:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9zhTiJ0l-1681790513441)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670389719662.png)]
导入ImportBeanDefinitionRegistar实现类:
创建实现类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-He2BahYG-1681790513441)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670390042785.png)]
主启动类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GMd1ciT1-1681790513441)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670390098899.png)]
面试常问:springboot自动配置原理?
- @EnableAutoConfiguration 注解内部使用 @Import(AutoConfigurationImportSelector.class)来加载配置类。
- 配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,当 SpringBoot 应用启动时,会自动加载这些配置类,初始化Bean
- 并不是所有的Bean都会被初始化,在配置类中使用Condition来加载满足条件的Bean
3 . 事件监听:
ApplicationRunner:
监听到项目启动后就会执行:我们可以在这个阶段进行额外的操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LJvoAgoo-1681790513441)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670402042632.png)]
运行后:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BZqVcU9b-1681790513442)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670402066162.png)]
CommandLineRunner:
监听到项目启动后就会执行:我们可以在这个阶段进行额外的操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CA5ygE0o-1681790513442)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670402396537.png)]
运行后后:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YZW1mcOn-1681790513442)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670402425882.png)]
ApplicationContextInitializer:
在项目启动前执行该操作:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7OL4sJAj-1681790513443)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670403608537.png)]
MyApplicationContextInitializer的使用要在resource文件夹下添加META-INF/spring.factories:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7iKGWvIa-1681790513443)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670403585283.png)]
主启动类运行后:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qgq4hl3f-1681790513443)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670403632984.png)]
SpringApplicationRunListener:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vVrXlJm3-1681790513443)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670404136898.png)]
SpringApplicationRunListener的使用要在resource文件夹下添加META-INF/spring.factories:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i0SiBjIn-1681790513444)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670404168934.png)]
运行后:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0PFacG0p-1681790513444)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670404375610.png)]
4 . springboot启动流程 (面试 必须会,重点)
(1) SpringBoot流程分析-初始化new
- 配置启动引导类(判断是否有启动主类)
- 判断是否是Web环境
- 获取初始化类、监听器类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o6xtE3H8-1681790514119)(null)]
(2) SpringBoot流程分析-run
-
启动计时器
-
执行监听器
-
准备环境
-
打印banner(启动sprinboot后控制台打印一个springboot的标志):可以resource下粘贴自定义的banner
-
创建context
refreshContext(context);
执行refreshContext方法后才真正创建Bean
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eN7SzlZX-1681790514094)(null)]
5 .监控客户端:
创建服务端:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mxEq73Sk-1681790513445)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670467006193.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-etoQWSQv-1681790513445)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670467043062.png)]
配置服务端相关端口:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b6tCfVMB-1681790513445)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670467291265.png)]
随后建立客户端:且引入了web框架
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AsxqI2Wl-1681790513446)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670467108178.png)]
在客户端写一个controller:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gThwjj7w-1681790513446)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670467178593.png)]
③配置相关信息:server地址等
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XsNXL0Jx-1681790513446)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670467225408.png)]
开启客户端:运行主启动类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pHO8kRON-1681790513446)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670467377152.png)]
前端发送请求http://localhost:8080/hello后显示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MCs8JGsN-1681790513447)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670467405759.png)]
我们开启服务端:启动主启动类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oy4q3qTb-1681790513447)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670467446811.png)]
我们在浏览器输入请求:http://localhost:9000/
显示出服务端对客户端的监控信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-StEkBw8l-1681790513447)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670467538306.png)]
6 . 打包上线:
我们对客户端进行package打包:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ei88QNIt-1681790513447)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670469538550.png)]
随后在target找到打包好的jar包:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tHPKTSJ2-1681790513448)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670469564848.png)]
随后如果运维需要,我们先建一个文件夹:将打包好的jar包复制一份到该文件内,且将该工程相关的配置文件也复制一份到该文件。最后将这文件交给运维即可。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DIWGFUIu-1681790513448)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670469693557.png)]
中…(img-b6tCfVMB-1681790513445)]
随后建立客户端:且引入了web框架
[外链图片转存中…(img-AsxqI2Wl-1681790513446)]
在客户端写一个controller:
[外链图片转存中…(img-gThwjj7w-1681790513446)]
③配置相关信息:server地址等
[外链图片转存中…(img-XsNXL0Jx-1681790513446)]
开启客户端:运行主启动类:
[外链图片转存中…(img-pHO8kRON-1681790513446)]
前端发送请求http://localhost:8080/hello后显示:
[外链图片转存中…(img-MCs8JGsN-1681790513447)]
我们开启服务端:启动主启动类:
[外链图片转存中…(img-oy4q3qTb-1681790513447)]
我们在浏览器输入请求:http://localhost:9000/
显示出服务端对客户端的监控信息:
[外链图片转存中…(img-StEkBw8l-1681790513447)]
6 . 打包上线:
我们对客户端进行package打包:
[外链图片转存中…(img-ei88QNIt-1681790513447)]
随后在target找到打包好的jar包:
[外链图片转存中…(img-tHPKTSJ2-1681790513448)]
随后如果运维需要,我们先建一个文件夹:将打包好的jar包复制一份到该文件内,且将该工程相关的配置文件也复制一份到该文件。最后将这文件交给运维即可。
[外链图片转存中…(img-DIWGFUIu-1681790513448)]
运维在对应环境将该文件输入java -jar就可运行。