提问者:小点点

从Guice移动到Spring:具有默认构造函数和属性处理的bean


我刚刚完成了将我的宠物项目从Guice移动到SpringDI。我想分享一些笔记并征求建议。Guice config是通过注释完成的(唯一可能的方法),Spring config也只使用注释:一个用@Configuration注释的AppConfig类和大量用@Bean注释的bean创建方法。

意见和问题:

>

  • Spring的配置充满了使用默认无参数构造函数创建bean的方法:

    @Bean
    public DataProvider getDataProvider() {
        return new DataProvider();
    }
    

    这绝对不好。Guice使用默认构造函数实例化bean,而不需要任何额外的配置。我可以在Spring中做到这一点吗?我知道,如果我在类路径扫描注释的同时添加@Component注释,它会做到这一点。但是: 1.使用@Component注入不同于使用@Bean 2注入。我需要将我的配置分散在更多的文件中,而不仅仅是添加@Autowed。这很糟糕。将所有配置保存在一个地方的唯一解决方案是旧的好的XML配置,但再次明确声明所有bean。或者我错了,这可以在Spring中做得更好?

    @Bean
    public MyProjectStorageConfiguration getStorageConfiguration(
            @Value("${mongo.collections.names})") String mongoNames,
            @Value("${mongo.collections.data})") String mongoData,
            @Value("${files.maindata})") String mainData,
            @Value("${files.secondarydata})") String secondaryData,
            @Value("${files.backupdata})") String backupData,
            @Value("${files.additionaldata})") String additionalData) {
        return new MyProjectStorageConfiguration(mongoNames,mongoData, mainData,secondaryData,backupData,additionalData);
    }
    

    看来我的宠物项目需要再次重构。有什么建议吗?


  • 共1个答案

    匿名用户

    >

  • 是的,你说得对。这确实是个坏习惯。
    但这并不是Spring本身造成的,只是教程和所有其他东西的编写方式。事实上,您可以在构造函数中使用@Autowed,Spring将注入与所需参数类型相匹配的接口/类。
    有一个大的事情要记住(来自Guice):如果您有两个或多个相同接口的实例(两个不同的实现),要选择正确的实例,您没有机会然后将参数移出到设置器中,添加注释@Autowed@Qualifier("[beanName]")。或者将所有内容移动到配置文件中…

    @Service
    class AClass implements MyService {
    
       @Autowired
       public AClass(UniqueInterface uniqueInterface) {
        ...
       }
    
       @Autowired
       @Qualifier("[beanName]")
       public void setAnInterface(NotUniqueInterface notUniqueInterface) {
          ...
       }
    }
    

    通常,您可以直接在代码中注入属性值。请参阅值注入模式。但是,无论如何,您需要使用注释或使用配置bean注入值。没有其他方法(至少据我所知…)。