您好,登錄后才能下訂單哦!
這篇文章主要講解了“Spring-IOC的基礎內容有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Spring-IOC的基礎內容有哪些”吧!
BeanFactory是Spring框架中IoC容器的頂層接口,它只是用來定義?些基礎功能,定義?些基礎規范,而ApplicationContext是它的?個子接口,所以ApplicationContext是具備BeanFactory提供的全部功能的。
通常,我們稱BeanFactory為SpringIOC的基礎容器,ApplicationContext是容器的高級接口,比BeanFactory要擁有更多的功能,比如說國際化支持和資源訪問(xml,java配置類)等等
啟動 IoC 容器的方式
Java環境下啟動IoC容器
ClassPathXmlApplicationContext:從類的根路徑下加載配置文件(推薦使?)
FileSystemXmlApplicationContext:從磁盤路徑上加載配置文件
AnnotationConfigApplicationContext:純注解模式下啟動Spring容器
Web環境下啟動IoC容器
從xml啟動容器
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!--配置Spring ioc容器的配置?件--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!--使?監聽器啟動Spring的IOC容器--> <listener> <listener- class>org.springframework.web.context.ContextLoaderListener</listener- class> </listener> </web-app>
從配置類啟動容器
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!--告訴ContextloaderListener知道我們使?注解的?式啟動ioc容器--> <context-param> <param-name>contextClass</param-name> <param- value>org.springframework.web.context.support.AnnotationConfigWebAppli cationContext</param-value> </context-param> <!--配置啟動類的全限定類名--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>com.bxc.SpringConfig</param-value> </context-param> <!--使?監聽器啟動Spring的IOC容器--> <listener> <listener- class>org.springframework.web.context.ContextLoaderListener</listener- class> </listener> </web-app>
本部分內容我們不采用??講解知識點的方式,而是采用Spring IoC 純 xml 模式改造我們前面手寫的IoC 和 AOP 實現,在改造的過程中,把各個知識點串起來。
xml 文件頭
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
實例化Bean的三種方式
方式一:使用無參構造函數
在默認情況下,它會通過反射調用無參構造函數來創建對象。如果類中沒有無參構造函數,將創建失敗。
<!--配置service對象--> <bean id="userService" class="com.bxc.service.impl.TransferServiceImpl"> </bean>
方式二:使用靜態方法創建
在實際開發中,我們使用的對象有些時候并不是直接通過構造函數就可以創建出來的,它可能在創建的過程中會做很多額外的操作。此時會提供?個創建對象的方法,恰好這個方法是static修飾的方法,即是此種情況。例如,我們在做Jdbc操作時,會用到java.sql.Connection接口的實現類,如果是mysql數據庫,那么用的就是JDBC4Connection,但是我們不會去寫
JDBC4Connection connection = new JDBC4Connection()
因為我們要注冊驅動,還要提供URL和憑證信息,用DriverManager.getConnection 方法來獲取連接。那么在實際開發中,尤其早期的項目沒有使用Spring框架來管理對象的創建,但是在設計時使用了工廠模式解耦,那么當接入spring之后,工廠類創建對象就具有和上述例子相同特征,即可采用此種方式配置。
<!--使?靜態?法創建對象的配置?式--> <bean id="userService" class="com.bxc.factory.BeanFactory" factory-method="getTransferService"></bean>
方式三:使用實例化方法創建
此種方式和上面靜態方法創建其實類似,區別是用于獲取對象的方法不再是static修飾的了,而是類中的一個普通方法。此種方式比靜態方法創建的使用幾率要高?些。在早期開發的項目中,工廠類中的方法有可能是靜態的,也有可能是非靜態方法,當是非靜態方法時,即可采用下面的配置方式:
<!--使?實例?法創建對象的配置?式--> <bean id="beanFactory" class="com.bxc.factory.instancemethod.BeanFactory"></bean> <bean id="transferService" factory-bean="beanFactory" factory- method="getTransferService"></bean>
Bean的X及生命周期
作用范圍的改變
在spring框架管理Bean對象的創建時,Bean對象默認都是單例的,但是它支持配置的方式改變作用范圍。作用范圍官方提供的說明如下圖:
在上圖中提供的這些選項中,我們實際開發中用到最多的作用范圍就是singleton(單例模式)和prototype(原型模式,也叫多例模式)。配置方式參考下面的代碼:
<!--配置service對象--> <bean id="transferService" class="com.bxc.service.impl.TransferServiceImpl" scope="singleton"> </bean>
不同作用范圍的生命周期
單例模式:singleton
對象出生:當創建容器時,對象就被創建了。
對象活著:只要容器在,對象?直活著。
對象死亡:當銷毀容器時,對象就被銷毀了。
?句話總結:單例模式的bean對象生命周期與容器相同。
多例模式:prototype
對象出生:當使用對象時,創建新的對象實例。
對象活著:只要對象在使用中,就?直活著。
對象死亡:當對象長時間不用時,被java的垃圾回收器回收了。
?句話總結:多例模式的bean對象,spring框架只負責創建,不負責銷毀。
Bean標簽屬性
在基于xml的IoC配置中,bean標簽是最基礎的標簽。它表示了IoC容器中的?個對象。換句話說,如果?個對象想讓spring管理,在XML的配置中都需要使用此標簽配置,Bean標簽的屬性如
下:
id屬性: 用于給bean提供?個唯?標識。在?個標簽內部,標識必須唯?。
class屬性:用于指定創建Bean對象的全限定類名。
name屬性:用于給bean提供?個或多個名稱。多個名稱?空格分隔。
factory-bean屬性:用于指定創建當前bean對象的工廠bean的唯?標識。當指定了此屬性之后,class屬性失效。
factory-method屬性:用于指定創建當前bean對象的工廠方法,如配合factory-bean屬性使用,則class屬性失效。如配合class屬性使用,則方法必須是static的。
scope屬性:用于指定bean對象的作用范圍。通常情況下就是singleton。當要用到多例模式時,可以配置為prototype。
init-method屬性:用于指定bean對象的初始化方法,此方法會在bean對象裝配后調用。必須是?個無參方法。
destory-method屬性:用于指定bean對象的銷毀方法,此方法會在bean對象銷毀前執行。它只能為scope是singleton時起作用。
DI 依賴注入的xml配置
按照注入的方式分類
按照注入的數據類型分類
構造函數注入:顧名思義,就是利用帶參構造函數實現對類成員的數據賦值。
set方法注入:它是通過類成員的set方法實現數據的注?。(使用最多的)
基本類型和String 注入的數據類型是基本類型或者是字符串類型的數據。
其他Bean類型 注入的數據類型是對象類型,稱為其他Bean的原因是,這個對象是要求出現在IoC容器中的。那么針對當前Bean來說,就是其他Bean了。
復雜類型(集合類型)注入的數據類型是Aarry,List,Set,Map,Properties中的?種類型。
依賴注入分類
依賴注入的配置實現之構造函數注入 顧名思義,就是利用構造函數實現對類成員的賦值。它的使用要求是,類中提供的構造函數參數個數必須和配置的參數個數?致,且數據類型匹
配。同時需要注意的是,當沒有無參構造時,則必須提供構造函數參數的注入,否則Spring框架會報錯。
在使用構造函數注入時,涉及的標簽是 constructor-arg ,該標簽有如下屬性:
name:用于給構造函數中指定名稱的參數賦值。
index:用于給構造函數中指定索引位置的參數賦值。
value:用于指定基本類型或者String類型的數據。
ref:用于指定其他Bean類型的數據。寫的是其他bean的唯?標識。
依賴注入的配置實現之set方法注入
顧名思義,就是利用字段的set方法實現賦值的注入方式。此種方式在實際開發中是使用最多的注入方式。
在使用set方法注入時,需要使用 property 標簽,該標簽屬性如下:
name:指定注入時調用的set方法名稱。(注:不包含set這三個字母,druid連接池指定屬性名稱)
value:指定注入的數據。它支持基本類型和String類型。
ref:指定注入的數據。它支持其他bean類型。寫的是其他bean的唯?標識。
復雜數據類型注入 首先,解釋?下復雜類型數據,它指的是集合類型數據。集合分為兩類,?類是List結構(數組結構),?類是Map接口(鍵值對) 。
接下來就是注入的方式的選擇,只能在構造函數和set方法中選擇,我們的示例選用set方法注入。
在List結構的集合數據注入時, array , list , set 這三個標簽通用,另外注值的 value 標簽內部可以直接寫值,也可以使用 bean 標簽配置?個對象,或者用 ref 標簽引用?個已經配合的bean的唯?標識。
在Map結構的集合數據注?時, map 標簽使用 entry 子標簽實現數據注入, entry 標簽可以使用key和value屬性指定存?map中的數據。使用value-ref屬性指定已經配置好的bean的引用。同時 entry 標簽中也可以使用 ref 標簽,但是不能使用 bean 標簽。而 property 標簽中不能使用 ref 或者 bean 標簽引用對象
1.3 xml與注解相結合模式
注意:
1)實際企業開發中,純xml模式使用已經很少了
2)引入注解功能,不需要引入額外的jar
3)xml+注解結合模式,xml文件依然存在,所以,spring IOC容器的啟動仍然從加載xml開始
4)哪些bean的定義寫在xml中,哪些bean的定義使用注解
第三方jar中的bean定義在xml,比如德魯伊數據庫連接池
自己開發的bean定義使用注解
xml中標簽與注解的對應(IoC)
DI 依賴注入的注解實現方式
@Autowired(推薦使用)
@Autowired為Spring提供的注解,需要導入包 org.springframework.beans.factory.annotation.Autowired。
@Autowired采取的策略為按照類型注入。
public class TransferServiceImpl { @Autowired private AccountDao accountDao; }
如上代碼所示,這樣裝配回去spring容器中找到類型為AccountDao的類,然后將其注入進來。這樣會產生?個問題,當?個類型有多個bean值的時候,會造成無法選擇具體注?哪?個的情況,
這個時候我們需要配合著@Qualifier使用。@Qualifier告訴Spring具體去裝配哪個對象。
public class TransferServiceImpl { @Autowired @Qualifier(name="jdbcAccountDaoImpl") private AccountDao accountDao; }
這個時候我們就可以通過類型和名稱定位到我們想注入的對象。
@Resource
@Resource 注解由 J2EE 提供,需要導?包 javax.annotation.Resource。
@Resource 默認按照 ByName 自動注入。
public class TransferService { @Resource private AccountDao accountDao; @Resource(name="studentDao") private StudentDao studentDao; @Resource(type="TeacherDao") private TeacherDao teacherDao; @Resource(name="manDao",type="ManDao") private ManDao manDao; }
如果同時指定了 name 和 type,則從Spring上下文中找到唯?匹配的bean進行裝配,找不到則拋出異常。
如果指定了 name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常。
如果指定了 type,則從上下文中找到類似匹配的唯?bean進行裝配,找不到或是找到多個,都會拋出異常。
如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;
注意:
@Resource 在 Jdk 11中已經移除,如果要使用,需要單獨引入jar包
<dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency>
改造xml+注解模式,將xml中遺留的內容全部以注解的形式遷移出去,最終刪除xml,從Java配置類啟動
對應注解
@Configuration 注解,表名當前類是?個配置類
@ComponentScan 注解,替代 context:component-scan
@PropertySource,引?外部屬性配置文件
@Import 引?其他配置類
@Value 對變量賦值,可以直接賦值,也可以使用 ${} 讀取資源配置文件中的信息
@Bean 將方法返回對象加? SpringIOC 容器
感謝各位的閱讀,以上就是“Spring-IOC的基礎內容有哪些”的內容了,經過本文的學習后,相信大家對Spring-IOC的基礎內容有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。