1. 使用静态工厂方法创建Bean,用到一个工厂类

例子:一个Car类,有brand和price属性。

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

工厂类:

 1 package com.guigu.spring.factory;
 2
 3 import java.util.HashMap;
 4 import java.util.Map;
 5
 6 public class StaticCarFactory {
 7
 8     private static Map<String,Car> cars=new HashMap<String,Car>();
 9     //静态代码块,防止重复添加
10     static{
11         cars.put("aodi", new Car("aodi",300000));
12         cars.put("ford", new Car("ford",200000));
13     }
14     //静态工厂方法
15     public static Car getCar(String name){
16         return cars.get(name);
17     }
18 }

xml配置

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans
 3 xmlns="http://www.springframework.org/schema/beans"
 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5 xmlns:context="http://www.springframework.org/schema/context"
 6 xsi:schemaLocation="
 7 http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 8 http://www.springframework.org/schema/context                http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 9   <!--
10         class属性:指向静态工厂方法的全类名,不是bean实例的实现类
11         factory-method:指向静态工厂方法的名字,方法里面返回bean
12         constructor-arg:如果工厂方法需要传入参数,则用constructor-arg配置
13
14  -->
15     <bean id="car1" class="com.guigu.spring.factory" factory-method="getCar">
16        <constructor-arg value="aodi"></constructor-arg>
17     </bean>
18
19 </beans>  

main函数测试

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

输出:

这个过程中,spring不再自己创建bean实例,bean实例由用户自己提供的工厂方法创建。静态工厂方法,方法必须是静态的

---------------------------------------

其实我还是不懂, 调用静态方法

什么时候对cars进行初始化了?单单调用静态方法并没有执行工厂类。望看观指教

--------------------------------------

2. 实例工厂方法,工厂本身是实例,要实现创建工厂对象本身

 1 /*
 2  * 实例工厂方法:实例工厂的方法,即先需要创建工厂本身,再调用工厂的实例方法来返回bean的实例
 3  * */
 4 public class InstanceCarFactory {
 5
 6     private Map<String,Car> cars=null;
 7
 8     public InstanceCarFactory(){
 9         cars = new HashMap<String, Car>();
10         cars.put("aodi", new Car("aodi",300000));
11         cars.put("ford", new Car("ford",400000));
12     }
13     //
14     public Car getCar(String brand){
15         return cars.get(brand);
16     }
17 }

xml配置

 1      <!--先配置工厂的实例-->
 2     <bean id="carFactory" class="com.guigu.spring.factory"></bean>
 3          <!--
 4        factory-bean属性:指向实例工厂方法的bean
 5        method:指向静态工厂方法的名字
 6        constructor-arg:如果工厂方法需要传入参数,用constructor-arg配置
 7       -->
 8      <bean id="car2" factory-bean="carFactory" factory-method="getCar">
 9         <constructor-arg value="ford"></constructor-arg>
10      </bean>

main函数

public class main {public static void main(String[] args) {ApplicationContext ctx =new ClassPathXmlApplicationContext("bean-factory.xml");Car car2 = (Car) ctx.getBean("car2");System.out.println(car2);        }
}

输出:

这个好理解,先实例工厂,调用构造函数,然后bean调用工厂的方法。

文章为学习记录,若有错误,望指正

转载于:https://www.cnblogs.com/ooooevan/p/5804784.html

Spring学习记录(九)---通过工厂方法配置bean相关推荐

  1. spring学习(52):工厂方法创建bean对象

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

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

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

  3. Spring学习笔记-构造和Set方法注入Bean及集合和null值的注入

    目录 理论 代码及演示 理论 注入Bean:可以通过构造方法注入Bean,通过Set方法注入Bean: 集合类型有:List.Set.Map.Properties: 以及特殊的null值的注入: 通过 ...

  4. 我的Spring学习记录(二)

    本篇就简单的说一下Bean的装配和AOP 本篇的项目是在上一篇我的Spring学习记录(一) 中项目的基础上进行开发的 1. 使用setter方法和构造方法装配Bean 1.1 前期准备 使用sett ...

  5. Spring源码分析系列——bean创建过程分析(三)——工厂方法创建bean

    前言 spring创建bean的方式 测试代码准备 createBeanInstance()方法分析 instantiateUsingFactoryMethod()方法分析 总结 spring创建be ...

  6. 花书+吴恩达深度学习(九)优化方法之二阶近似方法(牛顿法, CG, BFGS, L-BFGS)

    目录 0. 前言 1. 牛顿法 2. 共轭梯度法(CG) 3. BFGS 4. L-BFGS 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(五)正则化 ...

  7. eNSP学习记录一——创建网络拓扑并配置

    eNSP学习记录一--创建网络拓扑并配置 一.创建网络网络拓扑 二.配置PC和路由的IP并保存 三.设置静态路由 一.创建网络网络拓扑 我目前也是个小菜,所以感觉路由器使用AR1220会好一点,既可以 ...

  8. 学习Spring(二) 调用静态工厂方法创建Bean

    1,创建抽象的产品类 package com.robert.spring.shop;public abstract class Product {} 2,创建具体产品类 package com.rob ...

  9. Spring学习记录

    Spring相关 目录 文章目录 Spring相关 目录 前言 工厂设计模式 静态工厂模式 通用工厂模式 ApplicationContext ClassPathXmlApplicationConte ...

最新文章

  1. C语言SHELL排序算法
  2. 安装不文件不完全_冬日不偷懒 跑步机不完全使用指南
  3. 安装和配置Hadoop
  4. javascript高级程序设计学习之数值转换 |Number(),parseInt(),parseFloat()
  5. STM32 学习总结2 ----利用中断来控制按键点灯、捕获功能练习
  6. 一文读懂什么是数据库事务
  7. 没想到,我能这么细心地看算法
  8. java非法表达式开头,java - 我不断收到“ Battle.java:11:错误:表达式的非法开头” Heelp - SO中文参考 - www.soinside.com...
  9. python notebook_Python Notebook (Jupyter Notebook) 介绍
  10. Java基础系列1-Java语言概述
  11. x86 和 x64 到底是什么意思?
  12. 阿里云服务器的公网ipv6地址申请与配置
  13. 分布式 | 如何通过 dble 的 split 功能,快速地将数据导入到 dble 中
  14. 将项目重新关联到svn
  15. 天道酬勤系列之Redis 事务的介绍与实例使用
  16. 搜狗输入法的使用感受与评价
  17. 如何选择合适的渗压计?
  18. PAT 1085 PAT单位排行 (Microsoft_zzt)
  19. SuperMap iClient for Leaflet实现拖动半径进行距离查询
  20. 解决访问国外公共静态资源速度慢的问题

热门文章

  1. 疯狂的人工智能:谷歌AI可预测病人死亡,IBM AI击败了人类顶尖辩手
  2. 产品经理应该如何设计面包屑原理
  3. nginx_hash表
  4. python re 正则表达式
  5. C#winform定时器的两种使用方法
  6. 【转载】linux中误删除oracle数据文件的恢复操作
  7. 数据可视化(三)- Seaborn简易入门
  8. Spark Shuffle Write阶段磁盘文件分析
  9. Spark配置参数详解
  10. 使用spring boot +WebSocket实现(后台主动)消息推送