只需在Spring 4.3中从基于xml的配置迁移到基于java的配置。
在xml中我们有
<beans ... default-autowire="byName">
<component-scan .../>
...
</beans>
在Java类中,我们在字段上没有@Autowired注释:
@Component
public class MyService {
private OtherService otherService;
// +setters
....
}
以前在xml中使用default-autowire="byName"
自动装配功能非常好。
现在转移到JavaConfig时,我找不到为组件扫描启用默认自动装配机制的方法。
通过名称自动装配,接线无需@Autowired注释。
使用@Bean(autowire = BY_NAME)我可以按名称定义一个bean来自动装配,但我需要这种机制来进行组件扫描。不要使用@Bean工厂方法定义所有bean。
此外,我尝试不将@Autowired注释添加到所有类的所有字段。这太多了,无法改变。
我现在的问题是:如何告诉组件扫描按名称自动装配找到的bean?
答案 0 :(得分:0)
我不知道我是否理解你想做什么,但Spring支持@Qualifier和@Resource注释:
@Resource采用name属性,默认情况下,Spring将该值解释为要注入的bean名称。换句话说,它遵循按名称语义
答案 1 :(得分:0)
一种解决方案是使用BeanFactoryPostProcessor更新bean定义,以便按名称将所有bean标记为自动装配:
public class AutowireScannedByNameBeanPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
Arrays.stream(beanFactory.getBeanDefinitionNames()).forEach(name -> {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name);
if (beanDefinition instanceof ScannedGenericBeanDefinition) {
((ScannedGenericBeanDefinition) beanDefinition).setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_NAME);
}
});
}
}
如果春天有一个可以做到这一点的设置,我仍然很好奇。