Вы можете использовать постпроцессор бина, чтобы установить ссылку на прокси на целевом бине. Он перемещает спецификацию Spring из ваших компонентов в один класс.
Post-Processor
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class SelfReferencingBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof SelfReferencingBean) {
((SelfReferencingBean) bean).setProxy(bean);
}
return bean;
}
}
Context
Зарегистрировать постпроцессор в applicationContext.xml
.
<bean id="srbpp" class="SelfReferencingBeanPostProcessor"/>
Фасоль
Каждый компонент должен реализовывать SelfReferencingBean
, чтобы сообщить постпроцессору, что ему нужна ссылка на прокси.
public interface SelfReferencingBean {
void setProxy(Object proxy) ;
}
Теперь реализуйте setProxy
в каждом бине, который должен вызывать себя через свой прокси.
public class MyBean implements SelfReferencingBean {
MyBean proxy;
@Override
public void setProxy(Object proxy) {
this.proxy = (MyBean) proxy;
}
}
Вы можете поместить этот последний бит кода в базовый класс бина, если вы не возражаете приводить proxy
к типу бина при вызове методов непосредственно для него. Поскольку вы проходите через Method.invoke
, вам даже не понадобится актерский состав.
Если немного поработать, могу поспорить, это можно преобразовать в процессор аннотаций а-ля @Autowired
. Если подумать, я не помню, пытался ли я добавить ссылку на себя, используя @Autowired
.
public class MyBean implements SelfReferencingBean {
@Autowired MyBean proxy;
}