1. 程式人生 > >Spring中IoC兩種介面和兩種依賴注入方式的比較

Spring中IoC兩種介面和兩種依賴注入方式的比較

spring是一個開源框架,是為了解決企業應用程式開發的複雜性而建立的,為J2EE應用程式開發提供整合的框架。簡單來說,spring是一個輕量級的控制反轉IOC和麵向切面AOP的容器框架。spring框架會對定義在配置檔案中的bean例項自動管理,這個bean也就是Java例項,Java元件,spring既可以管理標準的javabean,又可以管理普通的Java元件。

spring框架包含許多特徵,並被很好的組織在如下六大模組中:


spring框架中,最基礎,最核心的功能是控制反轉IoC,面向切面和宣告式事物等功能都依賴於控制反轉的實現,為了實現控制反轉的功能,

spring提供了兩個訪問介面。

Spring中實現IoC的兩種介面介紹

org.springframework.beans.factory.BeanFactoryBean工廠,藉助配置檔案能夠實現對JavaBean的配置和管理,用於向使用者提供Bean例項。

org.springframework.context.ApplicationContextApplicationContext構建在BeanFactory的基礎上,提供了更多的實用功能。

配置檔案程式碼如下:

<?xmlversion="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<beanid="book" class="book.Book">
<propertyname="name" value="ssh開發"></property>
<propertyname="author" value="李白"></property>
<propertyname="publishHouse" value="某出版社"></property>
<propertyname="price" value="70"></property>
</bean>
 
</beans>


分別使用以上兩種方法裝載配置檔案,進行對比:

一,使用BeanFactory

publicclass BeanFactoryExample {
 
publicstatic void main(String[] args) {
//TODO Auto-generated method stub
ClassPathResourceresource=new ClassPathResource("applicationContext.xml");
DefaultListableBeanFactoryfactory=new DefaultListableBeanFactory();
XmlBeanDefinitionReaderreader=new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(resource);//載入配置檔案
Bookbook=(Book)factory.getBean("book");
/*DefaultListableBeanFactory中的getBean()方法從容器中獲得Bean物件*/
System.out.println(book.getName());
System.out.println(book.getAuthor());
System.out.println(book.getPublishHouse());
System.out.println(book.getPrice());
}
}


二,使用ApplicationContext

publicclass ApplicationContextExample {
publicstatic void main(String[] args) {
//TODO Auto-generated method stub
ClassPathXmlApplicationContextcontext=
newClassPathXmlApplicationContext("applicationContext.xml");
Bookbook=(Book)context.getBean("book");
System.out.println(book.getName());
System.out.println(book.getAuthor());
System.out.println(book.getPublishHouse());
System.out.println(book.getPrice());
context.close();
/*ClassPathXmlApplicationContext類實現了java.io.Closeable介面,所以用完要呼叫close()方法關閉*/
}
}


兩種測試執行結果是一致的:

ssh開發

李白

某出版社

70

那麼,在開發中到底選擇哪個介面更合適呢?


Spring物件屬性的注入方式有兩種:設值注入和構造注入。

1.設值注入:

<bean id="people" class="com.abc.People">
   <property name="name" value="熊九天" /> <!-- 設值注入 -->
   <property name="school" ref="school" /> <!-- 設值注入 -->
   <property name="age" value="20" type="int" />
</bean>
<bean id="school" class="com.abc.School" />

2.構造注入:

<bean id="people" class="com.abc.People">
    <!-- 構造注入,index=0表示構造器的第一個引數 -->
   <constructor-arg index="0" value="熊九天"/> 
   <constructor-arg index="1" ref="school" /> <!-- 構造注入 -->
   <constructor-arg index="2" value="20" type="int" />
</bean>
<bean id="school" class="com.abc.School" />

兩者的區別和使用場景:

在過去的開發過程中,這兩種注入方式都是非常常用的。Spring也同時支援兩種依賴注入方式:設值注入和構造注入。  這兩種依賴注入的方式,並沒有絕對的好壞,只是適應的場景有所不同。 相比之下,設值注入有如下優點:

  • 設值注入需要該Bean包含這些屬性的setter方法
  • 與傳統的JavaBean的寫法更相似,程式開發人員更容易理解、接收。通過setter方法設定依賴關係顯得更加只管。
  • 對於複雜的依賴關係,如果採用構造注入,會導致構造器國語臃腫,難以閱讀。Spring在建立Bean例項時,需要同時例項化器依賴的全部例項,因而導致效能下降。而使用設值注入,則能避免這些問題
  • 尤其是在某些屬性可選的情況況下,多引數的構造器顯得更加笨重

構造注入也不是絕對不如設值注入,在某些特定的場景下,構造注入比設值注入更加優秀。構造注入有以下優勢:

  • 構造注入需要該Bean包含帶有這些屬性的構造器
  • 構造注入可以在構造器中決定依賴關係的注入順序,優先依賴的優先注入。例如,元件中其他依賴關係的注入,常常要依賴於DataSrouce的注入。採用構造注入,可以在程式碼中清晰的決定注入順序。
  • 對於依賴關係無需變化的Bean,構造注入更有用處。因為沒有Setter方法,所有的依賴關係全部在構造器內設定。因此,無需擔心後續的程式碼對依賴關係產生破壞。
  • 依賴關係只能在構造器中設定,則只有元件的建立者才能改變元件的依賴關係。對元件的呼叫者而言,元件內部的依賴關係完全透明,更符合高內聚的原則。

建議:採用以設值注入為主,構造注入為輔的注入策略。對於依賴關係無需變化的注入,儘量採用構造注入;而其他的依賴關係的注入,則考慮採用設值注入。