what is the difference between using or not Spring Beans?
也许我会得到很多的反对票,但是对于我来说,是否使用bean这个事实实在是太令人困惑了。假设这个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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... } } |
因此,要注射iccurrency impl injection,我认为我可以通过两种方式来实现:
方式一:不含豆子
1 2 3 4 5 6 7 8 9 10 11 12 | public class CurrencyOperator { private ICurrency currency ; private CurrencyProcessor processor; public void operateDefault(){ currency = new USDollarCurrency(); processor = new CurrencyProcessor(currency) this.processor.doOperation(); } } |
其中usdollarcurrency是一个icurrency接口实现
方法二:使用春豆
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | @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'sBeans有什么好处。我读了一些东西,但我发现使用DI的好处,而且据我所知,这两种方法都注入了货币处理器所需的依赖性,我创建和使用objets的方式发生了什么变化,是不是我错了?所以具体来说,我的问题是:1。在这种情况下使用bean有什么好处?2。为什么我应该使用弹簧而不是像第一种方法那样手动操作?三。说到性能,哪种情况更好?
假设您有两个DAO类,一个用于Oracle,另一个用于MySQL,这两个类都在实现一个DAO接口。在Spring配置文件中将实现定义为bean。在业务类中,您有一个类型为DAO的属性,而在Spring配置文件中,您选择要注入的实际类型whather oracle或mysql,或者使用Spring注释
这样就减少了耦合,很容易从Oracle迁移到MySQL。
1 2 3 4 5 6 7 | @Service public class Business { @Autowired private Dao daoImpl; //Business methods that invoks Dao methods } |
在Spring配置文件(XML文件)中,使用以下内容:
1 | <bean id="daoImpl" class="app.com.MySQLDaoImpl OR app.com.OracleDaoImpl"/> |
只需更改bean的类属性,就可以更改整个实现,而不必更改业务类!祝你好运。
没有Spring的例子不依赖于注入!通过依赖注入,接口的实际实现是在代码本身之外确定的,以减少耦合!
您应该能够需要另一个实现(例如,您可以从一个JMS客户机切换到另一个…)。
为了回答最后一个问题,使用弹簧(有一点)的性能要差一些,但要灵活得多。
编辑:Spring不是唯一可以用于DI的工具,但它是最流行的,它包含很多特性。注意,许多Java标准(如JPA)使用DI。