Класс-сканер
Класс-сканер — это Java-класс для сканирования, который используется для получения классов из указанного пакета и фильтрации по указанной аннотации.
Реализованные функции:
Класс-сканер состоит из следующих компонентов:
Поскольку проект не был загружен в центральный репозиторий Maven, необходимо настроить его хранилище в проекте. Для этого добавьте следующую конфигурацию в файл конфигурации репозитория:
<repositories>
<repository>
<id>cent-repo</id>
<url>https://gitee.com/centy/maven/raw/master</url>
</repository>
</repositories>
Добавить следующий пакет зависимостей в проект:
<dependency>
<groupId>org.cent</groupId>
<artifactId>scanner-core</artifactId>
<version>1.0.2-SNAPSHOT</version>
</dependency>
Можно использовать следующий тестовый код:
package org.cent.scanner.core.scanner;
import lombok.extern.slf4j.Slf4j;
import org.cent.scanner.core.anno.Scannable;
import org.cent.scanner.core.callback.ScannerCallback;
import org.cent.scanner.core.scanner.impl.DefaultClassScanner;
import org.junit.Test;
import sun.jvm.hotspot.utilities.Assert;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Arrays;
import java.util.List;
@Scannable
@ClassScannerTestCase.CustomScannable
@Slf4j
public class ClassScannerTestCase {
private final List<String> scanPkgs = Arrays.asList(
"org", "lombok", "com.sun", "javax"
);
private ClassScanner classScanner = new DefaultClassScanner();
/**
* Тестовый случай: сканирование нескольких пакетов
*/
@Test
public void testScan() {
List<Class> classList = classScanner.scan(scanPkgs);
Assert.that(classList.size() > 0, "Сканирование не удалось, результат пустой!");
log.info("Всего отсканировано {} классов", classList.size());
}
/**
* Тестовый случай: Сканирование классов с аннотацией Scannable из нескольких пакетов.
*/
@Test
public void testScanByAnno() {
List<Class> classList = classScanner.scanByAnno(scanPkgs, Scannable.class);
Assert.that(classList.size() > 0, "Сканирование не удалось, результат пустой!");
log.info("Всего отсканировано {} классов", classList.size());
}
/**
* Тестовый случай: Сканирование нескольких пакетов с выполнением callback-функции.
*/
@Test
public void testScanAndCallback() {
classScanner.scanAndCallback(scanPkgs, new TestCallback());
}
/**
* Тестовый случай: Сканирование классов с аннотацией CustomScannable из нескольких пакетов, выполнение callback-функции.
*/
@Test
public void testScanAndCallbackByAnno() {
classScanner.scanAndCallbackByAnno(scanPkgs, CustomScannable.class, new TestCallback());
}
/**
* Callback-функция
*/
@Slf4j
static class TestCallback implements ScannerCallback {
@Override
public void callback(List<Class> clzs) {
clzs.forEach(clz -> log.info(clz.getName()));
Assert.that(clzs.size() > 0, "Результат сканирования неправильный!");
}
}
/**
* Пользовательская аннотация
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
static @interface CustomScannable {
}
}
<dependency>
<groupId>org.cent</groupId>
<artifactId>scanner-spring-boot-starter</artifactId>
<version>1.0.1-SNAPSHOT</version>
</dependency>
a. Разработать функцию обратного вызова
package org.cent.demo.scanner.callback;
import lombok.extern.slf4j.Slf4j;
import org.cent.scanner.core.callback.ScannerCallback;
import java.util.List;
@Slf4j
public class CustomCallback implements ScannerCallback {
@Override
public void callback(List<Class> list) {
list.forEach(clz -> {
log.info(clz.getName());
});
}
}
b. В файле application.yml добавить следующую конфигурацию:
org:
scanner:
auto:
enable: true
callback: org.cent.demo.scanner.callback.CustomCallback
packages:
- org.cent
c. Запустить выполнение, вывод будет следующим:
2019-01-16 15:53:50.713 INFO 4365 --- [ main] o.c.d.scanner.callback.CustomCallback : org.cent.demo.scanner.Application
2019-01-16 15:53:50.714 INFO 4365 --- [ main] o.c.d.scanner.callback.CustomCallback
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )