可能我会得到很多downvotes,但是对于我来说,无论是否使用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:没有春豆
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所需的依赖关系,改变的是我创建和使用objets的方式,我错了吗?所以具体来说,我的问题是: 1.在这种情况下使用Beans有什么好处? 2.为什么我要使用Spring而不是像第一种方式手动操作? 3.谈论性能,哪种情况更好?
答案 0 :(得分:2)
没有Spring的例子不依赖注入! 使用依赖注入,接口的实际实现是在外部代码本身确定的,以减少coupling!
您应该能够需要另一个实现(例如,您可以从一个JMS客户端切换到另一个...)。
要回答你的上一个问题,使用Spring(性能稍差)性能会更低,但更灵活。
编辑: Spring不是唯一可以用于DI的工具,但它是最流行的,它包含很多功能。请注意,许多Java标准(例如JPA)也使用DI。
答案 1 :(得分:2)
假设你有一个用于Oracle的2个DAO类,用于MySQL的seconde,并且这两个类都在实现DAO接口。您可以在Spring配置文件中将实现定义为bean。在业务类中,您有一个DAO类型的属性,而在spring配置文件中,您选择要注入的Oracle或MySQL的真实类型或使用spring注释@Autowired
这减少了耦合,很容易从Oracle迁移到MySQL。
@Service
public class Business {
@Autowired
private Dao daoImpl;
//Business methods that invoks Dao methods
}
在Spring配置文件(XML文件)中,使用以下命令:
<bean id="daoImpl" class="app.com.MySQLDaoImpl OR app.com.OracleDaoImpl"/>
只需更改bean的类属性即可更改整个实现,而无需更改业务类!祝你好运。