我有带有延迟初始化 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 Resource 时(例如 applicationContext.getBean(Resource.class)),没有 @CustomProcessor 标记的 bean 实例。
创建Resource bean时需要使用@CustomProcessor创建bean。怎么做?
更新:
发现的丑陋解决方案之一 - 使用空的自动装配设置器:
@Autowired
public void setProcessors(List<ResourceProcessor> processor){}
另一个使用 bean BeanPostProcessor 的丑陋解决方案(太神奇了!)
@Component
class CustomProcessor implements BeanPostProcessor{
public postProcessBeforeInitialization(Object bean, String beanName) {
if(bean instanceof Resource){
applicationContext.getBeansWithAnnotation(CustomProcessor.class);
}
}
}
也许有更优雅的方式?
您必须创建一个标记界面,例如CustomProcessor
public interface CustomProcessor{
}
以后每个ResourceProcessor必须实现上面的接口
@Component @Lazy
class ResourceProcessorFoo implements CustomProcessor{
@Autowired
public ResourceProcessor(Resource resource) {...}
}
@Component @Lazy
class ResourceProcessorBar implements CustomProcessor{
@Autowired
public ResourceProcessor(Resource resource) {...}
}
资源必须实现ApplicationContextAware
@Component
@Lazy
public class Resource implements ApplicationContextAware{
private ApplicationContext applicationContext;
@PostConstruct
public void post(){
applicationContext.getBeansOfType(CustomProcessor.class);
}
public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {
this.applicationContext = applicationContext;
}
}
When Resource
bean将被引用启动后构造,初始化所有实现的beanCustomProcessor
界面。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)