IOC
- Spring 中 Bean 工廠裏面的 Map 存儲結構(存儲了 Bean 的實例)。
Spring API 體系結構
BeanFactory 與 ApplicationContext 的區別
BeanFactory 纔是 Spring 容器中的頂層接口。
ApplicationContext 是它的子接口。
BeanFactory 和 ApplicationContext 的區別:
創建對象的時間點不一樣。
ApplicationContext:適用於單例對象
只要一讀取配置文件,默認情況下就會創建對象。
BeanFactory:適用於多例對象
什麼使用什麼時候創建對象。
ApplicationContext 接口的實現類
FileSystemXmlApplicationContext:配置文件在本地磁盤上,使用該類加載。
ClassPathXmlApplicationContext :配置文件在classpath中,使用此類加載。
AnnotationConfigApplicationContext: 當我們使用註解配置容器對象時,需要使用此類來創建 spring 容器。它用來讀取註解。
bean
bean 標籤
作用:
用於配置對象讓 spring 來創建的。
默認情況下它調用的是類中的無參構造函數。如果沒有無參構造函數則不能創建成功。
屬性:
id:給對象在容器中提供一個唯一標識。用於獲取對象。
class:指定類的全限定類名。用於反射創建對象。默認情況下調用無參構造函數。
scope:指定對象的作用範圍。
* singleton :默認值,單例的.
* prototype :多例的.
* request :WEB 項目中,Spring 創建一個 Bean 的對象,將對象存入到 request 域中.
* session :WEB 項目中,Spring 創建一個 Bean 的對象,將對象存入到 session 域中.
* global session :WEB 項目中,應用在 Portlet 環境.如果沒有 Portlet 環境那麼
globalSession 相當於 session.
init-method:指定類中的初始化方法名稱。
destroy-method:指定類中銷燬方法名稱。
靜態工廠
factory-method:指定生產對象的靜態方法
實例工廠
factory-bean 屬性:用於指定實例工廠 bean 的 id。
factory-method 屬性:用於指定實例工廠中創建對象的方法。
依賴注入
構造函數
constructor-arg
* name:指定參數在構造函數中的名稱
* value:它能賦的值是基本數據類型和 String 類型
* ref:它能賦的值是其他 bean 類型,也就是說,必須得是在配置文件中配置過的 bean
Set方法
property
* name:找的是類中 set 方法後面的部分
* value:給屬性賦值是基本數據類型和 string 類型的
* ref:給屬性賦值是其他 bean 類型的
注入集合屬性
List 結構的:
array,list,set
Map 結構的
map,entry,props,prop
* value
bean 的作用範圍和生命週期
單例對象:scope="singleton"
一個應用只有一個對象的實例。它的作用範圍就是整個引用。
生命週期:
對象出生:當應用加載,創建容器時,對象就被創建了。
對象活着:只要容器在,對象一直活着。
對象死亡:當應用卸載,銷燬容器時,對象就被銷燬了。
多例對象:scope="prototype"
每次訪問對象時,都會重新創建對象實例。
生命週期:
對象出生:當使用對象時,創建新的對象實例。
對象活着:只要對象在使用中,就一直活着。
對象死亡:當對象長時間不用時,被 java 的垃圾回收器回收了。
實例化 bean 的三種方式
默認無參構造
實現類
public class UserServiceImpl implements UserService {
private UserDao dao = new UserDaoimpl();
public void saveUser() {
dao.saveUser();
}
}
配置文件
<!--在默認情況下:它會根據默認無參構造函數來創建類對象。如果 bean 中沒有默認無參構造函數,將會創建失敗。-->
<bean id="UserService"
class="com.itheima.service.impl.UserServiceImpl"></bean>
管理靜態工廠
實現類
public class StaticFactory {
public static IAccountService createAccountService(){
return new AccountServiceImpl();
}
}
配置文件
<!-- 此種方式是:使用 StaticFactory 類中的靜態方法 createAccountService 創建對象,並存入 spring 容器-->
<bean id="accountService"
class="com.itheima.factory.StaticFactory"
factory-method="createAccountService"></bean>
管理實例工廠
實現類
public class InstanceFactory {
public IAccountService createAccountService(){
return new AccountServiceImpl();
}
}
配置文件
<bean id="instancFactory" class="com.itheima.factory.InstanceFactory"></bean>
<bean id="accountService"
factory-bean="instancFactory"
factory-method="createAccountService"></bean>