Овен 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")));