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

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

原文地址:https://www.cnblogs.com/yy3b2007com/p/9085902.html

时间: 2024-07-29 06:04:44

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

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

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

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

一.注解方式 编写实体类: package com.example.bean;import org.springframework.boot.context.properties.ConfigurationProperties;/** * Created by Loser100 on 2017/10/9. */@Component@ConfigurationProperties(prefix = "hello")public class HelloServiceProperties {

从源代码剖析Struts2中用户自定义配置转换器的两种方式——基于字段的配置转换器和基于类型的配置转换器(解决了实际系统中,因没有区分这两种工作方式的生命周期而引起的异常错误问题)

自定义类型转换器必须实现ongl.TypeConverter接口或对这个接口的某种具体实现做扩展 <<interface>>com.opensymphony.xwork2.conversion.TypeConverter à com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter à org.apache.struts2.util.StrutsTypeConverter 接口及类进行解析 TypeConverter(

spring配置属性的两种方式

spring配置属性有两种方式,第一种方式通过context命名空间中的property-placeholder标签 <context:property-placeholder location="classpath:jdbctemplate/jdbc.properties" /> 第二种方式通过创建bean,对应类为PropertyPlaceholderConfigurer <bean id="propertyConfigurer" class=

spring学习一——基本搭建,属性注入的两种方式

今天用spring 3.2.5搭建了基本的环境,spring出的太快了,前段时间才3.2.5,今儿个一瞧已经上了4的版本了,稍后给出spring的jar下载地址,毕竟现在官网上找不到了啊. 废话少说了,spring 3.2.5已经将所有的依赖包都放在了dist的lib下面,并且都有doc包和源码包,很是方便.先导入所需的jar包:core,context,beans,expression 四个jar包,除此之外,还需导入commons-logging. 下一步,新建xml文件,建议名称为 app

MyBatis配置数据源的两种方式

---------------------siwuxie095 MyBatis 配置数据源的两种方式 1.配置方式一:配置数据库连接信息到核心配置文件中 在 mybatis-config.xml 中添加如下内容: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" &

Spring定义Bean的两种方式:和@Bean

前言:    Spring中最重要的概念IOC和AOP,实际围绕的就是Bean的生成与使用. 什么叫做Bean呢?我们可以理解成对象,每一个你想交给Spring去托管的对象都可以称之为Bean. 今天通过Spring官方文档来了解下,如何生成bean,如何使用呢? 1.通过XML的方式来生成一个bean    最简单也是最原始的一种方式,通过XML来定义一个bean,我们来看下其过程 1)创建entity,命名为Student @Data@AllArgsConstructor@NoArgsCon

Spring 实例化Bean的两种方式

使用Spring管理Bean也称依赖注入( Dependency Injection, DI ),通过这种方式将Bean的控制权交给Spring 在使用Spring实例化一个对象时,无论类是否有参数都会默认调用对象类的无参构造,对于有参数的情况,Spring有两种方式可以带参实例化 示例类 Shape public class Shape { private Integer width; private Integer height; public Shape() { System.out.pr

在思科三层交换机配置网关的两种方式

随着交换技术的发展,三层交换机在网络汇聚层与核心层的应用越来越多.在内网中子网与子网之间的通讯越来越少依赖于路由(几乎见不到了),而是使用带有路由功能的三层交换机,这对于内网中子网之间的通信效率的提高是显著的. 在三层交换机配置子网之间的通讯有一个关键的地方,就是子网网关的配置.当子网与子网之间进行通讯时,发起通讯的一方,在本子网中找不到通讯的目标时,就会将通讯的请求提交给自己子网的网关,由自己子网的网关负责处理.在三层交换机启用路由功能时,第一次根据路由条目查询对应目标计算机所在的子网,记录下