前面几节,我们配过了好多Bean,通过反射机制,在class属性里填写全类名,现在我们来讲讲其他方式,通过工厂方法,还有通过FactoryBean,这个在我们整合第三方框架时会用到。

工厂方法可以分为静态工厂方法和实例工厂方法。

静态工厂方法

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

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

做一下准备工作,创建Car.java为了方便,我们需要额外给它加一个含参的构造方法:

创建StaticCarFactory.java,所谓静态工厂方法就是直接调用某个类的静态方法就可以返回Bean实例。

  1. package com.figsprite.bean.factory;  
  2.     
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.     
  6. public class StaticCarFactory {  
  7.     
  8.     
  9.     private static Map<String,Car> cars = new HashMap<>();  
  10.     
  11.     
  12.     static {  
  13.         cars.put("奥迪",new Car("奥迪",233));  
  14.         cars.put("宝马",new Car("宝马",666));  
  15.     }  
  16.     
  17.     //静态工厂方法  
  18.     public static Car getCar(String name){  
  19.         return cars.get(name);  
  20.     }  
  21. }  

    创建新的配置文件,此时,class属性只想静态工厂方法的全类名,factory-method指向静态工厂方法名,最后,如果工厂方法需要参数,通过<constructror-arg>配置参数

<bean id="car1" class="com.figsprite.bean.factory.StaticCarFactory"
factory-method="getCar"
>
<constructor-arg value="奥迪"/>
</bean>

接下来写一个测试方法

实例工厂方法

实例工厂指的是创建Bean之前还要实例化工厂。在调用工厂的实例方法返回bean的实例

创建一个实例工厂类:InstanceCarFactory.java

  1. package com.figsprite.bean.factory;  
  2.   
     
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
     
  6. public class InstanceCarFactory {  
  7.     private Map<String,Car> cars = null;  
  8.   
     
  9.     public InstanceCarFactory(){  
  10.         cars = new HashMap<>();  
  11.         cars.put("奥迪",new Car("奥迪",233));  
  12.         cars.put("宝马",new Car("宝马",666));  
  13.     }  
  14.   
     
  15.   
     
  16.     public Car getCar(String brand){  
  17.         return cars.get(brand);  
  18.     }  
  19. }  

来到配置文件,我们需要先造一个工厂bean,再通过这个bean创建car的bean

  1. <bean id="carFactory" class="com.figsprite.bean.factory.InstanceCarFactory"/>  
  2.   
     
  3. <bean id="car2" factory-bean="carFactory" factory-method="getCar">  
  4.     <constructor-arg value="宝马"></constructor-arg>  
  5. </bean>  

通过工厂方法配置Bean的更多相关文章

  1. 4.spriing:Bean的生命周期/工厂方法配置Bean/FactoryBean

    1.Bean的生命周期 scope:singleton/prototype 1)spring容器管理singleton作用的生命周期,spring能够精确知道Bean合适创建,何时初始化完成,以及何时 ...

  2. Spring初学之通过工厂方法配置Bean

    工厂方法配置bean分为两种,一种是实例工厂方法,另一种是静态工厂方法. 先来看看实体bean: Car.java: package spring.beans.factory; public clas ...

  3. 11.Spring通过工厂方法配置Bean

    通过工厂方法配置Bean暴扣静态工厂方法和实例工厂方法. 1.静态工厂方法 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单的调用静态方法,而不去关心创建 ...

  4. Spring4学习回顾之路07- 通过工厂方法配置Bean

    一:通过静态工厂配置Bean 建立Student.java package com.lql.srping04; /** * @author: lql * @date: 2019.10.28 * Des ...

  5. 工厂方法配置bean

    1:静态工厂方法配置bean 1):对象 package com.spring.helloworld; public class Car { private String name; private ...

  6. Spring学习记录(九)---通过工厂方法配置bean

    1. 使用静态工厂方法创建Bean,用到一个工厂类 例子:一个Car类,有brand和price属性. package com.guigu.spring.factory; public class C ...

  7. Spring4.0学习笔记(6) —— 通过工厂方法配置Bean

    1.静态工厂方法: bean package com.spring.factory; public class Car { public Car(String brand) { this.brand ...

  8. spring 通过工厂方法配置Bean

    概要: 通过调用静态工厂方法创建Bean 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中.当client须要对象时,仅仅须要简单地调用静态方法,而不用关心创建对象地细节. 要声明通过静 ...

  9. spring4-2-bean配置-9-通过工厂方法配置bean

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjwAAAFICAIAAADbNrOHAAAgAElEQVR4nO2dy7W0uhGFOxWn4JEXAS

随机推荐

  1. [PHP] defunct僵尸进程

    1.如果子进程先于父进程退出, 同时父进程又没有调用wait/waitpid,则该子进程将成为僵尸进程 2.如果fork完就不管了可以使用 忽略子进程信号, 防止僵尸进程 pcntl_signal(S ...

  2. 36.QT-解决无边框界面拖动卡屏问题(附带源码)

    1.简介 看到很多才学QT的人都会问为啥无边框拖动为啥会花屏? 那是因为你每次拖动的过程中都一直在调用move()函数让QT重新绘制界面,如果资源过大,就会导致当前图形还未绘制完,便又重新改变坐标了, ...

  3. Dynamics 365使用代码发送邮件给指定邮箱地址

    摘要: 微软动态CRM专家罗勇 ,回复303或者20190213可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 当然,首先要 ...

  4. Headless Android开发板的调试及远程显示和控制

    最近在调试msm8996的开发板,由于主板和LCD子板还没回来,所以先回的核心板算是个Headless的Android Device.核心板有独立供电,另外还有USB Type-C.FAN.HDMI. ...

  5. windows键盘按键输入错乱;

    问题:打字异常,打字乱码: 最佳解决方案:下载工具快速修复: 链接: 链接:https://pan.baidu.com/s/1GpWT-MljgQHorLNMhQ9eOg提取码:anh0 官网文档原因 ...

  6. nginx配置静态项目

    当nignx可以加载下面的这个service时 server { listen 8085;  server_name 1.192.60.82; location / { root /etc/nginx ...

  7. 修改vue element Transfer 穿梭框里内容区的宽度

    <template> <el-transfer v-model="value1" :data="data"></el-transf ...

  8. Swift JSON字符串和字典以及数组的互转

    1.JSONString转换为字典 // JSONString转换为字典 func getDictionaryFromJSONString(jsonString:String) ->NSDict ...

  9. TableML-GUI篇(C# 编译/解析 Excel/CSV工具)

    项目情况 本文接上篇TableML Excel编译/解析工具,本文主要介绍GUI工具的使用,及配置项,如果你想了解此工具更加详细的说明,请阅读上篇文章. 项目地址:https://github.com ...

  10. Ajax概述和判断用户名是否存在的简单代码练习

    在本代码中主要体现,Ajax实现了部分位置的刷新.不需要重新刷新网页,重新请求服务器.下面用过代码来对Ajax更深的认识 这里需要创建,一个jsp文件(显示登录界面),js文件(对Ajax的主要设置) ...