2016-02-07 2 views
0

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

Но как получить ссылку на перехватчик, определенную в чертеже?

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

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

Edit:

@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 классический боб, который может быть введен, как и любой другой фасоли, но они могут preprocess/postprocess определение других beans и добавить перехватчик в этом определении bean-компонента. это incerceptor может иметь ссылки на другие бобы

см, например, tx annotation parser

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

смотри, например, jpa processor

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

Если вы хотите, в Aries-Blueprint NamespaceHandler, создать ссылку на другой боб, вы можете использовать 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"))); 
+0

Я понимаю, что вы предлагаете использовать RefMetadata, но я не мог получить то, что это MutableBeanMetadata используется и когда/как используется? Не могли бы вы рассказать. –

+0

Я думал, что вы внедряете новый манипулятор имен, я был неправ. Я не понял ваш вопрос. –

+0

Да. Я реализую новый обработчик пространства имен. Просто понял, что DelegateInterceptor, о котором вы упоминали, является моим собственным интерфейсом, для которого компонент должен быть создан и указан в атрибуте ref, правильно? –

Смежные вопросы