From 590ba9e105e0a4042a36a477c5ed383ebd36f563 Mon Sep 17 00:00:00 2001 From: aoyu <1790306716@qq.com> Date: Wed, 28 Dec 2022 19:59:34 +0800 Subject: [PATCH] =?UTF-8?q?perf[storage]=20=E6=8A=8A@Resource=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=E8=B7=AF=E5=BE=84=E4=BC=98=E5=8C=96=E4=B8=BA=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=E5=88=AB=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zfoo/storage/manager/StorageManager.java | 44 +++++++------------ .../com/zfoo/storage/model/anno/Resource.java | 8 ++-- .../com/zfoo/storage/ApplicationTest.java | 2 +- .../storage/resource/StudentCsvResource.java | 2 +- 4 files changed, 21 insertions(+), 35 deletions(-) diff --git a/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java b/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java index 6ac5134a..2e53fee9 100644 --- a/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java +++ b/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java @@ -90,7 +90,7 @@ public class StorageManager implements IStorageManager { throw new RuntimeException(StringUtils.format("Unable to get resource [class:{}]", clazzName)); } - var resourceFile = getResourceFile(resourceClazz); + var resourceFile = scanResourceFile(resourceClazz); ResourceDef resourceDef = new ResourceDef(resourceClazz, resourceFile); if (resourceDefinitionMap.containsKey(resourceClazz)) { // 类的资源定义已经存在 @@ -252,14 +252,24 @@ public class StorageManager implements IStorageManager { private Resource scanResourceFile(Class clazz) { var resourcePatternResolver = new PathMatchingResourcePatternResolver(); var metadataReaderFactory = new CachingMetadataReaderFactory(resourcePatternResolver); - + String fileName; + if(clazz.getAnnotation(com.zfoo.storage.model.anno.Resource.class).value().equals("") + &&clazz.getAnnotation(com.zfoo.storage.model.anno.Resource.class).alias().equals("")){ + fileName=clazz.getSimpleName(); + } + else{ + if(clazz.getAnnotation(com.zfoo.storage.model.anno.Resource.class).value().equals("")) + fileName=clazz.getAnnotation(com.zfoo.storage.model.anno.Resource.class).alias(); + else + fileName=clazz.getAnnotation(com.zfoo.storage.model.anno.Resource.class).value(); + } try { // 一个class类只能匹配一个资源文件,如果匹配多个则会有歧义 var resourceSet = new HashSet(); var resourceLocations = StringUtils.tokenize(storageConfig.getResourceLocation(), ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS); for (var resourceLocation : resourceLocations) { var resources = new ArrayList(); - var packageSearchPath = StringUtils.format("{}/**/{}.*", resourceLocation, clazz.getSimpleName()); + var packageSearchPath = StringUtils.format("{}/**/{}.*", resourceLocation, fileName); packageSearchPath = packageSearchPath.replaceAll("//", "/"); try { Arrays.stream(resourcePatternResolver.getResources(packageSearchPath)).filter(it -> ResourceEnum.containsResourceEnum(FileUtils.fileExtName(it.getFilename()))).forEach(it -> resources.add(it)); @@ -269,7 +279,7 @@ public class StorageManager implements IStorageManager { // 通配符无法匹配根目录,所以如果找不到,再从根目录查找一遍 if (resources.isEmpty()) { - packageSearchPath = StringUtils.format("{}/{}.*", resourceLocation, clazz.getSimpleName()); + packageSearchPath = StringUtils.format("{}/{}.*", resourceLocation, fileName); packageSearchPath = packageSearchPath.replaceAll("//", "/"); Arrays.stream(resourcePatternResolver.getResources(packageSearchPath)).filter(it -> ResourceEnum.containsResourceEnum(FileUtils.fileExtName(it.getFilename()))).forEach(it -> resources.add(it)); } @@ -277,7 +287,7 @@ public class StorageManager implements IStorageManager { } if (CollectionUtils.isEmpty(resourceSet)) { - throw new FileNotFoundException(clazz.getSimpleName()); + throw new FileNotFoundException(fileName); } if (resourceSet.size() > 1) { var resourceNames = resourceSet.stream().map(it -> it.getFilename()).collect(Collectors.joining(StringUtils.COMMA)); @@ -290,28 +300,4 @@ public class StorageManager implements IStorageManager { throw new RuntimeException(ExceptionUtils.getMessage(e)); } } - private Resource getResourceFileByPath(Class clazz){ - var resourcePatternResolver = new PathMatchingResourcePatternResolver(); - var metadataReaderFactory = new CachingMetadataReaderFactory(resourcePatternResolver); - var path=clazz.getAnnotation(com.zfoo.storage.model.anno.Resource.class).value(); - if(path.equals("")){ - path=clazz.getAnnotation(com.zfoo.storage.model.anno.Resource.class).path(); - } - var resource= resourcePatternResolver.getResource(path); - try { - var input=resource.getInputStream(); - } catch (IOException e) { - throw new RuntimeException(e); - } - return resource; - } - private Resource getResourceFile(Class clazz){ - if(clazz.getAnnotation(com.zfoo.storage.model.anno.Resource.class).value().equals("")&& - clazz.getAnnotation(com.zfoo.storage.model.anno.Resource.class).path().equals("")){ - return scanResourceFile(clazz); - } - else{ - return getResourceFileByPath(clazz); - } - } } diff --git a/storage/src/main/java/com/zfoo/storage/model/anno/Resource.java b/storage/src/main/java/com/zfoo/storage/model/anno/Resource.java index b614869a..84f680b3 100644 --- a/storage/src/main/java/com/zfoo/storage/model/anno/Resource.java +++ b/storage/src/main/java/com/zfoo/storage/model/anno/Resource.java @@ -19,8 +19,8 @@ import java.lang.annotation.*; /** * 资源注解 - * 可以指定对应的资源路径,如果是类路径一classpath开头,如果是其它目录则以file开头 - * 如果不指定路径,则默认通过扫描路径获取与类名相同的文件资源 + * 可以指定对应的资源文件名(只指定文件名,不需要文件后缀) + * 如果不指定资源文件名,则默认通过扫描路径获取与类名相同的文件资源 * @author godotg * @version 4.0 */ @@ -28,10 +28,10 @@ import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interface Resource { - @AliasFor("path") + @AliasFor("alias") String value() default ""; @AliasFor("value") - String path() default ""; + String alias() default ""; } diff --git a/storage/src/test/java/com/zfoo/storage/ApplicationTest.java b/storage/src/test/java/com/zfoo/storage/ApplicationTest.java index 9fa30a80..21611487 100644 --- a/storage/src/test/java/com/zfoo/storage/ApplicationTest.java +++ b/storage/src/test/java/com/zfoo/storage/ApplicationTest.java @@ -49,7 +49,7 @@ public class ApplicationTest { var studentManager = context.getBean(StudentManager.class); var studentResources = studentManager.studentResources; var studentCsvResources = studentManager.studentCsvResources; - // @Resource注解没指定路径,类名称和Excel名称必须完全一致,Excel的列名称必须对应对象的属性名称 + // @Resource注解没指定别名,类名称和Excel名称必须完全一致,Excel的列名称必须对应对象的属性名称 for (StudentResource resource : studentResources.getAll()) { logger.info(JsonUtils.object2String(resource)); } diff --git a/storage/src/test/java/com/zfoo/storage/resource/StudentCsvResource.java b/storage/src/test/java/com/zfoo/storage/resource/StudentCsvResource.java index 895be657..23791a21 100644 --- a/storage/src/test/java/com/zfoo/storage/resource/StudentCsvResource.java +++ b/storage/src/test/java/com/zfoo/storage/resource/StudentCsvResource.java @@ -21,7 +21,7 @@ import com.zfoo.storage.model.anno.Resource; * @author godotg * @version 4.0 */ -@Resource(path="classpath:/excel/StudentCsvResource.csv") +@Resource(alias="StudentCsvResource") public class StudentCsvResource { @Id