spring-boot

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

  1. 配置启动引导类(判断是否有启动主类)
  2. 判断是否是Web环境,资源加载是否完成
  3. 获取初始化类、监听器类

SpringBoot流程分析-run

  1. 启动计时器(定义的一个stopwatch定时器对启动计时)

  2. 执行监听器(用的迭代器,监听所有启动的结果)

  3. 准备环境

  4. 打印banner(启动sprinboot后控制台打印一个springboot的标志):可以resource下粘贴自定义的banner

  5. 创建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

  1. 配置启动引导类(判断是否有启动主类)
  2. 判断是否是Web环境
  3. 获取初始化类、监听器类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o6xtE3H8-1681790514119)(null)]

(2) SpringBoot流程分析-run

  1. 启动计时器

  2. 执行监听器

  3. 准备环境

  4. 打印banner(启动sprinboot后控制台打印一个springboot的标志):可以resource下粘贴自定义的banner

  5. 创建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就可运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值