通过调用静态工厂方法创建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

package com.dx.spring.beans.factory;

public class Car {
private String brand;
private double price; public Car() {
} public Car(String brand, double price) {
super();
this.brand = brand;
this.price = price;
} public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
} @Override
public String toString() {
return "Car [brand=" + brand + ", price=" + price + "]";
} }

StaticCarFactory.java

package com.dx.spring.beans.factory;

import java.util.HashMap;
import java.util.Map; public class StaticCarFactory {
private static Map<String, Car> cars = null;
static {
cars = new HashMap<>();
cars.put("audi", new Car("AUDI", 350000));
cars.put("ford", new Car("FORD", 200000));
} public static Car getCar(String key) {
return cars.get(key);
}
}

bean-factory.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="car1" class="com.dx.spring.beans.factory.StaticCarFactory"
factory-method="getCar">
<constructor-arg name="key" value="audi"></constructor-arg>
</bean>
</beans>

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

package com.dx.spring.beans.factory;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Client {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factory.xml");
Car car1 = (Car) ctx.getBean("car1");
System.out.println(car1);
}
}

发现执行结果成功返回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

package com.dx.spring.beans.factory;

import java.util.HashMap;
import java.util.Map; public class InstanceCarFactory {
private Map<String, Car> cars = null; public InstanceCarFactory() {
cars = new HashMap<>();
cars.put("audi", new Car("audi", 350000));
cars.put("ford", new Car("ford", 200000));
} public Car getCar(String key) {
return cars.get(key);
}
}

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

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

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

package com.dx.spring.beans.factory;

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

测试结果为:

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. Visual Studio 2019 preview中体验C# 8.0新语法

    准备工作: Visual Studio 2019 Preview版本中并没有包含所有的C# 8.0的新功能,但目前也有一些可以试用了.在开始之前,需要进行入两项设置: 将Framework设置为.ne ...

  2. Spartan6 slave SelectMap configuration fails owing to JTAG?

    http://forums.xilinx.com/t5/Configuration/Spartan6-slave-SelectMap-configuration-fails-owing-to-JTAG ...

  3. MUI框架之输入框Input

    input输入框的官方api文档:http://dev.dcloud.net.cn/mui/ui/#input 一.输入框类型 输入框的类型是根据type来决定是普通输入框还是密码框,搜索框等类型 & ...

  4. CentOS快速安装最新版本的SaltStack

    SaltStack是一个类似Puppet的自动运维管理工具,打算用它来管理实验室的所有服务器包括OpenStack,当然要想把它玩起来首先得把它安装上, 这里我写了一个简单的脚本来在CentOS下快速 ...

  5. javascript 编辑网页

    javascript:document.body.contentEditable='true';document.designMode='on'; void 0 出处:http://zhidao.ba ...

  6. 关于toString方法的重写工具ToStringBuilder

    原文:https://blog.csdn.net/zhaowen25/article/details/39521899# apache的commons-lang3的工具包里有一个ToStringBui ...

  7. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(7) TimeZone

    本章介绍TimeZone. TimeZone 简介 TimeZone 表示时区偏移量,也可以计算夏令时.在操作 Date, Calendar等表示日期/时间的对象时,经常会用到TimeZone:因为不 ...

  8. linux服务器使用iftop查看带宽流量IP

    20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送) 国内私募机构九鼎控股打造,九鼎投资是在全国股 ...

  9. WordPress主题开发:get_term_by和get_term_link

    学习目的: 某一个分类的名称.别名.和id都可以到后台自己去找,但这样找比较麻烦还容易看错,wordpress提供了下面两个函数get_term_by和get_term_link,只要提供别名.名称或 ...

  10. VisualStudio: Vistual Studio XML 智能提示(转载)

    原文地址:http://blog.csdn.net/hispring/article/details/5332312. 开发中经常遇到要和各种各样的 XML 打交道,编辑 XML 文件时最头痛的便是要 ...