Spring配置bean的方法(工廠方法和Factorybean)


通過工廠方法配置bean

  

  通過調用靜態工廠方法創建bean
    通過靜態工廠方法創建bean是將對象創建的過程封裝到靜態方法中。當客戶端需要對象時,只需要簡單地調用靜態方法,而不關心創建對象的細節。
    要聲明通過靜態方法創建的bean,需要在bean的class屬性里指定擁有該工廠的方法的類,通知在factory-method屬性里指定工廠方法的名稱,

    最后,使用<constructor-arg>元素為該方法傳遞方法參數
  通過調用實例工廠方法創建bean
    實例工廠方法:將對象的創建過程封裝到另外一個對象實例的方法里。當客戶端需要請求對象時,只需要簡單的調用該實例方法而不需關心對象的創建細節。
    要聲明通過實例工廠方法創建的bean:
      -在bean的factory-bean屬性里指定擁有該工廠方法的bean
      -在factory-method屬性里指定該工廠方法的名稱
      -使用constructor-arg元素為工廠方法傳遞方法參數

靜態工廠類:

 

 1 package com.yl.factory;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 /**
 7  * 靜態工廠方法:直接調用某一個類的靜態方法就可與返回bean的實例
 8  * @author yul
 9  *
10  */
11 public class StaticCarFactory {
12     
13     private static Map<String, Car> cars = new HashMap<String, Car>();
14     
15     static {
16         cars.put("audi", new Car("audi", 300000));
17         cars.put("ford", new Car("ford", 300000));
18     }
19     /**
20      * 靜態工廠方法
21      * @param name
22      * @return
23      */
24     public static Car getCar(String name) {
25         
26         return cars.get(name);
27     }
28 }

實例工廠類:

 1 package com.yl.factory;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 /***
 6  * 實例工廠方法:實例工廠的方法,即現需要創建工廠本身,在調用工廠的實例方法來返回bean的實例
 7  * @author yul
 8  *
 9  */
10 public class InstanceCarFactory {
11     
12     private Map<String, Car> cars = new HashMap<String, Car>();
13     
14     public InstanceCarFactory() {
15         cars = new HashMap<String, Car>();
16         cars.put("audi", new Car("audi", 300000));
17         cars.put("ford", new Car("ford", 400000));
18     }
19     
20     public Car getCar(String brand) {
21         return cars.get(brand);
22     }
23 }

工廠方法的配置文件:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 5 
 6     <!-- 通過靜態工廠方法來配置bean,注意不是配置靜態工廠方法實例,而是配置bean實例 -->
 7     <!-- 
 8         class屬性:指向靜態工廠方法的全類名
 9         factory-method:指向靜態工廠方法的名字
10         constructor-arg:如果靜態工廠方法需要傳入參數,則使用constructor-arg來配置參數
11      -->
12     <bean id="car1" 
13         class="com.yl.factory.StaticCarFactory"
14         factory-method="getCar">
15         <constructor-arg value="audi"></constructor-arg>
16     </bean>
17     
18     <!-- 配置工廠的實例 -->
19     <bean id="carFactory" class="com.yl.factory.InstanceCarFactory"></bean>
20     
21     <!-- 
22         factory-bean:指向實例工廠方法的bean
23         factory-method:指向實例工廠方法的名字
24         constructor-arg:如果實例工廠方法需要傳入參數,則使用constructor-arg來配置參數
25      -->
26     <!-- 通過實例工廠方法來配置bean -->
27     <bean id="car2" factory-bean="carFactory" factory-method="getCar">
28         <constructor-arg value="ford"></constructor-arg>
29     </bean>
30 </beans>

 

通過Factorybean配置bean

 繼承Factorybean的實現類:

 1 package com.yl.factorybean;
 2 
 3 import org.springframework.beans.factory.FactoryBean;
 4 //自定義的Factorybean需要實現FactoryBean接口
 5 public class CarFactoryBean implements FactoryBean<Car> {
 6     
 7     private String brand;
 8     
 9     public void setBrand(String brand) {
10         this.brand = brand;
11     }
12     
13     /**
14      * 返回bean的對象
15      */
16     @Override
17     public Car getObject() throws Exception {
18         // TODO Auto-generated method stub
19         return new Car("BMW", 600000);
20     }
21     /**
22      * 返回bean的類型
23      */
24     @Override
25     public Class<?> getObjectType() {
26         // TODO Auto-generated method stub
27         return Car.class;
28     }
29     
30     @Override
31     public boolean isSingleton() {
32         // TODO Auto-generated method stub
33         return true;
34     }
35     
36 }

配置文件:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 5     <!-- 
 6         通過Factorybean來配置bean的實例
 7         class:指向Factorybean的全類名
 8         property:配置Factorybean的屬性
 9         
10         但實際返回的實例卻是Factorybean的getObject()方法返回的實例
11      -->
12     <bean id="car" class="com.yl.factorybean.CarFactoryBean">
13         <property name="brand" value="BMW"></property>
14     </bean>
15 </beans>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM