我刚刚完成将我的宠物项目从 Guice 迁移到 Spring DI。我想分享一些笔记并寻求建议。 Guice配置是用注解完成的(唯一可能的方式),Spring配置也只能用注解:一个用@Configuration注解的AppConfig类,以及里面用@Bean注解的大量bean创建方法。
观察和问题:
Spring 的配置充满了创建 bean 的方法 默认无参数构造函数:
@Bean public DataProvider getDataProvider() { return new DataProvider(); }
这绝对是糟糕的。 Guice 使用默认值实例化 beans 构造函数,无需任何额外配置。我可以在 Spring ?我知道如果我添加 @Component 注释 类路径扫描注释就可以了。但是:1。 使用 @Component 注入(inject)与使用 @Bean 2 注入(inject)不同。 我需要将配置分散到更多的文件中 只需添加@Autowired。那很糟。保留所有内容的唯一解决方案 位于一处的配置是旧的良好 XML 配置,但再次使用 所有 bean 的显式声明。或者我错了,这可以是 Spring 做得更好吗?
- 属性文件处理。在使用 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); }
看来我的宠物项目需要再次重构。有什么建议吗?
最佳答案
是的,你说得对。这实在是一个坏习惯。
但这并不是由 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) { ... } }
通常您可以直接在代码中注入(inject)属性值。请参阅values injection modes 。但是,以某种方式,您需要使用注释或使用配置 bean 来注入(inject)值。没有其他方法(至少据我所知......)。
关于java - 从 Guice 迁移到 Spring : beans with default constructor and properties handling,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39711963/