Получение аннотации класса для данного Spring Bean - PullRequest
0 голосов
/ 31 января 2020

У меня есть две пользовательские аннотации, как описано ниже.

  • CustomAnnotationMain - это аннотация на основе Spring Component.
  • CustomAnnotationChild - это аннотация на основе Spring Bean.

Ниже приведен фрагмент кода, в котором используются 2 пользовательские аннотации.

@CustomAnnotationMain(value = "parent") 
public class MainClass{

    @CustomAnnotationChild(value = "child1")
    public ObjectBuilder getObject1() {
        // logic
    }

    @CustomAnnotationChild(value = "child2")
    public ObjectBuilder getObject2() {
        // logic
    }
}

Вопрос: Как получить список всех аннотированных классов CustomAnnotationMain, а также всей информации о компонентах + аннотации которые доступны как часть компонента?

Я сделал следующее, чтобы аннотировать все компоненты с помощью @CustomAnnotationChild. Но я не уверен, как получить доступ к классу, в котором доступен компонент. Мне нужно получить доступ к @CustomAnnotationMain для данного компонента.

    allBuilders = context.getBeansOfType(ObjectBuilder.class);

PS : Это не проект, основанный на Spring Boot. Я использую только основные пружинные библиотеки.

1 Ответ

0 голосов
/ 31 января 2020

Я сделал нечто подобное. Введен интерфейс Proxyable и необходимо найти все компоненты, аннотированные интерфейсом, или создать прокси для всех определенных интерфейсов.

https://github.com/StanislavLapitsky/SpringSOAProxy/blob/master/core/src/main/java/org/proxysoa/spring/service/ProxyableScanRegistrar.java

В вашем случае вам следует замените Proxyable на CustomAnnotationMain.

Лог c определения ClassPathScanningCandidateComponentProvider можно изменить, чтобы отразить ваш фильтр (мне нужны только интерфейсы).

public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
    LOG.debug("Registering @Proxyable beans");
    // Get the ProxyableScan annotation attributes
    Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes(ProxyableScan.class.getCanonicalName());

    if (annotationAttributes != null) {
        String[] basePackages = (String[]) annotationAttributes.get("value");

        if (basePackages.length == 0) {
            // If value attribute is not set, fallback to the package of the annotated class
            basePackages = new String[]{((StandardAnnotationMetadata) metadata).getIntrospectedClass().getPackage().getName()};
        }

        // using these packages, scan for interface annotated with Proxyable
        ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false, environment) {
            // Override isCandidateComponent to only scan for interface
            @Override
            protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
                AnnotationMetadata metadata = beanDefinition.getMetadata();
                return metadata.isIndependent() && metadata.isInterface();
            }
        };
        provider.addIncludeFilter(new AnnotationTypeFilter(Proxyable.class));

        ControllerFactory factory = getControllerFactory((DefaultListableBeanFactory) registry);

        // Scan all packages
        for (String basePackage : basePackages) {
            for (BeanDefinition beanDefinition : provider.findCandidateComponents(basePackage)) {
                try {
                    Class c = this.getClass().getClassLoader().loadClass(beanDefinition.getBeanClassName());
                    if (!hasImplementingClass(c, basePackages)) {
                        //creating missing beans logic is skipped
                    }
                } catch (ClassNotFoundException e) {
                    throw new SOAControllerCreationException("cannot create proxy for " + beanDefinition.getBeanClassName());
                }
            }
        }
    }
}

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...