使用与不使用 Spring Beans 有什么区别?
what is the difference between using or not Spring Beans?
我可能会得到很多反对票,但是是否使用 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 个豆子
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、这种情况下使用Bean有什么好处?
2. 为什么我应该使用 Spring 而不是像第一种方式那样手动操作?
3. 说到性能,这几种情况哪个更好?
没有 Spring 的示例不是依赖注入!
使用依赖注入,接口的实际实现是在外部代码本身确定的,以减少coupling!
您应该能够需要另一种实现(例如,您可以从一个 JMS 客户端切换到另一个...)。
为了回答您的最后一个问题,使用 Spring 的性能(有一点点)较低但更加灵活。
编辑:
Spring 不是唯一可用于 DI 的工具,但它是最受欢迎的并且包含很多功能。请注意,许多 Java 标准(例如 JPA)也使用 DI。
假设您有 2 个 DAO classes,一个用于 Oracle,第二个用于 MySQL,并且两个 classes 都实现了一个 DAO 接口。您在 Spring 配置文件中将实现定义为 bean。在业务class中你有一个DAO类型的属性,而在spring配置文件中你选择真实类型wheather 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 的 class 属性,您就可以更改整个实现,而您的业务没有任何变化 class!
祝你好运。
我可能会得到很多反对票,但是是否使用 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 个豆子
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、这种情况下使用Bean有什么好处? 2. 为什么我应该使用 Spring 而不是像第一种方式那样手动操作? 3. 说到性能,这几种情况哪个更好?
没有 Spring 的示例不是依赖注入! 使用依赖注入,接口的实际实现是在外部代码本身确定的,以减少coupling!
您应该能够需要另一种实现(例如,您可以从一个 JMS 客户端切换到另一个...)。
为了回答您的最后一个问题,使用 Spring 的性能(有一点点)较低但更加灵活。
编辑: Spring 不是唯一可用于 DI 的工具,但它是最受欢迎的并且包含很多功能。请注意,许多 Java 标准(例如 JPA)也使用 DI。
假设您有 2 个 DAO classes,一个用于 Oracle,第二个用于 MySQL,并且两个 classes 都实现了一个 DAO 接口。您在 Spring 配置文件中将实现定义为 bean。在业务class中你有一个DAO类型的属性,而在spring配置文件中你选择真实类型wheather 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 的 class 属性,您就可以更改整个实现,而您的业务没有任何变化 class!
祝你好运。