zoukankan      html  css  js  c++  java
  • Spring基础15——通过工厂方法来配置bean

    1、什么是工厂方法

           这里的工厂方法指的是创建指定bean的方法。工厂方法又分为静态工厂方法和实例工厂方法。

    2、静态工厂方法配置bean

           调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,不需要创建工厂实例就可以返回工厂创建的对象,就叫做静态工厂,当客户端需要对象时,只需要简单的调用静态方法,而不需要关心创建对象的细节。要声明通过静态方法创建的Bean,需要在Bean的class属性指定拥有该工厂的方法的类,同时在factory-method属性里指定工厂方法的名称,最后使用<constrctor-arg>元素为该方法传递方法参数。

           首先创建一个提供静态工厂方法的类:

     1 public class StaticCarFactory {
     2     private static Map<String, Car> cars = new HashMap<String, Car>();
     3     static {
     4         cars.put("audi", new Car("audi", 300000));
     5         cars.put("ford", new Car("audi", 400000));
     6     }
     7     //静态工厂方法,根据名字获取car对象
     8     public static Car getCar(String name) {
     9         return cars.get(name);
    10     }
    11 }

     spring配置文件

    1 <!--通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是配置bean实例-->
    2 <!--
    3     class属性:指向静态工厂的全类名
    4     fatory-method:指向静态工厂方法的名字
    5     constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数
    6  -->
    7 <bean id="car1" class="com.wzy.factory.StaticCarFactory" factory-method="getCar">
    8     <constructor-arg name="name" value="audi"/>
    9 </bean>

    编写Main测试类

    1 public class Main {
    2     public static void main(String[] args) {
    3         ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-factory.xml");
    4 
    5         Car car1 = (Car) ctx.getBean("car1");
    6 
    7         System.out.println(car1);
    8     }
    9 }

    输出结果:我们可以看到通过静态工厂成功创建了一个对象。

    3、实例工厂方法配置bean

           使用实例工厂方法配置bean首先需要创建一个实例工厂的bean,通过调用实例工厂bean的非静态方法创建目标的bean对象,同时在factory-bean属性里指定工厂bean的id,最后使用<constrctor-arg>元素为该方法传递方法参数。

           首先创建一个实例工厂的bean:

     1 public class InstanceCarFactory {
     2     private Map<String, Car> cars = null;
     3 
     4     public InstanceCarFactory() {
     5         cars = new HashMap<String, Car>();
     6         cars.put("audi", new Car("audi", 300000));
     7         cars.put("ford", new Car("ford", 400000));
     8     }
     9 
    10     public Car getCar(String name){
    11         return cars.get(name);
    12     }
    13 
    14 }

    配置Spring配置文件

     1 <!--实例工厂的实例-->
     2 <!--
     3     factory-bean:指向实例工厂方法的bean
     4     fatory-method:指向实例工厂方法的名字
     5     constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数
     6  -->
     7 <bean id="instanceCarFactory" class="com.wzy.factory.InstanceCarFactory"/>
     8 <!--通过实例工厂来配置bean-->
     9 <bean id="car2" factory-bean="instanceCarFactory" factory-method="getCar">
    10     <constructor-arg name="name" value="ford"/>
    11 </bean>

    修改Main测试类:

    1 public class Main {
    2     public static void main(String[] args) {
    3         ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-factory.xml");
    4         
    5         Car car2 = (Car) ctx.getBean("car2");
    6 
    7         System.out.println(car2);
    8     }
    9 }

    输出结果:

  • 相关阅读:
    Linux-CentOS6.9启动流程排错
    jenkins+maven+svn 自动化部署
    Linux下Mysql5.6 二进制安装
    es的api
    es的QueryBuilder学习使用
    es的QueryBuilders使用
    安装vue的开发环境
    自定义组件
    mounted钩子函数,页面初始化完成此函数加载
    双亲委派机制
  • 原文地址:https://www.cnblogs.com/fengyun2019/p/10842078.html
Copyright © 2011-2022 走看看