Spring学习记录(九)---通过工厂方法配置bean
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相关推荐
- spring学习(52):工厂方法创建bean对象
pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- spring 通过工厂方法配置Bean
概要: 通过调用静态工厂方法创建Bean 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中.当client须要对象时,仅仅须要简单地调用静态方法,而不用关心创建对象地细节. 要声明通过静 ...
- Spring学习笔记-构造和Set方法注入Bean及集合和null值的注入
目录 理论 代码及演示 理论 注入Bean:可以通过构造方法注入Bean,通过Set方法注入Bean: 集合类型有:List.Set.Map.Properties: 以及特殊的null值的注入: 通过 ...
- 我的Spring学习记录(二)
本篇就简单的说一下Bean的装配和AOP 本篇的项目是在上一篇我的Spring学习记录(一) 中项目的基础上进行开发的 1. 使用setter方法和构造方法装配Bean 1.1 前期准备 使用sett ...
- Spring源码分析系列——bean创建过程分析(三)——工厂方法创建bean
前言 spring创建bean的方式 测试代码准备 createBeanInstance()方法分析 instantiateUsingFactoryMethod()方法分析 总结 spring创建be ...
- 花书+吴恩达深度学习(九)优化方法之二阶近似方法(牛顿法, CG, BFGS, L-BFGS)
目录 0. 前言 1. 牛顿法 2. 共轭梯度法(CG) 3. BFGS 4. L-BFGS 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(五)正则化 ...
- eNSP学习记录一——创建网络拓扑并配置
eNSP学习记录一--创建网络拓扑并配置 一.创建网络网络拓扑 二.配置PC和路由的IP并保存 三.设置静态路由 一.创建网络网络拓扑 我目前也是个小菜,所以感觉路由器使用AR1220会好一点,既可以 ...
- 学习Spring(二) 调用静态工厂方法创建Bean
1,创建抽象的产品类 package com.robert.spring.shop;public abstract class Product {} 2,创建具体产品类 package com.rob ...
- Spring学习记录
Spring相关 目录 文章目录 Spring相关 目录 前言 工厂设计模式 静态工厂模式 通用工厂模式 ApplicationContext ClassPathXmlApplicationConte ...
最新文章
- C语言SHELL排序算法
- 安装不文件不完全_冬日不偷懒 跑步机不完全使用指南
- 安装和配置Hadoop
- javascript高级程序设计学习之数值转换 |Number(),parseInt(),parseFloat()
- STM32 学习总结2 ----利用中断来控制按键点灯、捕获功能练习
- 一文读懂什么是数据库事务
- 没想到,我能这么细心地看算法
- java非法表达式开头,java - 我不断收到“ Battle.java:11:错误:表达式的非法开头” Heelp - SO中文参考 - www.soinside.com...
- python notebook_Python Notebook (Jupyter Notebook) 介绍
- Java基础系列1-Java语言概述
- x86 和 x64 到底是什么意思?
- 阿里云服务器的公网ipv6地址申请与配置
- 分布式 | 如何通过 dble 的 split 功能,快速地将数据导入到 dble 中
- 将项目重新关联到svn
- 天道酬勤系列之Redis 事务的介绍与实例使用
- 搜狗输入法的使用感受与评价
- 如何选择合适的渗压计?
- PAT 1085 PAT单位排行 (Microsoft_zzt)
- SuperMap iClient for Leaflet实现拖动半径进行距离查询
- 解决访问国外公共静态资源速度慢的问题