java - 从 Guice 迁移到 Spring : beans with default constructor and properties handling

标签 java spring dependency-injection guice

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

观察和问题:

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

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

    这绝对是糟糕的。 Guice 使用默认值实例化 beans 构造函数,无需任何额外配置。我可以在 Spring ?我知道如果我添加 @Component 注释 类路径扫描注释就可以了。但是:1。 使用 @Component 注入(inject)与使用 @Bean 2 注入(inject)不同。 我需要将配置分散到更多的文件中 只需添加@Autowired。那很糟。保留所有内容的唯一解决方案 位于一处的配置是旧的良好 XML 配置,但再次使用 所有 bean 的显式声明。或者我错了,这可以是 Spring 做得更好吗?

  2. 属性文件处理。在使用 Guice 时,我做了一件坏事:我将 @Named 注释分散在注入(inject)属性值的大量私有(private)字段中。有时,某个类中需要注入(inject) 5 个属性 - 这会产生 5 个注释。这不是一个好的解决方案。我尝试使用 Spring 做得更好,但我发现的唯一的事情就是到处实例化和注入(inject)配置文件。看看这个完美的效果:
    @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 将注入(inject)适合所需参数类型的接口(interface)/类。
    有一件大事要记住(来自 Guice):如果您有同一接口(interface)的两个或多个实例(两个不同的实现),那么您就没有机会选择正确的实例,然后将参数移出到 setter 中,添加注释@Autowired@Qualifier("[beanName]")。或者将所有内容移至配置文件...

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

关于java - 从 Guice 迁移到 Spring : beans with default constructor and properties handling,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39711963/

相关文章:

一组字符串的Java对象内存大小

spring - 如何使用 JmsTemplate 进行手动确认并从 Rabbitmq 队列中删除消息

java - 测试 Spring : Avoid injections into mocked objects with Mockito

java - Spring 数据存储库的测试类中的字段注入(inject)合法吗?

java - EasyMock 部分模拟私有(private)方法

java - 如何将KStream聚合到固定大小的列表?

java - protoc 命令中 proto_path 的用途是什么

spring - 在 proguard 混淆后与现有的、不兼容的相同名称和类的 bean 定义冲突

java - 烧烤条形码生成器不使用网络应用程序显示条形码编号

c# - EF6 DbContext IOC 依赖