簡単なspring component scanを模擬します.
5196 ワード
もっと読む
mimic scanner
単純なシミュレーションだけで、所与のパケットパスのクラスだけがスキャンされ、多層スキャンはサポートされていません.この基礎の上で変えてもいいです.
パスに入ってくるクラスまたは方法を解析して、異なる構成を複数の個別のパッケージに変換することができます.このように変更する必要はありません. ここの解析コードです.
/**
* specified characters provider
*/
package org.vic.demo.utils;
public class CommonCharacters {
public static final String _DOT = ".";
public static final String _BLANK = "";
public static final String _SLASH_0 = "/";
public static final String _SLASH_1 = "\\";
}
簡単な道具package org.vic.demo.utils;
public class VStringUtils {
public static boolean isNotEmpty (String string) {
if (string != null && (!CommonCharacters._BLANK.equals(string.trim()))) {
return true;
}
return false;
}
}
package org.vic.demo.utils;
import java.util.Arrays;
import java.util.Collection;
public class VCollectionUtils {
public static boolean isNotEmpty (Collection> c) {
if (c != null && c.size() > 0) {
return true;
}
return false;
}
public static boolean isNotEmpty(T[] array) {
if (array != null) {
return isNotEmpty(Arrays.asList(array));
} else {
return false;
}
}
}
mimic scanner
単純なシミュレーションだけで、所与のパケットパスのクラスだけがスキャンされ、多層スキャンはサポートされていません.この基礎の上で変えてもいいです.
パスに入ってくるクラスまたは方法を解析して、異なる構成を複数の個別のパッケージに変換することができます.このように変更する必要はありません. ここの解析コードです.
package org.vic.demo.Annotation.scanner;
import java.io.File;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.net.URL;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import org.vic.demo.utils.CommonCharacters;
import org.vic.demo.utils.VCollectionUtils;
import org.vic.demo.utils.VStringUtils;
public class PackageScanner {
private static Map, Set> map = new HashMap<>();
private static final String _PROTOCOL_FILE = "file";
private static final String _CLASS_SYMBO = ".class";
private static String[] package_paths = null;
private static class PackageScannerHolder {
public static PackageScanner instance = new PackageScanner(package_paths);
}
public static PackageScanner getInstance (String... packagePaths) {
package_paths = packagePaths;
return PackageScannerHolder.instance;
}
private PackageScanner (String... packageNames) {
if (VCollectionUtils.isNotEmpty(packageNames)) {
try {
ClassScanner(packageNames);
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}
}
}
private void ClassScanner (String... packagePaths) throws IOException, ClassNotFoundException {
for (String packagePath : packagePaths) {
if (VStringUtils.isNotEmpty(packagePath)) {
String path = convertPackagePath2FilePath(packagePath);
Enumeration urls = Thread.currentThread().getContextClassLoader().getResources(path);
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
if (url.getProtocol().equalsIgnoreCase(_PROTOCOL_FILE)) {
String fileAbsolutePath = url.getFile();
processor(fileAbsolutePath, packagePath);
}
}
}
}
}
private void processor (String absolutePath, String currentPackagePath) throws ClassNotFoundException {
File dir = new File(absolutePath);
File[] files = dir.listFiles();
if (VCollectionUtils.isNotEmpty(files)) {
for (File file : files) {
if (file.isFile()) {
String fileName = file.getName();
String className = currentPackagePath + CommonCharacters._DOT + (fileName.replace(_CLASS_SYMBO, CommonCharacters._BLANK));
Class> clazz = Class.forName(className);
fix(clazz);
}
}
}
}
private void fix (Class> clazz) {
Set existingAnnotations = map.get(clazz);
if (VCollectionUtils.isNotEmpty(existingAnnotations)) {
return;
}
Annotation[] annotations = clazz.getAnnotations();
if (VCollectionUtils.isNotEmpty(annotations)) {
Set set = new LinkedHashSet();
set.addAll(Arrays.asList(annotations));
System.out.println("put class =======" + clazz.getName() + "======= to map!");
map.put(clazz, set);
}
}
private String convertPackagePath2FilePath (String packagePath) {
return packagePath.replace(CommonCharacters._DOT, CommonCharacters._SLASH_0);
}
}