使用或不使用Spring Beans有什么区别?

可能我会得到很多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.谈论性能,哪种情况更好?

假设你有一个用于Oracle的2个DAO类,用于MySQL的seconde,并且这两个类都在实现DAO接口。 您可以在Spring配置文件中将实现定义为bean。 在业务类中,您有一个DAO类型的属性,而在spring配置文件中,您可以选择要注入或使用spring注释的Oracle或MySQL的真实类型@Autowired

这减少了耦合,很容易从Oracle迁移到MySQL。

 @Service public class Business { @Autowired private Dao daoImpl; //Business methods that invoks Dao methods } 

在Spring配置文件(XML文件)中,您使用以下命令:

  

只需更改bean的类属性即可更改整个实现,而无需更改业务类!
祝你好运。

你没有Spring的例子不dependency injection! 使用dependency injection,接口的实际实现是在代码本身之外确定的,以减少耦合 !

您应该能够需要另一个实现(例如,您可以从一个JMS客户端切换到另一个…)。

为了回答你的上一个问题,使用Spring(性能稍差)性能更差,但更灵活。

编辑: Spring不是唯一可以用于DI的工具,但它是最受欢迎的,它包含很多function。 请注意,许多Java标准(例如JPA)也使用DI。