Допустим, у нас есть два bean-компонента, определенных в Spring
<bean class="foo.A"/>
<bean class="foo.B"/>
public class A {
@Autowired
private B b;
}
public class B {
public void foo() {
...
}
}
Я хочу добиться перехвата всех вызовов B.foo()
. Глядя на документацию, я написал перехватчик C
и изменил определение bean B
следующим образом:
public class C implements org.springframework.aop.MethodBeforeAdvice {
public void before(final Method method, final Object[] args, final Object target) {
// interception logic goes here
}
}
<bean class="foo.C"/>
<bean class="org.springframework.aop.framework.ProxyFactoryBean" scope="prototype">
<property name="proxyTargetClass" value="true"/>
<property name="singleton" value="false"/>
<property name="target">
<bean class="foo.B" scope="prototype"/>
</property>
<property name="interceptorNames">
<list>
<value>foo.C</value>
</list>
</property>
</bean>
Проблема: при запуске контейнер Spring сообщает: Не найден соответствующий компонент типа [foo.B] для зависимости: ожидается как минимум 1 компонент, который квалифицируется как кандидат для автоматической передачи этой зависимости . Другими словами, он не может внедрить B
в A
, поскольку B
скрыт за org.springframework.aop.framework.ProxyFactoryBean и больше не распознается автоматически. Если я заменю определение на простой class=foo.B
, контейнер запустится нормально. Какой лучший способ решить эту проблему?
Бонусный вопрос: Возможно ли реализовать перехват B.foo()
без участия ProxyFactoryBean
и только с использованием аннотаций (желательно без участия <aop:...
)?