我有以下情况: 在Spring Boot的配置/启动过程中,我正在使用反射来获取接口列表。这些接口被替换为代理实现(使用java.lang.reflect.Proxy,因为我不能使用Spring的AOP)。这很有效。
有一个超级和实际的界面。所以我有这样的事情:
public interface Stream{
}
public interface ExampleStream extends Stream{
doAction();
}
现在我想使用未注明@Inject的其他bean中的接口,例如
@Service
public class MyService{
@Inject
private ExampleStream exampleStream;
public void fooBar(){
exampleStream.doAction();
}
}
还有初始化代理的方法:
...
StreamInvocationHandler invoHandler = ... // this implements InvocationHandler (the proxy)
ClassLoader cl = ClassUtils.getDefaultClassLoader();
Class<? extends Stream> stream = ... // fetch the class, which is ExampleStream.class
Object impl = Proxy.newProxyInstance(cl, new Class[]{stream}, invoHandler);
ExampleStream exampleStream = (ExampleStream)impl;
// this is working
exampleStream.doAction();
该机制应该等于spring数据存储库(@Repository
注释除外......等等)
但现在,我不知道如何注射。由于一些SO答案,我尝试按如下方式实施ApplicationContextAware
:
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
... // stuff from above
AutowireCapableBeanFactory beanFactory = applicationContext.getAutowireCapableBeanFactory();
beanFactory.autowireBean(impl);
beanFactory.initializeBean(impl, "exampleBean");
}
这不起作用(myservice中的字段exampleStram没有限定bean ...)。我还尝试了使用BeanDefinitionRegistryPostProcessor
的类似解决方案的另一个建议,但这仅适用于bean定义。
我可以在哪里以及如何注入这些自创的bean?