gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:47:34 25 4
gpt4 key购买 nike

我刚刚完成将我的宠物项目从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com