[原创]java WEB学习笔记102:Spring学习---Spring Bean配置:bean配置方式(工厂方法(静态工厂方法 & 实例工厂方法)、FactoryBean) 全类名

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

全类名方式最简单,最普遍

1.通过调用静态工厂方法创建 Bean

  1)调用静态工厂方法创建 Bean是将对象创建的过程封装到静态方法中. 当客户端需要对象时, 只需要简单地调用静态方法, 而不同关心创建对象的细节.

  2)要声明通过静态方法创建的 Bean, 需要在 Bean 的 class 属性里指定拥有该工厂的方法的类, 同时在 factory-method 属性里指定工厂方法的名称. 最后, 使用 <constrctor-arg> 元素为该方法传递方法参数.

StaticCarFactory 
 1 package com.jason.spring.beans.factory;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 
 7 /**
 8  * 
 9  * @ClassName:StaticCarFactory
10  * @Description:
11  * 静态工程方法:直接调用一个类的静态方法就可以放回bean 的实例
12  * 
13  */
14 public class StaticCarFactory {
15     
16     private static Map<String, Car> cars =  new HashMap<String, Car>();
17     
18     static{
19         cars.put("audi", new Car("audi", 300000));
20         cars.put("ford", new Car("ford", 400000));
21         
22     }
23     
24     //静态工场方法
25     public static Car getCar(String name){
26         return cars.get(name);
27     }
28 
29 }

 

Car

 1 package com.jason.spring.beans.factory;
 2 
 3 public class Car {
 4     private String brand;
 5     private double price;
 6 
 7     public String getBrand() {
 8         return brand;
 9     }
10 
11     public void setBrand(String brand) {
12         this.brand = brand;
13     }
14 
15     public double getPrice() {
16         return price;
17     }
18 
19     public void setPrice(double price) {
20         this.price = price;
21     }
22 
23     @Override
24     public String toString() {
25         return "Car [brand=" + brand + ", price=" + price + "]";
26     }
27 
28     public Car(String brand, double price) {
29         super();
30         this.brand = brand;
31         this.price = price;
32     }
33 
34 }

 

beans-factory.xml

 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" class="com.jason.spring.beans.factory.StaticCarFactory" factory-method="getCar">
13         <constructor-arg value="audi"></constructor-arg>
14     </bean>
15 
16 </beans>

 

 

 

2.实例工场方法

InstanceCarFactory 

 

 1 package com.jason.spring.beans.factory;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 /**
 7  * 
 8  * @ClassName:InstanceCarFactory
 9  * @Description:
10  * 
11  * 实例工工厂方法:实例工厂的方法,即需要创建工场本身,再调用工场的方法返回bean的实例
12  */
13 
14 public class InstanceCarFactory {
15     
16     private Map<String, Car> cars = null;
17     
18      public InstanceCarFactory(){
19          cars  = new HashMap<String, Car>();
20          cars.put("audi", new Car("audi", 300000));
21          cars.put("ford", new Car("ford", 500000));
22          
23      }
24      
25      public Car getCar(String brand){
26          return cars.get(brand);
27      }
28 
29 }

 

 

bean-factory.xml

 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 <!-- 配置工厂的实例 -->
 7     <bean id="instanceCarFactory" class="com.jason.spring.beans.factory.InstanceCarFactory" ></bean>
 8     
 9     <!-- 通过实例工厂方法来配置bean -->
10     <!-- 
11         factory-bean 属性:指向实例工厂的方法的bean
12         factory-method:指向实例工厂方法的名字
13         constructor-arg:如果工场方法需要传入参数,则使用constructor-arg 指定参数
14      -->
15     <bean id="car2" factory-bean="instanceCarFactory" factory-method="getCar">
16         <constructor-arg value="ford"></constructor-arg>
17     </bean>
18     
19 </beans>

 

 

 

3.FactoryBean

  1)实现 FactoryBean 接口在 Spring IOC 容器中配置 Bean

  2)Spring 中有两种类型的 Bean, 一种是普通Bean, 另一种是工厂Bean, 即FactoryBean. 

  3)工厂 Bean 跟普通Bean不同, 其返回的对象不是指定类的一个实例, 其返回的是该工厂 Bean 的 getObject 方法所返回的对象

        

  

 

  

CarFactoryBean 

 

 1 package com.jason.spring.beans.factory;
 2 
 3 import org.springframework.beans.factory.FactoryBean;
 4 
 5 public class CarFactoryBean implements FactoryBean<Car>{
 6 
 7     //自定义的FactoryBean 需要实现 FactoryBean 接口
 8     
 9     private String brand;
10     
11     public void setBrand(String brand) {
12         this.brand = brand;
13     }
14     
15     //返回bean 对 象
16     @Override
17     public Car getObject() throws Exception {
18         return new Car(brand, 50);
19     }
20 
21     @Override
22     public Class<?> getObjectType() {
23         
24         return Car.class;
25     }
26 
27     @Override
28     public boolean isSingleton() {
29         
30         return true;
31     }
32 
33 }

 

 

 

 1 <!-- 通过FactoryBean 类配置bean的实例
 2          class: 指向FatoryBean 的全类名
 3          property:配置FactoryBean 的属性
 4          
 5          但实际返回的是:FatoryBean 的getObject() 方法返回的实例
 6      -->
 7     
 8     <bean id="car3" class="com.jason.spring.beans.factory.CarFactoryBean">
 9         <property name="brand" value="audi"></property>
10     </bean>

 

posted @ 2016-10-16 21:52  jason_zhangz  阅读(552)  评论(0编辑  收藏  举报