经过思考,放弃了自己搭建分布式文件系统的思路,决定采用第三方的文件服务器存储上传的图片。由于已经驻在阿里云上了,因此采用阿里的OSS。
阿里的SDK实在是没有体现出他们的水平,感觉就是大和杂,依赖很多,同样的功能都要引入好几个不同的包来处理,什么fastjson,gson,json-lib让人眼花。项目组伙伴吐槽后撂挑子了,只得去救火。
做了个比较轻的包装,基本上只需配置,代码中不需要关注上传的动作了。考虑到项目中被伙伴嗯们广泛接受的Spring Boot,于是打开了Spring Boot 自带的Starter源代码,依样画葫芦也搞了Starter,总结下来有几个要点:
定义配置Propeties类
Propeties类一般定义为
XXXProperties,其中XXX为配置的主题,是个普通的Java Bean。唯一的差别是用ConfigurationProperties对类进行了标注。如:1 @ConfigurationProperties(prefix = "ali.oss") 2 public class OssUploadProperties { 3 private String accessId; 4 private String accessKey; 5 private String endpoint; 6 private String bucket; 7 private Condition condition; 8 private PolicyServer policyServer; 9 private CallbackServer callbackServer; 10 11 ...... 12 }定义Configuration类
Configuration是个Java Config配置类,需使用
EnableConfigurationProperties引入上述Properties类,在构造函数中完成注入。1 @Configuration 2 @EnableConfigurationProperties({OssUploadProperties.class}) 3 public class OSSConfiguration { 4 private final OssUploadProperties properties; 5 6 public OSSConfiguration(OssUploadProperties properties) { 7 this.properties = properties; 8 } 9 10 ...... 11 }编辑META-IN/spring.factories文件
这个文件就没的好说的了。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=me.szlx.ali.OSSConfiguration
按照上述制作的Starter,有个缺陷就是,只要在Spring Boot环境中引入了,就会进行相关的初始化。如果要避免这点,可以先注释掉META-IN/spring.factories文件的相关内容,然后提供类似以下的标注类,并在需要启用的工程中用于标注主类即可。
1 @Target(ElementType.TYPE)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Documented
4 @Inherited
5 @Import(OSSConfiguration.class)
6 public @interface EnableAliOSS {
7
8 }