自动化配置原理
一、起步依赖
本质上就是一个jar包,在内部已经封装了当前环境需要的依赖们,且已经解决了版本冲突问题
原理上使用的是就是Maven的依赖传递
二、自动配置
目的
为了让你看得懂源码
分析源码
1、引导类注解:@SpringBootApplication
2、复合注解
3、@SpringBootConfiguration
底层就是@Configuration注解,表示当前引导类也是一个配置类,可以在内部定义bean
4、@ComponentScan
表示当前引导类所在的包会被进行组件扫描
5、@EnableAutoConfiguration
底层使用了一个@Import(AutoConfigurationImportSelector.class)
实际上就是导入了 AutoConfigurationImportSelector 一个配置类,会自动执行 selectImports 方法。selectImports 这个方法的作用就是获取要创建的bean的全类名列表,封装成一个数组
6、结合 Condtional开头的注解
是否满足这些条件,如果满足,才会被加载到Spring容器中
@ConditionalOnClass:判断环境中有对应字节码文件,才注册bean到IOC容器。
@ConditionalOnMissingBean:判断环境中没有对应的bean(类型或名称),才注册bean到IOC容器。
@ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器。
核心
1、主要是引导类的一个核心注解:@SpringBootApplication
2、它是一个复合注解,由三个注解组成
@SpringBootConfiguration
底层就是@Configuration注解,表示当前引导类也是一个配置类,可以在内部定义bean
@ComponentScan
表示当前引导类所在的包会被进行组件扫描
@EnableAutoConfiguration
主要就是注解实现了自动化配置
底层使用了一个@Import(AutoConfigurationImportSelector.class)
这个类会自动去执行会自动执行 selectImports 方法。这个方法最终会调用一个叫SpringFactoriesLoader的loadFacotryNames方法。这个方法会加载 autoconfiguration 包下的META-INF目录下spring.factories文件中的所有的数据,将其所有的值封装成一个字符串数组。
最终Spring容器会根据起步依赖以及@Conditional相关注解进行过滤,将满足条件的字符串数组内部封装的全类名通过反射的方式创建对象并注入到容器中
三、自定义starter
1、分析以前使用oss的步骤
1、导入依赖
2、抽取一个配置类,用于读取配置文件中阿里云oss的信息
3、创建一个工具类,类上注入了一个配置类,并且提供了一个上传文件的方法
1、需求
封装一个 aliyun-oss-boot-starter
3、思路
参考第三方集成springboot封装的starter,定义一个自己的starter
xxx-boot-autoconfiguration
自己运行需要的依赖
两个类
XxxAutoConfiguration
XxxProperties
配置文件
META_INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
XxxAutoConfiguration的全类名
4、实现
自己运行需要的依赖
以下是相对应的pom.xml信息和代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ghy</groupId>
<artifactId>aliyun-oss-boot-autoconfiguration</artifactId>
<version>1.0</version>
<!-- <properties>
<java.version>11</java.version>
</properties>-->
<!-- 没有使用springboot父工程,那么指定JDK编译版本时,使用如下方式 -->
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.5</version>
</dependency>
<!-- 阿里云OSS -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
<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>
</dependencies>
</project>
@ConfigurationProperties(prefix = AliyunOssProperties.ALIYUN_OSS_PREFIX)
public class AliyunOssProperties {
public static final String ALIYUN_OSS_PREFIX = "aliyun.oss";
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
public String getEndpoint() {
return endpoint;
}
public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}
public String getAccessKeyId() {
return accessKeyId;
}
public void setAccessKeyId(String accessKeyId) {
this.accessKeyId = accessKeyId;
}
public String getAccessKeySecret() {
return accessKeySecret;
}
public void setAccessKeySecret(String accessKeySecret) {
this.accessKeySecret = accessKeySecret;
}
public String getBucketName() {
return bucketName;
}
public void setBucketName(String bucketName) {
this.bucketName = bucketName;
}
}
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.UUID;
/**
* @author ghy
* @version 1.0.1
* @date 2023-04-14 15:16:36
*/
public class AliyunOssUtils {
public AliyunOssUtils(AliyunOssProperties aliyunOssProperties){
this.aliyunOssProperties = aliyunOssProperties;
}
private AliyunOssProperties aliyunOssProperties;
public String uploadImg(MultipartFile file) throws Exception {
System.out.println("=================>");
OSS ossClient = new OSSClientBuilder().build(
aliyunOssProperties.getEndpoint(),
aliyunOssProperties.getAccessKeyId(),
aliyunOssProperties.getAccessKeySecret());
InputStream inputStream = file.getInputStream();
String filename = file.getOriginalFilename(); //zhangsan.jpg
String suffixName = filename.substring(filename.lastIndexOf(".")); //.jpg
String uuid = UUID.randomUUID().toString().replaceAll("-", "");//adfklusafbj234097fsdklsdfbjksdfhjk
filename = uuid + suffixName; //adfklusafbj234097fsdklsdfbjksdfhjk.jpg
PutObjectRequest putObjectRequest = new PutObjectRequest(aliyunOssProperties.getBucketName(), filename, inputStream);
putObjectRequest.setProcess("true");
PutObjectResult result = ossClient.putObject(putObjectRequest);
if (result.getResponse().getStatusCode() == 200) {
//https://ybbcqwiu.oss-cn-hangzhou.aliyuncs.com/meinv.jpg
return "https://" + aliyunOssProperties.getBucketName() + "." + aliyunOssProperties.getEndpoint() + "/" + filename;
}
if (ossClient != null) {
ossClient.shutdown();
}
return null;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ghy</groupId>
<artifactId>aliyun-oss-boot-starter</artifactId>
<version>1.0</version>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.ghy</groupId>
<artifactId>aliyun-oss-boot-autoconfiguration</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>