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

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

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

示例:

第一步:创建一个java project,导入包:

第二步:创建com.dx.spring.beans.factory.Car.java,com.dx.spring.beans.factory.StaticCarFactory.java,bean-factory.xml:

Car.java

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

StaticCarFactory.java

  1. package com.dx.spring.beans.factory;
  2.  
  3. import java.util.HashMap;
  4. import java.util.Map;
  5.  
  6. public class StaticCarFactory {
  7. private static Map<String, Car> cars = null;
  8. static {
  9. cars = new HashMap<>();
  10. cars.put("audi", new Car("AUDI", 350000));
  11. cars.put("ford", new Car("FORD", 200000));
  12. }
  13.  
  14. public static Car getCar(String key) {
  15. return cars.get(key);
  16. }
  17. }

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. <bean id="car1" class="com.dx.spring.beans.factory.StaticCarFactory"
  6. factory-method="getCar">
  7. <constructor-arg name="key" value="audi"></constructor-arg>
  8. </bean>
  9. </beans>

第三步:添加Client.java测试类,并执行测试:

  1. package com.dx.spring.beans.factory;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. public class Client {
  7. public static void main(String[] args) {
  8. ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factory.xml");
  9. Car car1 = (Car) ctx.getBean("car1");
  10. System.out.println(car1);
  11. }
  12. }

发现执行结果成功返回car1:

Car [brand=AUDI, price=350000.0]

通过调用实例工厂方法创建Bean

1)实例工行方法:将对象的创建过程封装到另外一个对象实例的方法里,当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。

2)需要声明通过实例工厂方法创建的Bean:

---- 在bean的factory-bean属性里指定拥有该工厂方法的Bean;

---- 在factory-method属性里指定该工厂方法的名称;

---- 使用<constructor-arg>元素为工厂方法传递方法参数。

示例:(备注:基于上边的示例修改)

第一步:创建com.dx.spring.beans.factory.InstanceCarFactory.java

  1. package com.dx.spring.beans.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("audi", new Car("audi", 350000));
  12. cars.put("ford", new Car("ford", 200000));
  13. }
  14.  
  15. public Car getCar(String key) {
  16. return cars.get(key);
  17. }
  18. }

第二步:在bean-factory.xml(spring bean配置文件)中添加如下配置:

  1. <bean id="instanceCarFactory" class="com.dx.spring.beans.factory.InstanceCarFactory"></bean>
  2. <bean id="car2" factory-bean="instanceCarFactory" factory-method="getCar">
  3. <constructor-arg name="key" value="ford"></constructor-arg>
  4. </bean>

第三步:修改Client.java,添加car2测试:

  1. package com.dx.spring.beans.factory;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. public class Client {
  7. public static void main(String[] args) {
  8. ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factory.xml");
  9. Car car1 = (Car) ctx.getBean("car1");
  10. System.out.println(car1);
  11.  
  12. Car car2 = (Car) ctx.getBean("car2");
  13. System.out.println(car2);
  14. }
  15. }

测试结果为:

Car [brand=AUDI, price=350000.0]
Car [brand=ford, price=200000.0]

Spring(十三):使用工厂方法来配置Bean的两种方式(静态工厂方法&实例工厂方法)的更多相关文章

  1. 使用工厂方法配置bean的两种方式

    1.使用静态工厂方法: 对应的配置.xml文件: 2.通过实例工厂的方法来配置bean: 对应的xml文件:

  2. SpringBoot配置Bean的两种方式--注解以及配置文件

    一.注解方式 编写实体类: package com.example.bean; import org.springframework.boot.context.properties.Configura ...

  3. spring 注入bean的两种方式

    我们都知道,使用spring框架时,不用再使用new来实例化对象了,直接可以通过spring容器来注入即可. 而注入bean有两种方式: 一种是通过XML来配置的,分别有属性注入.构造函数注入和工厂方 ...

  4. Spring Boot配置过滤器的两种方式

    过滤器(Filter)是Servlet中常用的技术,可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,常用的场景有登录校验.权限控制.敏感词过滤等,下面介绍下Spring Boot配置过 ...

  5. spring配置属性的两种方式

    spring配置属性有两种方式,第一种方式通过context命名空间中的property-placeholder标签 <context:property-placeholder location ...

  6. springmvc配置AOP的两种方式

    spingmvc配置AOP有两种方式,一种是利用注解的方式配置,另一种是XML配置实现. 应用注解的方式配置: 先在maven中引入AOP用到的依赖 <dependency> <gr ...

  7. web.config文件中配置数据库连接的两种方式

    web.config文件中配置数据库连接的两种方式 标签: 数据库webconfig 2015-04-28 18:18 31590人阅读 评论(1)收藏举报    分类: 数据库(74)  在网站开发 ...

  8. MyBatis配置数据源的两种方式

    ---------------------siwuxie095                                     MyBatis 配置数据源的两种方式         1.配置方 ...

  9. spring boot @ResponseBody转换JSON 时 Date 类型处理方法,Jackson和FastJson两种方式,springboot 2.0.9配置fastjson不生效官方解决办法

    spring boot @ResponseBody转换JSON 时 Date 类型处理方法 ,这里一共有两种不同解析方式(Jackson和FastJson两种方式,springboot我用的1.x的版 ...

随机推荐

  1. 企点微服务网关演进之路 IT大咖说 - 大咖干货,不再错过

      http://www.itdks.com/dakashuo/new/dakalive/detail/2297

  2. HDU 4818 Golden Radio Base (2013长春现场赛B题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4814 进制转换. 现场根据题目给的两个公式,不断更新!!! 胡搞就可以了. 现场3A,我艹,一次循环开 ...

  3. 12174 - Shuffle

    这道题能够用"滑动窗体"的思想来做,假想一个滑动的窗体,这个窗体的大小是s.划过一个大小为n的区域,可是由于s可能比n大,所以我们最好还是不去考虑s和n的大小,直接开出一个足够大的 ...

  4. LPC43xx Asymmetric Dual Core : Cortex-M0 and Cortex-M4

  5. OOP设计模式[JAVA]——04命令模式

    命令模式 命令模式的意图 命令模式属于对象的行为模式.别名又叫:Action或Transaction. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求 ...

  6. Cocos2d-x3.1TestCpp之NewRenderTest Demo分析

    1.代码构成 VisibleRect.h VisibleRect.cpp AppDelegate.h AppDelegate.cpp HelloWorldScene.h HelloWorldScene ...

  7. C#内存映射文件消息队列实战演练(MMF—MQ)

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...

  8. 哥谭第一季/全集Gotham迅雷下载

    哥谭市 第一季 Gotham (2014)本季看点:<哥谭镇>将由丹尼·加农掌镜,布鲁诺·海勒执笔剧本.电视剧集<哥谭>可以说<蝙蝠侠>的前传,剧集描述的是DC漫画 ...

  9. XCode的The argument is invalid

      google查了一下,没找到解决的方法.有一篇blog应该有写怎么解决,可惜是wordpress.com的站点,打不开,网页快照也看不了-   后来回忆了一下操作步骤,只是添加了cocos2dx的 ...

  10. command line subversion for windows

    安装 Slik SVN 之后,进入dos, 输入svn help,所有的命令和相关的信息都出来了   相关的svn命令:log.export等,可以搜索相应的文章: svn常用命令 svn log - ...