zoukankan      html  css  js  c++  java
  • 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     //静态块用于创建map对象,然后用map根据key获取指定的car对象
    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     //通过默认构造器初始化map对象
    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>
    复制代码
  • 相关阅读:
    迭代器Iterator与ConcurrentModificationException详解
    多线程 ForkJoinPool
    (转)面向对象——UML类图设计
    网络基础知识-网络协议
    Python 浅析线程(threading模块)和进程(process)
    一篇文章详解python的字符编码问题
    浅析文本挖掘(jieba模块的应用)
    浅析网站的基本构成和主要类型
    python 常用算法学习(1)
    浅谈使用git进行版本控制
  • 原文地址:https://www.cnblogs.com/longronglang/p/6183774.html
Copyright © 2011-2022 走看看