建立Bean對象的三種方式
-
- 預設構造方法建立
- 執行個體工廠建立
- 靜态工廠建立
- Bean的作用範圍
預設構造方法建立
預設的建立Bean的方式是構造方法建立,如果沒有構造方法将無法建立我們隻需在配置檔案中配置如下,跟上一章springIoc入門案例配置相同。還以儲存使用者為例。
- bean.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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
第一種方式:預設構造方法
配置好bean标簽的id和class屬性後,沒有配置其他的屬性和标簽時,采用的就是
預設構造方法建立執行個體,如果沒有預設構造函數無法建立執行個體。
-->
<bean id="userService" class="com.zy.service.impl.UserServiceImpl"></bean>
</beans>
- 測試類:
public class IocTest {
public static void main(String[] args) {
//加載配置檔案
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
//根據bean标簽的id擷取執行個體對象
UserService userService = (UserService) context.getBean("userService");
//調用方法
userService.saveUser();
}
}
- 運作結果:
Spring中建立Bean對象的方式及Bean的作用範圍
執行個體工廠建立
通過執行個體工廠來建立,我們先factory包下編寫一個工廠類InstanceFactory ,寫一個傳回值為UserServiceImpl的createUserService()方法
- 執行個體工廠
public class InstanceFactory {
//模拟執行個體工廠建立對象
public UserService createUserService() {
System.out.println("--- 通過執行個體工廠建立對象 ---");
return new UserServiceImpl();
}
}
- bean.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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
第二種方式:通過執行個體工廠
首先通過bean标簽執行個體化工廠類,在通過factory-bean屬性引用執行個體化的工廠
factory-method屬性配置工廠類中的方法
-->
<bean id="instanceFactory" class="org.example.factory.InstanceFactory"/>
<bean id="createUserService" factory-bean="instanceFactory" factory-method="createUserService"/>
</beans>
靜态工廠建立
通過靜态工廠來建立,我們先在factory包下編寫一個名為staticFactory 工廠類,寫一個傳回值為UserServiceImpl的createUserService()方法并添加static關鍵字修飾。
- 靜态工廠類
public class StaticFactory {
//模拟靜态工廠建立對象
public static UserService createUserService(){
System.out.println("--- 通過靜态工廠建立對象 ---");
return new UserServiceImpl();
}
}
- bean.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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--靜态工廠建立對象-->
<bean id="staticFactory" class="org.example.factory.StaticFactory" factory-method="createUserService"/>
</beans>
Bean的作用範圍
通過xml方式交給spring容器建立對象時,也是可以指定Bean的作用範圍,通過scope=""來設定,預設是單例模式
範圍 | 作用描述 |
---|---|
singleton | Spring中預設的作用範圍是一個單例的模式,IOC容器中隻會有一個bean定義的執行個體 |
prototype | 多例的,每次調用getBean()方法擷取bean标簽的作用範圍為prototype時,都會産生新的執行個體 |
request | 應用在web項目中,Spring建立這個類以後,将這個類存入到request範圍中 |
session | 應用在web項目中,Spring建立這個類以後,将這個類存入到session範圍中 |
globalsession | 應用在web項目中,必須在porlet環境下使用。但是如果沒有這種環境,相對于session |
單例模式(預設的模式):
原型模式(多例的):