使用@ComponentScan按名称弹出autowire但在属性

时间:2018-04-10 11:26:37

标签: java spring autowired

只需在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?

2 个答案:

答案 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);
      }
    });
  }
}

如果春天有一个可以做到这一点的设置,我仍然很好奇。