Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Guice移动到Spring:具有默认构造函数和属性处理的bean_Java_Spring_Dependency Injection_Guice - Fatal编程技术网

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

Java 从Guice移动到Spring:具有默认构造函数和属性处理的bean,java,spring,dependency-injection,guice,Java,Spring,Dependency Injection,Guice,我刚刚把我的宠物项目从Guice转移到SpringDI。我想分享一些笔记并征求意见。 Guice配置是通过注释完成的(这是唯一可能的方式),Spring配置也是通过注释完成的:一个用@Configuration注释的AppConfig类和许多用@bean注释的bean创建方法 意见和问题: Spring的配置中充满了使用 默认无参数构造函数: 那绝对不好。Guice用默认值实例化bean 无需任何额外配置的构造函数。我可以在家里做这个吗 春天我知道如果我将@Component注释与 类路径扫描注

我刚刚把我的宠物项目从Guice转移到SpringDI。我想分享一些笔记并征求意见。 Guice配置是通过注释完成的(这是唯一可能的方式),Spring配置也是通过注释完成的:一个用@Configuration注释的AppConfig类和许多用@bean注释的bean创建方法

意见和问题:

  • Spring的配置中充满了使用 默认无参数构造函数:

    那绝对不好。Guice用默认值实例化bean 无需任何额外配置的构造函数。我可以在家里做这个吗 春天我知道如果我将@Component注释与 类路径扫描注释它将完成这个任务。但是:1。 使用@Component注入与使用@Bean 2注入不同。 我需要将配置分散到比以前更多的文件中 只是添加了@Autowired。那太糟糕了。唯一的解决办法是保持 configs在一个地方是很好的XML配置,但在另一个地方是 所有bean的显式声明。或者我错了,这可能是 春天做得更好

  • 属性文件处理。在使用Guice时,我做了一件坏事:我将@Named注释分散在注入属性值的大量私有字段中。有时在某个类中要注入5个属性,这导致了5个注释。这不是一个好的解决方案,我试图用Spring做得更好,但我唯一发现的是在任何地方实例化和注入配置文件。只要看看这个完美:
  • 看来我最喜欢的项目需要再次重构。有什么建议吗

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

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


  • 我不确定第1点,但是第2点可以通过编写一个bean后处理器来完成,该后处理器在创建bean之后获取bean。然后,您可以检查自己的bean并自动注入属性类型,例如字符串或整数。当然,您需要提出一个关于如何命名可注入属性的约定,或者另一个将其标记为属性的注释。然后,按照惯例,您的字段名可以对应于属性名,并且您可以解析它们,而无需对bean进行任何注释?就我个人而言,我觉得把这一点说清楚很好。太多的魔法会导致死亡;)
    @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);
    }
    
    @Service
    class AClass implements MyService {
    
       @Autowired
       public AClass(UniqueInterface uniqueInterface) {
        ...
       }
    
       @Autowired
       @Qualifier("[beanName]")
       public void setAnInterface(NotUniqueInterface notUniqueInterface) {
          ...
       }
    }