1.配置属性类 AliOssProperties
java
package com.sky.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "sky.alioss") // 绑定配置文件前缀
@Data // Lombok自动生成getter/setter
public class AliOssProperties {
private String endpoint; // OSS访问域名
private String accessKeyId; // 访问密钥ID
private String accessKeySecret; // 访问密钥
private String bucketName; // 存储桶名称
}
作用 :从配置文件(如application.yml
)读取阿里云OSS配置参数。
XML
alioss:
endpoint: oss-cn-shenzhen.aliyuncs.com
access-key-id: LTAI5tNeccJwteJtxpa3Xtaj
access-key-secret: rLRhmNUzAT8JPaCczOwDGvQmmdw2rk
bucket-name: bucket-pl
2.自动配置类 OssConfiguration
java
package com.sky.config;
import com.sky.properties.AliOssProperties;
import com.sky.utils.AliOssUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@Slf4j
public class OssConfiguration {
@Bean
@ConditionalOnMissingBean // 容器不存在AliOssUtil时生效
public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties) {
log.info("创建阿里云OSS工具对象,配置参数:{}", aliOssProperties);
return new AliOssUtil(
aliOssProperties.getEndpoint(),
aliOssProperties.getAccessKeyId(),
aliOssProperties.getAccessKeySecret(),
aliOssProperties.getBucketName()
);
}
}
作用:
-
自动将
AliOssProperties
注入工具类构造器 -
创建
AliOssUtil
的Spring Bean -
@ConditionalOnMissingBean
确保当用户未自定义该Bean时才创建默认实例
3. 工作原理
-
属性注入 :
Spring Boot自动将
application.yml
中以sky.alioss
开头的配置映射到AliOssProperties
对象。 -
Bean创建 :
当Spring容器启动时:
-
检测到
@Configuration
注解,执行配置类逻辑 -
通过构造器参数自动注入
AliOssProperties
-
使用配置参数实例化
AliOssUtil
-
-
条件装配 :
如果项目其他地方已定义
AliOssUtil
(如自定义配置),则跳过默认创建。
4. 使用示例
在Service中直接注入使用:
java
@Service
public class UploadService {
@Autowired
private AliOssUtil ossUtil; // 自动注入工具类
public void uploadFile(MultipartFile file) {
String url = ossUtil.upload(file); // 调用OSS上传方法
// ...
}
}
5. 优势
-
解耦配置:敏感信息(密钥等)与代码分离
-
集中管理:所有OSS配置统一在yml文件中维护
-
灵活扩展:支持自定义Bean覆盖默认实现
-
启动可视化:日志打印配置参数便于调试
提示 :需要确保
AliOssUtil
类存在且包含匹配的构造方法,其实现应基于阿里云OSS SDK(需额外添加依赖com.aliyun.oss:aliyun-sdk-oss
)。
核心注解说明
@Component
作用:它的作用是将一个 Java 类标识为 Spring 的组件(Bean)。
被
@Component
注解标注的类会被 Spring 自动扫描并注册到应用上下文中,可以通过应用上下文获取并使用这些组件。具体来说,@Component 注解可以用于标记任何一个普通的 Java 类,并将其纳入 Spring 管理。这样,它们就可以享受到 Spring 提供的各种依赖注入、自动装配、AOP 等特性。
需要注意的是,@Component 注解通常作为其他更具体的注解(如 @Service、@Repository、@Controller 等)的基础,用于创建具有特定用途的组件。
但是,@Component 注解本身并没有明确定义 Bean 的角色或用途。
总结来说,@Component 注解的作用是将一个 Java 类标识为 Spring 组件(Bean),使其纳入 Spring 的管理与控制范围,可以享受到 Spring 提供的各种特性和便利。
以下是一些常用的注解及其用途:1.@Service:用于标记服务层(Service),相当于早期的 Service 实现类上方也有一个 @Service 注解,用于告诉 Spring 容器,这个类是一个服务层组件,需要被扫描并加入到 Spring 容器中。
2.@Repository:用于标记持久层(DAO),表示这是一个数据库相关的 Bean。与 @Service 注解类似,使用 @Repository 注解标记的类也会被 Spring 扫描并自动注入到其他组件中。
3.@Controller:用于标记控制层(Controller),表示这是 MVC 架构中的控制器组件。Spring 会自动扫描使用了 @Controller 注解的类,并将其注册为控制器 Bean,在处理请求时自动将请求映射到相应的 @RequestMapping 注解标注的方法中进行处理。
4.@Configuration:用于标记配置类,主要用于定义应用程序的 Bean 以及 Bean 之间的依赖关系。与 @Component 注解不同,@Configuration 注解不需要在类名前面添加前缀,其作用相当于一个工厂,用于生产 Bean,并使用 @Bean 注解将其返回。
5.@ControllerAdvice:用于定义全局异常处理器,可以捕获处理所有 Controller 中抛出的异常。@ControllerAdvice 注解需要结合 @ExceptionHandler 注解一起使用,用于定义异常处理方法。
6.@ModelAttribute:用于标注一个方法的返回值或方法参数,表示它们应该被添加到绑定到请求中的 Model 属性中。在使用 @ModelAttribute 标记的方法中,可以向模型中添加属性或组合多个模型属性。
总结来说,以上这些注解都是基于 @Component 注解派生出来的,用于表示不同类型的 Spring Bean 组件,使用这些注解可以更加精细地管理和控制应用程序中的组件。
@ConfigurationProperties 基本使用
在 SpringBoot 中,当想需要获取到配置文件数据时,除了可以用 Spring 自带的 @Value 注解外,SpringBoot 还提供了一种更加方便的方式:@ConfigurationProperties。只要在 Bean 上添加上了这个注解,指定好配置文件的前缀,那么对应的配置文件数据就会自动填充到 Bean 中。
比如在application.properties文件中有如下配置文件
那么按照如下注解配置,
XMLconfig.username=jay.zhou config.password=3333
那么按照如下注解配置,SpringBoot项目中使用@ConfigurationProperties的Bean,它的username与password就会被自动注入值了。就像下面展示的那样
javaimport org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix = "config") public class TestBean{ private String username; private String password; }
SpringBoot主要帮助我们做了两件事情。
第一件事情就是获取到使用@ConfigurationProperties的类。
第二件事就是解析配置文件,并把对应的值设置到我们的Bean中。
@Data
Lombok自动生成getter/setter