【发布时间】:2015-04-29 03:08:02
【问题描述】:
我可能会得到很多反对意见,但我很困惑是否使用 bean 的所有事实。让我们假设这个例子
interface ICurrency {
String getSymbol();
}
public class CurrencyProcessor {
private ICurrency currency ;
public CurrencyProcessor(ICurrency currency) {
this.currency = currency;
}
public void doOperation(){
String symbol = currency.getSymbol();
System.out.println("Doing process with " + symbol + " currency");
// Some process...
}
}
所以,要注入 ICurrency impl 注入,我认为我可以通过两种方式做到这一点:
方式 1:不使用 Spring bean
public class CurrencyOperator {
private ICurrency currency ;
private CurrencyProcessor processor;
public void operateDefault(){
currency = new USDollarCurrency();
processor = new CurrencyProcessor(currency)
this.processor.doOperation();
}
}
其中 USDollarCurrency 是 ICurrency 接口实现
方式 2:使用 Spring bean
@ContextConfiguration(classes = CurrencyConfig.class)
public class CurrencyOperator {
@Autowired private ICurrency currency ;
@Autowired private CurrencyProcessor processor;
public void operateDefault(){
this.processor.doOperation();
}
}
@Configuration
public class CurrencyConfig {
@Bean
public CurrencyProcessor currencyProcessor() {
return new CurrencyProcessor(currency());
}
@Bean
public ICurrency currency() {
return new USDollarCurrency();
}
我真的不明白使用 Spring 的 bean 有什么好处。我读了一些东西,但我发现最多的是使用 DI 的好处,据我所知,两种方式都在注入 CurrencyProcessor 所需的依赖项,正在改变的是我创建和使用对象的方式,我错了吗?所以具体来说,我的问题是: 1. 在这种情况下使用 Beans 有什么好处? 2. 为什么我应该使用 Spring 而不是像第一种方式那样手动操作? 3. 谈性能,这几个案例哪个更好?
【问题讨论】:
-
“据我了解,两种方式都在注入 CurrencyProcessor 所需的依赖项” - 第一个代码以什么可能的方式注入它?是
CurrencyProcessor自己决定使用哪个ICurrency,因为它自己通知它。那里没有注入...您已将CurrencyProcessor紧密耦合到USDollarCurrency。 -
此外,Spring Beans 不仅仅是依赖注入。 Spring 为您管理对象的整个生命周期。阅读this。
-
感谢您的回答。我不知道我是否正确,两个示例之间的区别在于我在哪里创建对象,对吗?因为我总是在决定我使用哪种 ICurrency,无论是使用 bean 还是在 CurrencyOperator 方法中实例化。我很困惑! :P
标签: java spring dependency-injection spring-4