1、配置优先级
如果在以下三种配置下,测试他们的优先级:

同时代码测试发现:properties>yml>yaml的优先级

之后命令行参数的优先级>java系统属性优先级!

如果以上5个都存在,优先级:命令行参数>java系统属性>properties>yml>yaml
2、Bean管理

在对象中循环输出1000次对象名后发现输出的是同一个对象,这表明singleton是单例(节约资源、提升性能):

(单例就是同一个对象,非单例就是不同的对象)

相当于就是到第一次调用的时候再创建这个bean!

注意:

在对象中循环输出1000次对象名后发现输出的是不同对象,这表明prototype是非单例的
判断这个bean是有状态还是无状态取决原因:是否保存数据,如果保存数据就是有状态的bean,反之亦然。

知识点总结:

多例有状态的bean也是线程安全的!!!
第三方bean:

总结:

3、springboot原理
(1)起步依赖
Maven的依赖传递
(2)自动配置

首先第一步是在pom文件引入gson的依赖,在之前的aliyun中已经引入:

在测试类的以下文件中进行更改:

添加以下代码:
@Autowired
private Gson gson;
@Test
public void testGson(){
System.out.println(gson.toJson(Result.success("hello gson!")));
}
之后运行测试类,结果如下:

基于以上内容,引入第三方依赖
首先在以下网页中下载
并复制到项目中,引入pom文件
之后在以下文件中引入第三方依赖

<!-- 第三方工具类依赖 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>itheima-utils</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
刷新!
目前自动配置实现方案有:基于component注解的自动配置(淘汰,使用繁琐)
相当于第三方的component定义之后,在项目的启动类添加componentscan进行扫描(包含所有需要扫描的包)否则默认扫描启动类当前包及其子包

第二种方案:使用注解import实现!

(1)导入普通类:在项目启动类中直接在上面添加注解import,并在括号内添加需要引入的第三方类名,相当于这个bean注入到ioc容器中

在测试类中测试,在ioc中提取,之后控制台显示这个方法已存在!
(2)导入配置类,同样在测试类中测试,同样显示!

(3)批量导入:

普通类和配置类同时导入,需要首先在第三方将需要导入的类写好,之后在项目启动类中直接应用,最后在测试类中使用
但以上方法存在一定的局限性!
(4)在第三方中有一个注解EnableHeaderConfig,如下所示:

之后在项目启动类上只添加这个注解即可,不需要使用import进行注入:

总结:

启动类本质上也是配置类:注解springbootapplication包含以下三个注解!

对于EnableAutoConfiguration注解来说:

对于conditional注解来说:

总结:

接下来是自动配置的实践部分,根据以下三个步骤进行设置:

右键项目名称------新建模块,配置如下:


之后点击创建!
之后将建好的pom文件的版本号进行修改为3.2.10:

之后新建aliyun_spring-boot-autofigure模块:

同样的做法创建之后将springboot版本号改为3.2.10
之后需要实现在starter模块中引入autoconfigure,这样以后其他项目引入依赖只需要引入starter即可!
首先需要在starter中引入autoconfigure模块,在starter的pom文件中添加以下内容:

之后在autoconfigure中完成自动配置功能:
首先将以下阿里云oss的依赖添加到autoconfigure的pom文件中:
<!--阿里云OSS依赖-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.4</version>
</dependency>
<!--JAXB依赖,Java9以上版本需要-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
将之前项目中有关阿里云的两个工具类复制到autoconfigure中:
并在pom文件中插入以下依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
之后删除工具类中component注解,
删掉的原因:因为无法实现跨包传输,并与后面的解决方案冲突(componentscan无法扫描到,除非将所有项目放到aliyun.oss包下,但不现实)
之后点击alt+f12为aliyunOSSProperties添加一个构造函数!

之后同样删除properties中的component注解

之后在这个包下新建AliyunOssAutoconfigure:

并在新建的类前添加一个注解:Configuration
在工具类properties中有波浪线,原因如下,因此在新建的AliyunOssAutoconfigure类中添加以下注解

整体代码如下:
package com.aliyun.oss;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//AliyunOss自动配置类
@EnableConfigurationProperties(AliyunOSSProperties.class)
@Configuration
public class AliyunOssAutoConfigure {
@Bean
@ConditionalOnMissingBean
public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties aliyunOSSProperties) {
return new AliyunOSSOperator(aliyunOSSProperties);
}
}
之后在resources中新建目录:

(在创建autoconfigure时并没有resources资源文件夹,可以通过文件------项目结构------选择需要新建的项目点击------在需要新建的层级进行创建!!!)

之后再在这个目录下新建目录:spring
之后再在这个目录下新建文件(可以在外部库中查找包含spring-boot-autoconfiguration):
org.springframework.boot.autoconfigure.AutoConfiguration.imports
并在新添加的文件中添加:com.aliyun.oss.AliyunOssAutoConfigure(即autoconfiguration文件的地址!)

之后引入一个测试模块进行测试:
在以上网页下载后,在项目中导入,并在pom文件中添加以下依赖:
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-oss-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
之后在UploadController中打开:

添加以下代码,验证是否存入bean中:
@Autowired
private AliyunOSSOperator aliyunOSSOperator;
加上之后并没有爆红,代表已成功存入bean
之后在下面的文件中添加阿里云配置:

#阿里云配置
aliyun:
oss:
endpoint: https://oss-cn-beijing.aliyuncs.com
bucketName: java-ai-learn-web-oss
region : cn-beijing
之后启动测试类的启动项,并在apifox中发送请求:

结果显示成功响应!!!