На языке программирования Java
аннотация
предлагает отличный способ предоставления метаинформации о нашем коде. Эта метаинформация может быть использована фреймворками для определения функциональности этой конкретной функции. Когда вы разрабатываете модуль или функцию, вы можете определить свои собственные аннотации, и ваша функция может использовать их для достижения функциональных возможностей, аналогичных существующим фреймворкам
Информация, содержащаяся в аннотации, становится доступной для среды выполнения кода 2 способами.
- Используя
обработчик аннотаций
. Процессоры аннотаций вызываются компилятором java для обработки информации, содержащейся в Аннотированных элементах, для создания новых исходных файлов Java или других метаданных - Сканируя аннотации во время запуска JVM и используя Java reflection, можно идентифицировать
AnnotatedElement
s, и мы можем соответствующим образом создавать метамодели.
В этой статье рассматривается 2-й способ сканирования аннотированных классов из classpath или методов или переменных во время выполнения и использования его для нашей функции.
Существуют библиотеки, такие как class graph , которые можно использовать в приложениях java, которые не используют spring framework
. Если ваше приложение не использует spring framework или spring boot, вы можете обратиться к документации class graph library и продолжить.
Если ваше приложение использует spring framework, то вы можете использовать приведенный ниже фрагмент кода и получить список классов, которые были аннотированы определенной аннотацией
Если ваша пользовательская аннотация @MyCustomAnnotation
, вы можете найти все классы, которые помечены аннотацией/| @MyCustomAnnotation используя приведенный ниже вызов функции
Findannotatedклассы(MyCustomAnnotation.class , “com.abc.def.xyz”)
Список пакетов задается как varargs, поскольку это позволило бы использовать аккуратный код в вызывающих местах.
Ниже приведена реализация метода findAnnotatedClasses()
. Класс ClassPathScanningCandidateComponentProvider
spring framework выполняет волшебное сканирование всего пути к классу и возвращает нам классы компонентов, которые имеют аннотацию @mycustomannotation.
Для spring framework для сканирования вашего класса с вашей пользовательской аннотацией @MyCustomAnnotation,
ваш класс должен быть снабжен аннотациями @Component
или другими аннотациями spring, которые делают ваш класс управляемым компонентом Spring.
public SetfindAnnotatedClasses(Class extends Annotation> annotationType, String... packagesToBeScanned) { ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false); provider.addIncludeFilter(new AnnotationTypeFilter(annotationType)); Set ret = new HashSet<>(); for (String pkg : packagesToBeScanned) { Set beanDefs = provider.findCandidateComponents(pkg); beanDefs.stream() .map(BeanDefinition::getBeanClassName) .forEach(ret::add); } return ret; }
Основной класс приложения Spring ниже показывает, как вызвать этот метод.
@SpringBootApplication public class SpringApp implements CommandLineRunner { @Autowired private ClassScanner classScanner; public static void main(String[] args) { SpringApplication.run(SpringApp.class, args); } @Override public void run(String... args) throws Exception { SetannotatedClasses = classScanner.findAnnotatedClasses(MyCustomAnnotation.class, "xyz.reachadi"); for (String c : annotatedClasses) System.out.println("Annotated Class : " + c); } }
Подход очень прост….. верно?
Итак, что дальше? Улучшите читаемость ваших кодов, определив пользовательские аннотации и используя их в ваших кодах.
Полный рабочий пример этого блога доступен в моем репозитории github.
Пожалуйста, обратитесь к readme.md
для получения инструкций по запуску руководства.
Оригинал: “https://dev.to/adithyank/custom-annotation-scanning-with-spring-boot-4g”