我刚刚完成了将我的宠物项目从Guice移动到SpringDI。我想分享一些笔记并征求建议。Guice config是通过注释完成的(唯一可能的方法),Spring config也只使用注释:一个用@Configuration注释的AppConfig类和大量用@Bean注释的bean创建方法。
意见和问题:
>
Spring的配置充满了使用默认无参数构造函数创建bean的方法:
@Bean
public DataProvider getDataProvider() {
return new DataProvider();
}
这绝对不好。Guice使用默认构造函数实例化bean,而不需要任何额外的配置。我可以在Spring中做到这一点吗?我知道,如果我在类路径扫描注释的同时添加@Component注释,它会做到这一点。但是: 1.使用@Component注入不同于使用@Bean 2注入。我需要将我的配置分散在更多的文件中,而不仅仅是添加@Autowed。这很糟糕。将所有配置保存在一个地方的唯一解决方案是旧的好的XML配置,但再次明确声明所有bean。或者我错了,这可以在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);
}
看来我的宠物项目需要再次重构。有什么建议吗?
>
是的,你说得对。这确实是个坏习惯。
但这并不是Spring本身造成的,只是教程和所有其他东西的编写方式。事实上,您可以在构造函数中使用@Autowed
,Spring将注入与所需参数类型相匹配的接口/类。
有一个大的事情要记住(来自Guice):如果您有两个或多个相同接口的实例(两个不同的实现),要选择正确的实例,您没有机会然后将参数移出到设置器中,添加注释@Autowed
和@Qualifier("[beanName]")
。或者将所有内容移动到配置文件中…
@Service
class AClass implements MyService {
@Autowired
public AClass(UniqueInterface uniqueInterface) {
...
}
@Autowired
@Qualifier("[beanName]")
public void setAnInterface(NotUniqueInterface notUniqueInterface) {
...
}
}
通常,您可以直接在代码中注入属性值。请参阅值注入模式。但是,无论如何,您需要使用注释或使用配置bean注入值。没有其他方法(至少据我所知…)。