Spring学习笔记18--通过工厂方法配置Bean

spring通过工厂方法配置Bean

1.通过调用静态工厂方法创建bean(直接调用某一个类的静态方法就可以返回bean的实例)

调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单的调用静态方法,
而不关心创建对象的细节。
要声明通过静态方法创建bean:
   1.需要在bean的class属性里指定拥有该方法的类,
   2.同时在factory-method属性里指定工厂方法的名称,
   3.最后,使用<constrctor-arg>元素为该方法传递方法参数。
[html] view plain copy
 
  1. <!--  
  2.             通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是bean实例,  
  3.     且注意对应类是包含静态工厂方法的类  
  4.     class属性:指向静态工厂方法的全类名  
  5.     factory-method:指向静态工厂方法中的名字  
  6.     constructor-arg:如果某工厂方法需要传入参数,则使用constructor-arg来配置参数  
  7.     -->  
  8. <bean id="car1"  
  9.    class="com.wul.spring.bean.factory.StaticCarFactory"  
  10.    factory-method="getCar">  
  11.    <constructor-arg value="audi"></constructor-arg>  
  12. </bean>  

2.通过调用实例工厂方法创建bean(即先需要创建工厂bean本身,再调用工厂的实例方法来返回bean的实例)

实例工厂方法:将对象的创建过程封装到另外一个对象实例方法里,当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。
 
  1.先声明实例工厂类的bean
声明通过实例工厂方法创建的bean:
  2.在bean的factory-bean属性里指定拥有该该工厂方法的bean
  3.在factory-method属性里指定该工厂方法的名称。
  4.使用constructor-arg元素为工厂方法传递方法参数。
[html] view plain copy
 
  1. <!-- 1.配置工厂的实例 -->  
  2. <bean id="carFactory"   
  3.       class="com.wul.spring.bean.factory.InstanceCarFactory"></bean>  
  4. <!--   
  5.     2.通过实例工厂来配置bean     
  6.         class属性:指向实例工厂方法的全类名  
  7.         factory-method:指向实例工厂方法的名字  
  8.         constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数  
  9. -->   
  10.  <bean id="car2" factory-bean="carFactory"  
  11.       factory-method="getCar">  
  12.       <constructor-arg value="ford"></constructor-arg>  
  13.  </bean>  

3.spring通过FactoryBean配置

当配置的bean里需要引用其他的bean------------通过FactoryBean配置是最好的方式

1.自定义的Factory需要实现FactoryBean接口
[java] view plain copy
 
  1. public class CarFactoryBean implements FactoryBean<Car>{  
  2.   
  3.     private String brand;  
  4.       
  5.     public void setBrand(String brand) {  
  6.         this.brand = brand;  
  7.     }  
  8.       
  9.     //返回bean的对象  
  10.     @Override  
  11.     public Car getObject() throws Exception {  
  12.         return new Car(brand,500000);  
  13.     }  
  14.       
  15.     //返回的bean的类型  
  16.     @Override  
  17.     public Class<?> getObjectType() {  
  18.         // TODO Auto-generated method stub  
  19.         return Car.class;  
  20.     }  
  21.       
  22.     //是否是单例的  
  23.     @Override  
  24.     public boolean isSingleton() {  
  25.         // TODO Auto-generated method stub  
  26.         return true;  
  27.     }  
  28.   
  29. }  


2.配置bean
[html] view plain copy
 
  1. <!--       
  2.              通过FactoryBean来配置Bean的实例  
  3.     class:指向FactoryBean的全类名  
  4.     property:配置FactoryBean的属性   
  5.       
  6.     注意:实际返回的实例是FactoryBean的getObject()方法返回的实例  
  7. -->  
  8.     <bean id="car1"  
  9.         class="com.wul.spring.bean.factoryBean.CarFactoryBean">  
  10.         <property name="brand" value="BMW"></property>  
  11.     </bean>  


下面给出示例:
 

spring通过工厂方法配置Bean:

Car.java
[java] view plain copy
 
  1. package com.wul.spring.bean.factory;  
  2.   
  3. public class Car {  
  4.       
  5.     private String brand;  
  6.       
  7.     private double price;  
  8.   
  9.     public String getBrand() {  
  10.         return brand;  
  11.     }  
  12.   
  13.     public void setBrand(String brand) {  
  14.         this.brand = brand;  
  15.     }  
  16.   
  17.     public double getPrice() {  
  18.         return price;  
  19.     }  
  20.   
  21.     public void setPrice(double price) {  
  22.         this.price = price;  
  23.     }  
  24.   
  25.     @Override  
  26.     public String toString() {  
  27.         return "Car [brand=" + brand + ", price=" + price + "]";  
  28.     }  
  29.   
  30.     public Car(String brand, double price) {  
  31.         super();  
  32.         this.brand = brand;  
  33.         this.price = price;  
  34.     }  
  35.       
  36.       
  37. }  
StaticCarFactory.java
[java] view plain copy
 
  1. package com.wul.spring.bean.factory;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6.   
  7. /*静态工厂方法:直接调用某一个类的静态方法就可以返回Bean的实例*/  
  8. public class StaticCarFactory {  
  9.       
  10.     private static Map<String , Car> cars = new HashMap<String,Car>();  
  11.       
  12.     static{  
  13.         cars.put("audi"new Car("Audi",300000));  
  14.         cars.put("ford"new Car("Ford",400000));  
  15.     }  
  16.       
  17.     //静态工厂方法,不需要创建StaticCarFactory对象情况下,通过该方法可以得到对应实例。  
  18.     public static Car getCar(String brand){   
  19.         return cars.get(brand);  
  20.     }  
  21. }  


 
InstanceCarFactory.java
[java] view plain copy
 
  1. package com.wul.spring.bean.factory;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. /* 
  7.  * 实例工厂方法:实例工厂的方法,即先需要创建工厂bean本身,再调用工厂的实例方法来 
  8.  *       返回bean的实例 
  9.  */  
  10. public class InstanceCarFactory {  
  11.       
  12.     private Map<String,Car> cars = null;  
  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. }  
bean-factory.xml
[html] view plain copy
 
  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,注意不是配置静态工厂方法实例,而是bean实例,  
  8.         且注意对应类是包含静态工厂方法的类  
  9.         class属性:指向静态工厂方法的全类名  
  10.         factory-method:指向静态工厂方法中的名字  
  11.         constructor-arg:如果某工厂方法需要传入参数,则使用constructor-arg来配置参数  
  12.         -->  
  13.     <bean id="car1"  
  14.        class="com.wul.spring.bean.factory.StaticCarFactory"  
  15.        factory-method="getCar">  
  16.        <constructor-arg value="audi"></constructor-arg>  
  17.     </bean>  
  18.       
  19.     <!-- 1.配置工厂的实例 -->  
  20.     <bean id="carFactory"   
  21.           class="com.wul.spring.bean.factory.InstanceCarFactory"></bean>  
  22.     <!--   
  23.         2.通过实例工厂来配置bean     
  24.             class属性:指向实例工厂方法的全类名  
  25.             factory-method:指向实例工厂方法的名字  
  26.             constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数  
  27.     -->   
  28.      <bean id="car2" factory-bean="carFactory"  
  29.           factory-method="getCar">  
  30.           <constructor-arg value="ford"></constructor-arg>  
  31.      </bean>    
  32.       
  33. </beans>  


Mainfactory.java
[java] view plain copy
 
  1. package com.wul.spring.bean.factory;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class Mainfactory {  
  7.     public static void main(String[] args) {  
  8.           
  9.         ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factory.xml");  
  10.           
  11.         //静态工厂方法测试:  
  12.         Car car1 = (Car) ctx.getBean("car1");  
  13.         System.out.println(car1);  
  14.           
  15.         //实例工厂方法测试:  
  16.         Car car2 = (Car) ctx.getBean("car2");  
  17.         System.out.println(car2);  
  18.     }  
  19. }  

通过FactoryBean来配置Bean

Car.java(同上)
 
CarFactoryBean.java
[java] view plain copy
 
  1. package com.wul.spring.bean.factoryBean;  
  2.   
  3. import org.springframework.beans.factory.FactoryBean;  
  4.   
  5. //自定义的Factory需要实现FactoryBean接口  
  6. public class CarFactoryBean implements FactoryBean<Car>{  
  7.   
  8.     private String brand;  
  9.       
  10.     public void setBrand(String brand) {  
  11.         this.brand = brand;  
  12.     }  
  13.       
  14.     //返回bean的对象  
  15.     @Override  
  16.     public Car getObject() throws Exception {  
  17.         return new Car(brand,500000);  
  18.     }  
  19.       
  20.     //返回的bean的类型  
  21.     @Override  
  22.     public Class<?> getObjectType() {  
  23.         // TODO Auto-generated method stub  
  24.         return Car.class;  
  25.     }  
  26.       
  27.     //是否是单例的  
  28.     @Override  
  29.     public boolean isSingleton() {  
  30.         // TODO Auto-generated method stub  
  31.         return true;  
  32.     }  
  33.   
  34. }  

bean-factorybean.xml
[html] view plain copy
 
  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. <!--       
  8.              通过FactoryBean来配置Bean的实例  
  9.     class:指向FactoryBean的全类名  
  10.     property:配置FactoryBean的属性   
  11.       
  12.     注意:实际返回的实例是FactoryBean的getObject()方法返回的实例  
  13. -->  
  14.     <bean id="car1"  
  15.         class="com.wul.spring.bean.factoryBean.CarFactoryBean">  
  16.         <property name="brand" value="BMW"></property>  
  17.     </bean>  
  18.   
  19. </beans>  
MainFactoryBean.java
[java] view plain copy
 
  1. package com.wul.spring.bean.factoryBean;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class MainFactoryBean {  
  7.       
  8.     public static void main(String[] args) {  
  9.         ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factorybean.xml");  
  10.           
  11.         Car car = (Car) ctx.getBean("car1");  
  12.         System.out.println(car);  
  13.           
  14.     }  
  15. }  

spring通过工厂方法配置Bean

1.通过调用静态工厂方法创建bean(直接调用某一个类的静态方法就可以返回bean的实例)

调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单的调用静态方法,
而不关心创建对象的细节。
要声明通过静态方法创建bean:
   1.需要在bean的class属性里指定拥有该方法的类,
   2.同时在factory-method属性里指定工厂方法的名称,
   3.最后,使用<constrctor-arg>元素为该方法传递方法参数。
[html] view plain copy
 
  1. <!--  
  2.             通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是bean实例,  
  3.     且注意对应类是包含静态工厂方法的类  
  4.     class属性:指向静态工厂方法的全类名  
  5.     factory-method:指向静态工厂方法中的名字  
  6.     constructor-arg:如果某工厂方法需要传入参数,则使用constructor-arg来配置参数  
  7.     -->  
  8. <bean id="car1"  
  9.    class="com.wul.spring.bean.factory.StaticCarFactory"  
  10.    factory-method="getCar">  
  11.    <constructor-arg value="audi"></constructor-arg>  
  12. </bean>  

2.通过调用实例工厂方法创建bean(即先需要创建工厂bean本身,再调用工厂的实例方法来返回bean的实例)

实例工厂方法:将对象的创建过程封装到另外一个对象实例方法里,当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。
 
  1.先声明实例工厂类的bean
声明通过实例工厂方法创建的bean:
  2.在bean的factory-bean属性里指定拥有该该工厂方法的bean
  3.在factory-method属性里指定该工厂方法的名称。
  4.使用constructor-arg元素为工厂方法传递方法参数。
[html] view plain copy
 
  1. <!-- 1.配置工厂的实例 -->  
  2. <bean id="carFactory"   
  3.       class="com.wul.spring.bean.factory.InstanceCarFactory"></bean>  
  4. <!--   
  5.     2.通过实例工厂来配置bean     
  6.         class属性:指向实例工厂方法的全类名  
  7.         factory-method:指向实例工厂方法的名字  
  8.         constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数  
  9. -->   
  10.  <bean id="car2" factory-bean="carFactory"  
  11.       factory-method="getCar">  
  12.       <constructor-arg value="ford"></constructor-arg>  
  13.  </bean>  

3.spring通过FactoryBean配置

当配置的bean里需要引用其他的bean------------通过FactoryBean配置是最好的方式

1.自定义的Factory需要实现FactoryBean接口
[java] view plain copy
 
  1. public class CarFactoryBean implements FactoryBean<Car>{  
  2.   
  3.     private String brand;  
  4.       
  5.     public void setBrand(String brand) {  
  6.         this.brand = brand;  
  7.     }  
  8.       
  9.     //返回bean的对象  
  10.     @Override  
  11.     public Car getObject() throws Exception {  
  12.         return new Car(brand,500000);  
  13.     }  
  14.       
  15.     //返回的bean的类型  
  16.     @Override  
  17.     public Class<?> getObjectType() {  
  18.         // TODO Auto-generated method stub  
  19.         return Car.class;  
  20.     }  
  21.       
  22.     //是否是单例的  
  23.     @Override  
  24.     public boolean isSingleton() {  
  25.         // TODO Auto-generated method stub  
  26.         return true;  
  27.     }  
  28.   
  29. }  


2.配置bean
[html] view plain copy
 
  1. <!--       
  2.              通过FactoryBean来配置Bean的实例  
  3.     class:指向FactoryBean的全类名  
  4.     property:配置FactoryBean的属性   
  5.       
  6.     注意:实际返回的实例是FactoryBean的getObject()方法返回的实例  
  7. -->  
  8.     <bean id="car1"  
  9.         class="com.wul.spring.bean.factoryBean.CarFactoryBean">  
  10.         <property name="brand" value="BMW"></property>  
  11.     </bean>  


下面给出示例:
 

spring通过工厂方法配置Bean:

Car.java
[java] view plain copy
 
  1. package com.wul.spring.bean.factory;  
  2.   
  3. public class Car {  
  4.       
  5.     private String brand;  
  6.       
  7.     private double price;  
  8.   
  9.     public String getBrand() {  
  10.         return brand;  
  11.     }  
  12.   
  13.     public void setBrand(String brand) {  
  14.         this.brand = brand;  
  15.     }  
  16.   
  17.     public double getPrice() {  
  18.         return price;  
  19.     }  
  20.   
  21.     public void setPrice(double price) {  
  22.         this.price = price;  
  23.     }  
  24.   
  25.     @Override  
  26.     public String toString() {  
  27.         return "Car [brand=" + brand + ", price=" + price + "]";  
  28.     }  
  29.   
  30.     public Car(String brand, double price) {  
  31.         super();  
  32.         this.brand = brand;  
  33.         this.price = price;  
  34.     }  
  35.       
  36.       
  37. }  
StaticCarFactory.java
[java] view plain copy
 
  1. package com.wul.spring.bean.factory;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6.   
  7. /*静态工厂方法:直接调用某一个类的静态方法就可以返回Bean的实例*/  
  8. public class StaticCarFactory {  
  9.       
  10.     private static Map<String , Car> cars = new HashMap<String,Car>();  
  11.       
  12.     static{  
  13.         cars.put("audi"new Car("Audi",300000));  
  14.         cars.put("ford"new Car("Ford",400000));  
  15.     }  
  16.       
  17.     //静态工厂方法,不需要创建StaticCarFactory对象情况下,通过该方法可以得到对应实例。  
  18.     public static Car getCar(String brand){   
  19.         return cars.get(brand);  
  20.     }  
  21. }  


 
InstanceCarFactory.java
[java] view plain copy
 
  1. package com.wul.spring.bean.factory;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. /* 
  7.  * 实例工厂方法:实例工厂的方法,即先需要创建工厂bean本身,再调用工厂的实例方法来 
  8.  *       返回bean的实例 
  9.  */  
  10. public class InstanceCarFactory {  
  11.       
  12.     private Map<String,Car> cars = null;  
  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. }  
bean-factory.xml
[html] view plain copy
 
  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,注意不是配置静态工厂方法实例,而是bean实例,  
  8.         且注意对应类是包含静态工厂方法的类  
  9.         class属性:指向静态工厂方法的全类名  
  10.         factory-method:指向静态工厂方法中的名字  
  11.         constructor-arg:如果某工厂方法需要传入参数,则使用constructor-arg来配置参数  
  12.         -->  
  13.     <bean id="car1"  
  14.        class="com.wul.spring.bean.factory.StaticCarFactory"  
  15.        factory-method="getCar">  
  16.        <constructor-arg value="audi"></constructor-arg>  
  17.     </bean>  
  18.       
  19.     <!-- 1.配置工厂的实例 -->  
  20.     <bean id="carFactory"   
  21.           class="com.wul.spring.bean.factory.InstanceCarFactory"></bean>  
  22.     <!--   
  23.         2.通过实例工厂来配置bean     
  24.             class属性:指向实例工厂方法的全类名  
  25.             factory-method:指向实例工厂方法的名字  
  26.             constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数  
  27.     -->   
  28.      <bean id="car2" factory-bean="carFactory"  
  29.           factory-method="getCar">  
  30.           <constructor-arg value="ford"></constructor-arg>  
  31.      </bean>    
  32.       
  33. </beans>  


Mainfactory.java
[java] view plain copy
 
  1. package com.wul.spring.bean.factory;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class Mainfactory {  
  7.     public static void main(String[] args) {  
  8.           
  9.         ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factory.xml");  
  10.           
  11.         //静态工厂方法测试:  
  12.         Car car1 = (Car) ctx.getBean("car1");  
  13.         System.out.println(car1);  
  14.           
  15.         //实例工厂方法测试:  
  16.         Car car2 = (Car) ctx.getBean("car2");  
  17.         System.out.println(car2);  
  18.     }  
  19. }  

通过FactoryBean来配置Bean

Car.java(同上)
 
CarFactoryBean.java
[java] view plain copy
 
  1. package com.wul.spring.bean.factoryBean;  
  2.   
  3. import org.springframework.beans.factory.FactoryBean;  
  4.   
  5. //自定义的Factory需要实现FactoryBean接口  
  6. public class CarFactoryBean implements FactoryBean<Car>{  
  7.   
  8.     private String brand;  
  9.       
  10.     public void setBrand(String brand) {  
  11.         this.brand = brand;  
  12.     }  
  13.       
  14.     //返回bean的对象  
  15.     @Override  
  16.     public Car getObject() throws Exception {  
  17.         return new Car(brand,500000);  
  18.     }  
  19.       
  20.     //返回的bean的类型  
  21.     @Override  
  22.     public Class<?> getObjectType() {  
  23.         // TODO Auto-generated method stub  
  24.         return Car.class;  
  25.     }  
  26.       
  27.     //是否是单例的  
  28.     @Override  
  29.     public boolean isSingleton() {  
  30.         // TODO Auto-generated method stub  
  31.         return true;  
  32.     }  
  33.   
  34. }  

bean-factorybean.xml
[html] view plain copy
 
  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. <!--       
  8.              通过FactoryBean来配置Bean的实例  
  9.     class:指向FactoryBean的全类名  
  10.     property:配置FactoryBean的属性   
  11.       
  12.     注意:实际返回的实例是FactoryBean的getObject()方法返回的实例  
  13. -->  
  14.     <bean id="car1"  
  15.         class="com.wul.spring.bean.factoryBean.CarFactoryBean">  
  16.         <property name="brand" value="BMW"></property>  
  17.     </bean>  
  18.   
  19. </beans>  
MainFactoryBean.java
[java] view plain copy
 
  1. package com.wul.spring.bean.factoryBean;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class MainFactoryBean {  
  7.       
  8.     public static void main(String[] args) {  
  9.         ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factorybean.xml");  
  10.           
  11.         Car car = (Car) ctx.getBean("car1");  
  12.         System.out.println(car);  
  13.           
  14.     }  
  15. }  
posted @ 2018-03-21 16:12  书生侠客  阅读(254)  评论(0编辑  收藏  举报