我有一些懒加载的bean的代码:
@Component @Lazy
class Resource {...}
@Component @Lazy @CustomProcessor
class ResourceProcessorFoo{
@Autowired
public ResourceProcessor(Resource resource) {...}
}
@Component @Lazy @CustomProcessor
class ResourceProcessorBar{
@Autowired
public ResourceProcessor(Resource resource) {...}
}
初始化应用程序上下文后,这些bean实例不会存在。当应用程序上下文创建bean资源(例如,applicationContext.getBean(Resource.class))时,没有任何标有@CustomProcessor的bean实例。
需要在创建资源bean时使用@CustomProcessor创建bean。如何做到这一点?
更新: 发现了一个丑陋的解决方案——使用空的自动���配setter:
@Autowired
public void setProcessors(List<ResourceProcessor> processor){}
另一种不太优美的解决方案是使用BeanPostProcessor(真神奇!)
@Component
class CustomProcessor implements BeanPostProcessor{
public postProcessBeforeInitialization(Object bean, String beanName) {
if(bean instanceof Resource){
applicationContext.getBeansWithAnnotation(CustomProcessor.class);
}
}
}
也许有更优雅的方式?
@PostConstruct
来初始化所有的Processor
。 - XstianResource
应该实现ApplicationContextAware
,并且在它的@PostConstruct
方法中,你可以使用applicationContext.getBeansOfType(ResourceProcessor.class)
。是一个有些曲折的想法,但我认为这样做很好:) - Xstian