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

Moving from Guice to Spring: beans with default constructor and properties handling

我刚刚将我的宠物项目从 Guice 转移到 Spring DI。我想分享一些笔记并寻求建议。 Guice 配置是用注解完成的(唯一可能的方法),Spring 配置也只用注解:一个 AppConfig class 用 @Configuration 注解,还有大量的 bean 创建方法在里面用 @Bean 注解。

观察和问题:

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

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

    那绝对不好。 Guice 使用默认实例化 bean 没有任何额外配置的构造函数。我可以在 Spring?我知道如果我添加 @Component 注释 class路径扫描注释就可以了。但是:1。 使用@Component 注入不同于使用@Bean 2 注入。 我需要将我的配置分散到比 while 更多的文件中 只需添加@Autowired。那很糟。保持所有的唯一解决方案 一个地方的配置是旧的好 XML 配置,但又是 所有 bean 的显式声明。或者我错了,这可能是 Spring?

  2. 做得更好
  3. 属性文件处理。在使用 Guice 时,我做了一件坏事:我在注入 属性 值的大量私有字段中散布了 @Named 注释。有时在某些 class 中要注入 5 个属性 - 这导致了 5 个注释。 solution.I 试图用 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 本身引起的,而是由教程和所有其他内容的编写方式引起的。事实上,您可以在构造函数中使用 @Autowired,而 Spring 将注入符合所需参数类型的 intefaces/classes。
    有一件大事要记住(来自 Guice):如果您有同一接口的两个或多个实例(两个不同的实现),select 正确的一个您没有机会然后将参数移出到a setter 添加注释 @Autowired@Qualifier("[beanName]")。或者将所有内容移动到配置文件...

    @Service
    class AClass implements MyService {
    
       @Autowired
       public AClass(UniqueInterface uniqueInterface) {
        ...
       }
    
       @Autowired
       @Qualifier("[beanName]")
       public void setAnInterface(NotUniqueInterface notUniqueInterface) {
          ...
       }
    }
    
  2. 通常您可以直接在代码中注入 属性 值。参见 values injection modes。但是,在某种程度上,您需要使用注释或使用配置 bean 来注入值。没有其他方法(至少就我所知...)。