从 Guice 迁移到 Spring:具有默认构造函数和属性处理的 bean
Moving from Guice to Spring: beans with default constructor and properties handling
我刚刚将我的宠物项目从 Guice 转移到 Spring DI。我想分享一些笔记并寻求建议。
Guice 配置是用注解完成的(唯一可能的方法),Spring 配置也只用注解:一个 AppConfig class 用 @Configuration 注解,还有大量的 bean 创建方法在里面用 @Bean 注解。
观察和问题:
Spring的配置充满了创建bean的方法
默认无参数构造函数:
@Bean
public DataProvider getDataProvider() {
return new DataProvider();
}
那绝对不好。 Guice 使用默认实例化 bean
没有任何额外配置的构造函数。我可以在
Spring?我知道如果我添加 @Component 注释
class路径扫描注释就可以了。但是:1。
使用@Component 注入不同于使用@Bean 2 注入。
我需要将我的配置分散到比 while 更多的文件中
只需添加@Autowired。那很糟。保持所有的唯一解决方案
一个地方的配置是旧的好 XML 配置,但又是
所有 bean 的显式声明。或者我错了,这可能是
Spring?
做得更好
- 属性文件处理。在使用 Guice 时,我做了一件坏事:我在注入 属性 值的大量私有字段中散布了 @Named 注释。有时在某些 class 中要注入 5 个属性 - 这导致了 5 个注释。 solution.I 试图用 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 本身引起的,而是由教程和所有其他内容的编写方式引起的。事实上,您可以在构造函数中使用 @Autowired
,而 Spring 将注入符合所需参数类型的 intefaces/classes。
有一件大事要记住(来自 Guice):如果您有同一接口的两个或多个实例(两个不同的实现),select 正确的一个您没有机会然后将参数移出到a setter 添加注释 @Autowired
和 @Qualifier("[beanName]")
。或者将所有内容移动到配置文件...
@Service
class AClass implements MyService {
@Autowired
public AClass(UniqueInterface uniqueInterface) {
...
}
@Autowired
@Qualifier("[beanName]")
public void setAnInterface(NotUniqueInterface notUniqueInterface) {
...
}
}
通常您可以直接在代码中注入 属性 值。参见 values injection modes。但是,在某种程度上,您需要使用注释或使用配置 bean 来注入值。没有其他方法(至少就我所知...)。
我刚刚将我的宠物项目从 Guice 转移到 Spring DI。我想分享一些笔记并寻求建议。 Guice 配置是用注解完成的(唯一可能的方法),Spring 配置也只用注解:一个 AppConfig class 用 @Configuration 注解,还有大量的 bean 创建方法在里面用 @Bean 注解。
观察和问题:
Spring的配置充满了创建bean的方法 默认无参数构造函数:
@Bean public DataProvider getDataProvider() { return new DataProvider(); }
那绝对不好。 Guice 使用默认实例化 bean 没有任何额外配置的构造函数。我可以在 Spring?我知道如果我添加 @Component 注释 class路径扫描注释就可以了。但是:1。 使用@Component 注入不同于使用@Bean 2 注入。 我需要将我的配置分散到比 while 更多的文件中 只需添加@Autowired。那很糟。保持所有的唯一解决方案 一个地方的配置是旧的好 XML 配置,但又是 所有 bean 的显式声明。或者我错了,这可能是 Spring?
做得更好
- 属性文件处理。在使用 Guice 时,我做了一件坏事:我在注入 属性 值的大量私有字段中散布了 @Named 注释。有时在某些 class 中要注入 5 个属性 - 这导致了 5 个注释。 solution.I 试图用 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 本身引起的,而是由教程和所有其他内容的编写方式引起的。事实上,您可以在构造函数中使用@Autowired
,而 Spring 将注入符合所需参数类型的 intefaces/classes。
有一件大事要记住(来自 Guice):如果您有同一接口的两个或多个实例(两个不同的实现),select 正确的一个您没有机会然后将参数移出到a setter 添加注释@Autowired
和@Qualifier("[beanName]")
。或者将所有内容移动到配置文件...@Service class AClass implements MyService { @Autowired public AClass(UniqueInterface uniqueInterface) { ... } @Autowired @Qualifier("[beanName]") public void setAnInterface(NotUniqueInterface notUniqueInterface) { ... } }
通常您可以直接在代码中注入 属性 值。参见 values injection modes。但是,在某种程度上,您需要使用注释或使用配置 bean 来注入值。没有其他方法(至少就我所知...)。