Овен NamespaceHandler, чтобы получить ссылку на Бин

После успешной попытки реализовать мой собственный перехватчик чертежа для отслеживания входа / выхода метода с помощью обработчика пространства имен, теперь я ищу его усовершенствование, где сам перехватчик определяется как другой bean-компонент в том же файле чертежа xml, и мой элемент пространства имен использует ref="interceptorBeanName", то есть я пытаюсь зарегистрировать Interceptor, который фактически делегирует другой экземпляр Interceptor, определенный в том же проекте.

Но как получить компонент Reference of Interceptor, определенный в проекте?

Я искал в Google много часов. Но не было документации о том, как это сделать в Blueprint.

Любая помощь о том, как подойти к этому, будет высоко оценена.

Редактировать:

@Override
public ComponentMetadata decorate(Node node, ComponentMetadata compMeta,
        ParserContext cxt) {
    cxt.getComponentDefinitionRegistry().registerInterceptorWithComponent(compMeta, new Interceptor() {

        @Override
        public Object preCall(ComponentMetadata arg0, Method arg1, Object... arg2)
                throws Throwable {
            info_logger.info(arg1.getName() + " before call");
            return null;
        }

        @Override
        public void postCallWithReturn(ComponentMetadata arg0, Method arg1,
                Object arg2, Object arg3) throws Throwable {
            info_logger.info(arg1.getName() + " after call");
        }

        @Override
        public void postCallWithException(ComponentMetadata arg0, Method arg1,
                Throwable arg2, Object arg3) throws Throwable {
            info_logger.info(arg1.getName() + " after exception");
        }

        @Override
        public int getRank() {
            return 0;
        }
    });
    return compMeta;
}

1 ответ

Решение

Я вижу две возможности, использовать BeanProcessor или ComponentDefinitionRegistryProcessor

BeanProcessor - это классический bean-компонент, который может быть внедрен как любой другой bean-компонент, но они могут предварительно обрабатывать / постобрабатывать другие определения bean-компонентов и добавлять перехватчик в это определение bean-компонента. этот инсерцептор может иметь ссылку на другие компоненты

посмотрите, например, анализатор аннотаций tx

ComponentDefinitionRegistryProcessor вызывается после определения bean-компонентов, но до запуска контекста. он может использовать BlueprintContainer, который ссылается на все компоненты контекста, а также может добавить перехватчик. с помощью BlueprintContainer перехватчик может ссылаться на другие компоненты контекста.

см. например, процессор jpa

Старый ответ:

Если вы хотите, чтобы в NamespaceHandler aries-blueprint создавалась ссылка на другой компонент, вы можете использовать RefMetaDataи связать этот реф как обычный бин.

private RefMetadata createRef(ParserContext context, String value) {
   MutableRefMetadata m = context.createMetadata(MutableRefMetadata.class);
   m.setComponentId(value);
   return m;
}

и что-то вроде:

MutableBeanMetadata metadata = context.createMetadata(MutableBeanMetadata.class);
metadata.addRuntimeClass(DelegateInterceptor.class);
...
metadata.addProperty("delegate", createRef(pc, element.getAttribute("ref")));
Другие вопросы по тегам