文档章节

学习Spring(七) -- Spring中的Factory用法

XuePeng77
 XuePeng77
发布于 2016/04/20 23:35
字数 712
阅读 80
收藏 3

静态工厂

    首先,要有一个静态工厂来生成对象,编写一个Car类和一个StaticCarFactory类:

package cn.net.bysoft.lesson5;

public class Car {

    public Car() {

    }

    public Car(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Car [name=" + name + "]";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private String name;

}

package cn.net.bysoft.lesson5;

import java.util.HashMap;
import java.util.Map;

public class StaticCarFactory {
    private static Map<String, Car> cars = new HashMap<String, Car>();

    static {
        cars.put("Audi", new Car("Audi"));
        cars.put("Ford", new Car("Ford"));
    }

    public static Car getCar(String name) {
        return cars.get(name);
    }
}

    在spring的配置文件进行配置,让spring帮我们调用静态工厂方法生成Car对象:

<bean id="car1" class="cn.net.bysoft.lesson5.StaticCarFactory"
        factory-method="getCar">
        <constructor-arg value="Audi"></constructor-arg>
    </bean>

    可以看到class不在是Car的全类名,而是静态工厂的全类名,factory-method属性指向的是工厂中生成Car的方法名称,而这个方法有一个name参数,我们通过constructor-arg元素进行传参,传送给静态工厂方法一个Audi参数,要求工厂返回一个Car,名字是Audi,测试一下:

    @Test
    public void testStaticFactory() {
        Car car1 = (Car) ctx.getBean("car1");
        System.out.println(car1);
        /**
         * output:Car [name=Audi]
         * */
    }

实例工厂

    其实与静态工厂的用法类似,创建一个实例工厂:

package cn.net.bysoft.lesson5;

import java.util.HashMap;
import java.util.Map;

public class InstanceCarFactory {
    private Map<String, Car> cars = new HashMap<String, Car>();

    public InstanceCarFactory() {
        cars.put("Audi", new Car("Audi"));
        cars.put("Ford", new Car("Ford"));
    }

    public Car getCar(String name) {
        return cars.get(name);
    }
}

    修改一个配置文件:

    <bean id="carFactory" class="cn.net.bysoft.lesson5.InstanceCarFactory"></bean>
    <bean id="car2" factory-bean="carFactory" factory-method="getCar">
        <constructor-arg value="Ford"></constructor-arg>
    </bean>

    首先,在配置文件中定义一个实例工厂的bean,接着,Car对象的bean不需要指定class了,而是使用factory-bean属性将实例工厂bean的id赋值到该属性,在定义factory-method,也就是生成对象的方法名称,给方法传值与之前的静态工厂一样。要求工厂生成一个Ford汽车,测试一下结果:

    @Test
    public void testInstanceFactory() {
        Car car2 = (Car) ctx.getBean("car2");
        System.out.println(car2);
        /**
         * output:Car [name=Ford]
         * */
    }

内置的FactoryBean

    Spring为我们提供了一个FactoryBean接口,我们可以自定义工厂去实现这个接口:

package cn.net.bysoft.lesson5;

import org.springframework.beans.factory.FactoryBean;

public class CarFactoryBean implements FactoryBean<Car> {

    private String brand;

    public void setBrand(String brand) {
        this.brand = brand;
    }

    @Override
    public Car getObject() throws Exception {
        // TODO Auto-generated method stub
        return new Car(brand);
    }

    @Override
    public Class<?> getObjectType() {
        // TODO Auto-generated method stub
        return Car.class;
    }

    @Override
    public boolean isSingleton() {
        // TODO Auto-generated method stub
        return true;
    }

}

    这个接口只有三个方法:getObject、getObjectType和isSingleton,分别用来获得一个对象、获得这个对象的类型和这个对象是否是单例的。

    通过配置spring的配置文件,就可以使用这个工厂:

    <bean id="car3" class="cn.net.bysoft.lesson5.CarFactoryBean">
        <property name="brand" value="BMW"></property>
    </bean>

    将要生成的对象的class指定FactoryBean的全类名,设置属性,Spring会自动调用getObject()方法返回对象。

@Test
    public void testFactoryBean() {
        Car car3 = (Car) ctx.getBean("car3");
        System.out.println(car3);
        /**
         * output:Car [name=BMW]
         * */
    }

© 著作权归作者所有

XuePeng77
粉丝 49
博文 153
码字总数 205910
作品 0
丰台
私信 提问
SpringMVC 中的Controller返回JSON数据

SpringMVC中的Controller返回JSON问题 ①配置JSON解析器 ②使用注解@ResponseBody返回的是json,没有使用该注解,则会进行页面跳转。 方案一

IamOkay
2014/11/21
137
0
spring-security-auth-sso 异常 纠结了两天

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jwtTokenServices' defined in org.springframework.boot.autoconfigure.security.oau......

熊大熊二
2018/10/04
3.8K
4
Spring Cloud Gateway 之 AddRequestHeader GatewayFilter Factory

今天我们来学习下GatewayFilter Factory,中文解释就是过滤器工厂。 官方文档对GatewayFilter Factory的介绍: Route filters allow the modification of the incoming HTTP request or out...

尹吉欢
2018/09/25
0
0
spring-security-oauth2 启动报错 各位高手帮我看看 JAR升级到2.X后出现了 这个问题

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jwtTokenServices' defined in class path resource [org/springframework/boot/autoc......

osc先生
11/12
54
0
Spring Cloud Gateway 2.1.0 中文官网文档

目录 该项目提供了一个建立在Spring Ecosystem之上的API网关,包括:Spring 5,Spring Boot 2和Project Reactor。Spring Cloud Gateway旨在提供一种简单而有效的方式来对API进行路由,并为他...

高广超
03/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

重庆哪里有开住宿费发票

重庆哪里有开住宿费发票【微电 : 1 3 5 * 4 4 2 8 * 6 8 6 2 】刘生-经.营.范.围.广█无需打开直接联系█点击上方“衡水发布” 可以订阅哦!郭台铭...

haa123
25分钟前
4
0
//编程:输入一个数n,然后输入n个数,求:(1)n个数的平均值; //(2)n个数中的最大值。用do while 写

#include<stdio.h> int main() { int n,i=0,x,Max=0; float y=0,aver; printf("输入一个数:\n"); scanf("%d",&n); do{ printf("输入一个数:\n"); scanf("%d",&x); y+=x; i++; if(x>Max){ Ma......

201905021729吴建森
30分钟前
4
0
拥抱 Elasticsearch:给 TiDB 插上全文检索的翅膀

作者介绍:孙晓光,知乎技术平台负责人,与薛宁(@Inke)、黄梦龙(@PingCAP)、冯博(@知乎)组队参加了 TiDB Hackathon 2019,他们的项目 TiSearch 获得了 CTO 特别奖。 “搜索”是大家在使...

TiDB
44分钟前
8
0
错误日志04(PSSecurityException之PowerShell权限设置)

Windows下PowerShell默认的权限级别是Restricted,不允许执行PS脚本(即.ps1文件)。如果在Restricted权限级别下运行,会得到错误信息: vue : 无法加载文件 C:\Users\29506\AppData\Roaming...

庭前云落
48分钟前
6
0
获取实例的类名?

如果我从中执行此操作的函数是实例的类派生的基类,如何找出在Python中创建对象实例的类的名称? 想到也许检查模块可能在这里帮助了我,但它似乎没有给我我想要的东西。 如果没有解析__class...

技术盛宴
50分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部