二、通过工厂方法来配置bean

调用静态工厂方法创建 Bean是将对象创建的过程封装到静态方法中. 当客户端需要对象时, 只需要简单地调用静态方法, 而不同关心创建对象的细节.
要声明通过静态方法创建的 Bean, 需要在 Bean 的 class 属性里指定拥有该工厂的方法的类, 同时在 factory-method 属性里指定工厂方法的名称. 最后, 使用 <constrctor-arg> 元素为该方法传递方法参数.

实例工厂方法: 将对象的创建过程封装到另外一个对象实例的方法里. 当客户端需要请求对象时, 只需要简单的调用该实例方法而不需要关心对象的创建细节.
要声明通过实例工厂方法创建的 Bean
在 bean 的 factory-bean 属性里指定拥有该工厂方法的 Bean
在 factory-method 属性里指定该工厂方法的名称
使用 construtor-arg 元素为工厂方法传递方法参数


<?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,注意不是配置静态工厂实例,而是配置bean实例
        class:指向静态工厂的全类名
        factory-method:指向静态工厂方法的名字
        constructor-arg:如果静态工厂方法需要传入参数,则使用constructor-arg来配置参数
    -->
    <bean id="car1" class="com.xiya.spring.beans.factory.StaticCarFactory" factory-method="getCar">
        <constructor-arg value="Ford"/>
    </bean>

    <!--配置工厂的实例-->
    <bean id="instanceCarFactory" class="com.xiya.spring.beans.factory.InstanceCarFactory"/>
    <!--
        通过实例工厂方法来配置bean
        factory-bean:指向实例工厂的bean
    -->
    <bean id="car2" factory-bean="instanceCarFactory" factory-method="getCar">
        <constructor-arg value="BMW"/>
    </bean>
</beans>

package com.xiya.spring.beans.factory;

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

/**
 * 实例工厂方法:实例工厂的方法,即需要先创建工厂本身,再调用工厂的实例方法来返回bean实例
 * Created by N3verL4nd on 2017/3/20.
 */
public class InstanceCarFactory {private Map<String, Car> cars;

    public InstanceCarFactory() {cars = new HashMap<>();
        cars.put("audi", new Car("audi", 300000));
        cars.put("BMW", new Car("BMW", 500000));
        cars.put("Ford", new Car("Ford", 200000));
    }public Car getCar(String brand) {return cars.get(brand);
    }
}


package com.xiya.spring.beans.factory;

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

/**
 * 静态工厂方法:直接调用一个类的静态方法就可以返回 bean 的实例
 * Created by N3verL4nd on 2017/3/20.
 */
public class StaticCarFactory {private static Map<String, Car> cars = new HashMap<>();

    static {cars.put("audi", new Car("audi", 300000));
        cars.put("BMW", new Car("BMW", 500000));
        cars.put("Ford", new Car("Ford", 200000));
    }//静态工厂方法
    public static Car getCar(String brand) {return cars.get(brand);
    }public static void main(String[] args) {}
}


package com.xiya.spring.beans.factory;

/**
 * Created by N3verL4nd on 2017/3/20.
 */
public class Car {private String brand;
    private int price;

    public Car() {}public Car(String brand, int price) {this.brand = brand;
        this.price = price;
    }public String getBrand() {return brand;
    }public void setBrand(String brand) {this.brand = brand;
    }public int getPrice() {return price;
    }public void setPrice(int price) {this.price = price;
    }@Override
    public String toString() {return "Car{" +"brand='" + brand + '\'' +", price=" + price +'}';
    }
}

package com.xiya.spring.beans.factory;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by N3verL4nd on 2017/3/20.
 */
public class Main {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("beans-factory.xml");
        Car car1 = (Car) context.getBean("car1");
        System.out.println(car1);

        Car car2 = (Car) context.getBean("car2");
        System.out.println(car2);
    }
}

输出:

Car{brand='Ford', price=200000}
Car{brand='BMW', price=500000}


转载于:https://www.cnblogs.com/lgh1992314/p/6616214.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GlobalMapper精品教程】019:基于DSM提取离散随机点的高程信息

本文讲解在globalmapper中,基于DSM提取离散随机点的高程信息,配套数据为data019.rar。 文章目录 1. 离散点创建2. 提取离散点高程信息3. 高程标注1. 离散点创建 本文在ArcGIS中,根据给定的范围,随机生成离散点,如下图: 拓展阅读: ArcGIS根据范围创建随机点教程:【ArcG…

shell脚本注意点

2019独角兽企业重金招聘Python工程师标准>>> 直接命令行写脚本的时候&#xff0c;可以用 ; 分割&#xff0c;或 也可以直接回车&#xff0c;然后在继续写脚本在使用 方括号[ ] 的时候&#xff0c;里面空格两边都必须要有空格&#xff0c;比如 [ $a -gt 3 ] 在方括号…

C语言编程规范--------2 注释

2.1 注释的原则 注释的目的是解释代码的目的、功能和采用的方法&#xff0c;提供代码以外的信息&#xff0c;帮助读者理解代码&#xff0c;防止没必要的重复注释信息。 示例&#xff1a;如下注释意义不大。 /* if receive_flag is TRUE */ if (receive_flag) 而如下的注释则给出…

备战金九银十:RabbitMQ有5种工作模式(6)

RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff08;亦称面向消息的中间件&#xff09;。RabbitMQ服务器是用Erlang语言编写的&#xff0c;而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客…

【GlobalMapper精品教程】020:Lidar点云数据分类(自动分类、手动分类)案例详解

航测点云通常跟DSM一致,即包含植被、房屋等信息,必须进行点云分类、过滤,才能生成准确的高程点、等高线和DEM等地形数据。本文以案例的形式详细讲解globalmapper23中点云工具及使用方法。 文章目录 1. 点云分类2. 创建地面高程格网3. 地形绘制4. 格网转点云5. 点云抽稀6. 点…

社交网络图中结点的“重要性“计算(Dijkstra + SPFA + Floyd + 模板)

题目链接&#xff1a; 无 题目大意&#xff1a; 求一个点到其他所有点的最短距离和&#xff0c;保证图连通。 解题过程&#xff1a; 刚开始用 Floyd 水过的&#xff0c;后来用换了几种方法&#xff0c;不错的模板题&#xff0c;Floyd 的时候&#xff0c;要用 vector 存边&#…

web布局固定宽度+变化宽度实现思路

前言 页面当中常规布局我想大家都会的&#xff0c;但有些布局是常规布局中实现不了的&#xff0c;比如变宽和固宽结合的&#xff0c;需要实现(300px)&#xff0b;(100%&#xff0d;300px)的两列布局。以下样式代码前提均为盒模型为border-sizing 的前提下。 html部分 <div c…

CSS3 nth 伪类选择器

考察下面的 HTML 代码片段&#xff1a; <div><section>section 1</section><section>section 2</section><ul><li>item 1</li><li><ul><li>sub item 1</li><li>sub item 2</li><li>…

RedisCluster的安装、部署、扩容和 Java客户端调用

Redis下载 官网地址&#xff1a;http://redis.io/ 中文官网地址&#xff1a;http://www.redis.cn/ 下载地址&#xff1a;http://download.redis.io/releases/ 安装 # &#xff08;三台&#xff09;安装 C 语言需要的 GCC 环境 yum install -y gcc-c yum install -y wget # 下…

【CloudCompare教程】001:CloudCompare中文版下载与安装图文教程

CloudCompare是一款功能强大的点云后处理软件,本文讲解CloudCompare中文版下载与安装方法。 文章目录 一、CloudCompare下载地址二、CloudCompare安装教程三、CloudCompare中文设置一、CloudCompare下载地址 官方下载地址:http://www.danielgm.net/cc/release/ 二、CloudComp…

ML.NET相关资源整理

在人工智能领域&#xff0c;无论是机器学习&#xff0c;还是深度学习等&#xff0c;Python编程语言都是绝对的主流&#xff0c;尽管底层都是C实现的&#xff0c;似乎人工智能和C#/F#编程语言没什么关系。在人工智能的工程实现&#xff0c;通常都是将Python训练好的人工智能模型…

带参数的宏替换

带参数的宏替换因各种需求叠加&#xff0c;替换规则很怪异&#xff1a; 1、首先将实参替换形参&#xff0c;并展开宏 2、如果1步展开后&#xff0c;有#或者##&#xff0c;那么停止替换。 3、如果1步展开后&#xff0c;没有#或者##&#xff0c;且参数也是宏&#xff0c;那么继续…

JAVA学习日志(7-1-继承)

为什么80%的码农都做不了架构师&#xff1f;>>> 继承 1.提高代码复用性 2.让类与类之间产生关系&#xff0c;有了这个关系才有了多态的特性 **不要为了获取其他类的功能&#xff0c;简化代码而继承&#xff0c; 必须是类与类之间有所属关系才可以继承&#xff0c;所…

BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]

题意&#xff1a; 朋友的朋友是朋友&#xff0c;敌人的敌人是朋友&#xff1b;朋友形成团伙&#xff0c;求最多有多少团伙 种类并查集WA了一节课&#xff0c;原因是&#xff0c;只有那两种关系才成立&#xff0c;诸如朋友的敌人是朋友之类的都不成立&#xff01; 所以拆点做吧 …

常见Lidar点云数据处理及可视化软件汇总

常见的点云处理及可视化软件有&#xff1a; CloudCompare、Globalmapper、Pix4d、ArcGIS&#xff08;Pro&#xff09;、Lidar 360、PCL等等。 文章目录1. CloudCompare2. Globalmapper3. Pix4d4. ArcGIS&#xff08;Pro&#xff09;5. Lidar 3606. PCL1. CloudCompare CloudCo…

Spring 自带工具类汇总

断言 断言是一个逻辑判断&#xff0c;用于检查不应该发生的情况 Assert 关键字在 JDK1.4 中引入&#xff0c;可通过 JVM 参数-enableassertions开启 SpringBoot 中提供了 Assert 断言工具类&#xff0c;通常用于数据合法性检查 // 要求参数 object 必须为非空&#xff08;Not…

解决new Thread().Start导致高并发CPU 100%的问题

背景之前接手一个项目的时候&#xff0c;发现到处是new Thread(()>{ //do something }).Start();这么做的目的&#xff0c;无非是为了减少页面等待时间提高用户体验&#xff0c;把一些浪费时间的操作放到新线程中在后台运行。问题但是这样带来的问题是大量的创建线程&#x…

基于 HTML5 Canvas 绘制的电信网络拓扑图

电信网结构&#xff08;telecommunication network structure&#xff09;是指电信网各种网路单元按技术要求和经济原则进行组合配置的组合逻辑和配置形式。组合逻辑描述网路功能的体系结构&#xff0c;配置形式描述网路单元的邻接关系&#xff0c;即以交换中心&#xff08;或节…

网络相关配置,SSH服务,bash, 元字符

作业一&#xff1a;临时配置网络&#xff08;ip&#xff0c;网关&#xff0c;dns&#xff09;永久配置 设置IP和掩码ifconfig eth0 192.168.2.2 netmask 255.255.255.0设置网关route add default gw 192.168.2.10[rootbogon ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0…