自动化配置原理

自动化配置原理
    一、起步依赖
        本质上就是一个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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值