通过工厂方法配置Bean暴扣静态工厂方法和实例工厂方法。

1.静态工厂方法

调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单的调用静态方法,而不去关心创建对象的细节。

  要声明通过静态方法创建的Bean,需要在Bean的class属性里指定拥有该工厂的方法的类,同时在factory-method属性里指定工厂方法的名称,最后,使用<constructor-arg>元素为该方法传递方法参数。

public class Car {
private String brand;
private double price; public Car() {
System.out.println("com.cn.Car's Constructor");
} public Car(String brand, double price) {
this.brand = brand;
this.price = price;
} public void setBrand(String brand) {
System.out.println("setBrand");
this.brand = brand;
} public String getBrand() {
return brand;
} public void setPrice(double price) {
this.price = price;
} public double getPrice() {
return price;
} @Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", price=" + price +
'}';
}
}
/**
* 静态工厂方法:直接调用某一个类的静态方法,就可以返回Bean的实例
*/
public class StaticCarFactory {
private static Map<String, Car> cars = new HashMap<String, Car>(); static {
cars.put("audi", new Car("audi", 300000));
cars.put("ford", new Car("ford", 400000));
} //静态工厂方法
public static Car getCar(String name) {
return cars.get(name);
}
}
<?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="factory.StaticCarFactory" factory-method="getCar">
<constructor-arg value="audi"></constructor-arg>
</bean>
</beans>
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("11.xml");
Car car1 = (Car) ctx.getBean("car1");
System.out.println(car1);
}
}

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAAAgCAIAAACjCWLqAAADtUlEQVR4nO1ZMW7bMBTtdfw5FW0yFYgDhEuQTfAqenOgHIDRIcqxm6fyEiUB7z1FjuIOEimKpGRJllyF+A8CqrDU+/zk0+On/OXHw2N1ff12Z6/dbkcCnN9evZvwz+o+7On2AdieiqwECEOY/z2c316ba7clhMD980dxOBf58b5+EB6zps/+OQOoW/b5R3E4F9n75qGmKrISoGEusrK6L7ISoNyZcLFR2ac+9nnV533zcCqyEu6OL9sqlyZQe8wh1bEieXs9PZosqrxMCn5eLPsbG3OEvJ17CeAxtyY2MiHx+fHm0J+WamnaPK28ivx438X8/bg/9EyXL4aewTixvkwTtHd5faKK9xpXAoDtybwk/W8a4lNgoqAvtoeKX6egCSHZS27HaY0T8UkxQtAIxPqBgkYkBRQ0IimgoBFJAQWNSAooaERSQEEjkgIKGpEUbiRoJpRSgt32RzgAJpYJuhxzqgCoJbB0oBGCZkJprbXWY4dll7/Oaj4p9BMCMCE5nRTLY/YUfA3zsNDXThHlUhsIVqVAuVRaa2VGPldLLIVIn9u4wFBBUy6reSGEMD5uLd1MZs+qixCAcik5nR5oOeal4b5vQLlUggHYFQTKBafEWdMrW0JE+6xL0FxOH4qdU7KYoPNNLpSynjTLJvBZ6opqM+nKvRay+YcYuT9tnmZpCa0tjEWbpV/cCIYKOrq0dl8TzCknKJf+Zq1k+zUVQvU/FWUW7UIcmJgg3/iYvQKjzTxLpeRmobWWnEZzj8YCyqVSbrEH9SN9+qipJKc1bctT8k0+S0tsB+vckCmXSx+lpgu6XRk7ixG8tYFDmy2wmWsVLbY8ZiPBqsU+P8JHO5i9mwjzLG49JPcwFtjpM87XGuGlUt6Q/X9Br8uhoyVH4xxtTfjdYhmGN0OYu26GlxxjmecW9IDcwwOoZ9hOjaEu5W7mZ54C4+qSYzU1NOXCvlvVoXDg8pAuQbdcKrIGQ33Usf+L6CO0PhhjnlnQ3bmHsew4CCGUMQrgKqYzkJVRbYvOoZAJ6R3vrmsJEe2zLkHbDzH2MxBxak2t9Z/fP385ztd+ttlrABiXfhUb8ZVO5qbErPooKeWYAtdltivt8XjM1gL7jH/AarnO2pV7vNGMuRGH3Wc6Sg57VHAOM0t9totZUuyz3RjrmYyUf1i5JQaVszexqHWiPi2s6ocVRBeGfJnu2osQ8wIFjUgKKGhEUkBBI5ICChqRFFDQiKSAgkYkBRQ0IimgoBFJAQWNSAooaERS+Adb06dxVjPvdQAAAABJRU5ErkJggg==" alt="" />

2.实例工厂方法

  将对象的创建过程封装到另外一个对象实例的方法里。当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。

  要声明通过实例工厂方法创建的Bean。在Bean的factory-bean属性里指定拥有该工厂方法的Bean,同时在factory-method属性里指定工厂方法的名称,最后,使用<constructor-arg>元素为该方法传递方法参数。

public class Car {
private String brand;
private double price; public Car() {
System.out.println("com.cn.Car's Constructor");
} public Car(String brand, double price) {
this.brand = brand;
this.price = price;
} public void setBrand(String brand) {
System.out.println("setBrand");
this.brand = brand;
} public String getBrand() {
return brand;
} public void setPrice(double price) {
this.price = price;
} public double getPrice() {
return price;
} @Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", price=" + price +
'}';
}
}
/**
* 实例工厂方法:实例工厂的方法,即先需要创建工厂本身,在调用工厂的实例方法来返回bean的实例
*/
public class InstanseCarFactory {
private Map<String, Car> cars = null; public InstanseCarFactory() {
cars = new HashMap<String, Car>();
cars.put("audi", new Car("audi", 300000));
cars.put("ford", new Car("ford", 400000));
} public Car getCar(String brand) {
return cars.get(brand);
}
}
<?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="carFactory" class="factory.InstanseCarFactory"></bean>
<!--通过实例工厂方法来配置bean-->
<!--
factory-bean:指向实例工厂方法的bean
factory-method:指向实例工厂方法的名字
constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数
-->
<bean id="car" factory-bean="carFactory" factory-method="getCar">
<constructor-arg value="ford"></constructor-arg>
</bean>
</beans>
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("11-2.xml");
Car car = (Car) ctx.getBean("car");
System.out.println(car);
}
}

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOIAAAApCAIAAACnXWL3AAAEZklEQVR4nO1ZPY7iMBTe6/BSrXagWmlAGjeIaiPaOB2jzAE8HGJcbpdqfYlNJPo9BUdhC4fYju1gQsjg0ftEER72+/Pn9xzz7efzSn6+/5i3n+12m1g4vb3aQnuM73NxbguA5aFI9wC2RP8JFutjsTu9vZ7Mn4wxpirnmHSTSQ8PK3C5kyRJst/ujnl22i6VksX6WGTlwqHwYlzmw65J0TVxDdTsT2xfni/NCtHj17w7FVm58OZNjv82gKaBFLyKmrZnbcz7zfrX7KnMs3IBsFgf83Xqjn+uxgTTNIhejcLlocjKRTtlecjXqUfPfrNOLZ3KqIpiXuYXNmQYTbux25rtbITkp38WrJaePM8D1mtZbuZO/bbPA2nqlLfP9kh9TIBbO2MbyBoma4y282CVqjEyF1KSZ8didyrS99nzoVuW2q9yH6d7gP22W3Wc/hzzTI55nz0finQP83KzlLEoQ6bPtqoy71ZuVTvzhtlGXDT95/LZodyMvdkMmma7vpoJceenk8NuWlR76Y7R18uj+anMdz3p0jWPXE07NO0RPgjgXCOTS/sH8YkYs5p2+Nrh8WPSNNHOpv3HU8Qn4gqaIhCfBaQpIgIgTRERAGmKiABIU0QEQJoiIgDSFBEBkKaICDARTSmvqorTaf/gAaD8Pkbvp/mrAqChwLDpV9CU8qqu67qurzXWLmrj63gL3K8QgHLBiP03PeVNINd4otvyaR4F4+4BqStJEgDCRFXXdXX2fCyJKwTHmFviCqUpYUJGmyQJZdetkO7f6HXIpxCAMCEYseWUVw55uK1s9uLU/IAAyoVoFq5dQSCMMzKixIZzzBQ0ZWI4t4AwcWeaZrOMV02x7y+TtzjwmL1elnk7dgDCGJWMASDtCspW8DJ7GUXiaFaWLaKWfuD2DqWpc3kIEzI1nGoNnTChNWIpF+aW4rzqn+XUzM0D7oDera+o8rAxLRjxRzHonGCbrs6xC0actpzHGOmhftzSffZZJIwzcqaM1dCyWTaKxNXHvM2TMDEsgcNpap44tRRbO8yqphWnbU92zPJp1tOtzb+uwnXGKz19/gy05TJ9IXaPh5VeEQ1/PAfETo9+BJpOUU2dTV/tcpNVIX7bDyGafQ+Dm36IP/2uhiM0do+H5gDVE5yxA6FcKOFHNk6Lv7np3/0Virf7QL5CBSY98dHUqCgXaOF60Krg+NW0489AWz7TPbY8HjZv64RSAsZB8yLatxn1WkO56LwM3SbpMaqPmYKm7RWDPC82wvOJra7rv38+fmv1z5yrqj0AZaJ77rRn+TVrt0KU13VdCSGsw5wPgWdTnz89tkLWQLfui90tPGdDLXnbbXrvxcwj/r0upDwb27qQumGTf+Xr/SkRcpP6mBcF02C6632ED747WnOMu04jQoA0RUQApCkiAiBNEREAaYqIAEhTRARAmiIiANIUEQGQpogIgDRFRACkKSICIE0REQBpiogASFNEBECaIiIA0hQRAZCmiAiANEVEgP89E19Lg3lwlgAAAABJRU5ErkJggg==" alt="" />

11.Spring通过工厂方法配置Bean的更多相关文章

  1. spring 通过工厂方法配置Bean

    概要: 通过调用静态工厂方法创建Bean 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中.当client须要对象时,仅仅须要简单地调用静态方法,而不用关心创建对象地细节. 要声明通过静 ...

  2. Spring初学之通过工厂方法配置Bean

    工厂方法配置bean分为两种,一种是实例工厂方法,另一种是静态工厂方法. 先来看看实体bean: Car.java: package spring.beans.factory; public clas ...

  3. 4.spriing:Bean的生命周期/工厂方法配置Bean/FactoryBean

    1.Bean的生命周期 scope:singleton/prototype 1)spring容器管理singleton作用的生命周期,spring能够精确知道Bean合适创建,何时初始化完成,以及何时 ...

  4. 工厂方法配置bean

    1:静态工厂方法配置bean 1):对象 package com.spring.helloworld; public class Car { private String name; private ...

  5. Spring4学习回顾之路07- 通过工厂方法配置Bean

    一:通过静态工厂配置Bean 建立Student.java package com.lql.srping04; /** * @author: lql * @date: 2019.10.28 * Des ...

  6. Spring学习记录(九)---通过工厂方法配置bean

    1. 使用静态工厂方法创建Bean,用到一个工厂类 例子:一个Car类,有brand和price属性. package com.guigu.spring.factory; public class C ...

  7. Spring4.0学习笔记(6) —— 通过工厂方法配置Bean

    1.静态工厂方法: bean package com.spring.factory; public class Car { public Car(String brand) { this.brand ...

  8. spring4-2-bean配置-9-通过工厂方法配置bean

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjwAAAFICAIAAADbNrOHAAAgAElEQVR4nO2dy7W0uhGFOxWn4JEXAS

  9. Spring_通过工厂方法配置 Bean

    beans-factory.xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns=&q ...

随机推荐

  1. bzoj 1072: [SCOI2007]排列perm【状压dp】

    先写了个next_permutation结果T了,于是开始写状压 设f[s][i]为选取状态为s,选的数模d为i的方案数,去重的话直接除以每个数字的出现次数的阶乘即可 #include<iost ...

  2. hdu 1348【凸包模板】

    #include<iostream> #include<iostream> #include<algorithm> #include<cmath> us ...

  3. Phoenix数据覆盖的一种解决方案

    最近在做实时数仓,需要兼顾离线和实时两种查询方式,大致的方案是数据通过binlog抽取,经Phoenix插入,hive映射hbase表:Phoenix创建索引,实时查询Phoenix:离线查询hive ...

  4. 全选Js

    <th><input type="checkbox" value="" id="checkedAll" onclick=& ...

  5. 浅谈算法——线段树之Lazy标记

    一.前言 前面我们已经知道线段树能够进行单点修改和区间查询操作(基本线段树).那么如果需要修改的是一个区间该怎么办呢?如果是暴力修改到叶子节点,复杂度即为\(O(nlog n)\),显然是十分不优秀的 ...

  6. 使用Navicat迁移MySQL数据至Oracle时大小写原因报“表或视图不存在”问题处理

    使用Navicat提供的数据传输工具将JEECMSv9的MySQL的数据迁移至Oracle数据库,数据迁移成功表都存在,但是在程序启动时提示表或视图不存在. Caused by: java.sql.S ...

  7. 数据流和ByteArray

    问题:如何把一个long类型的数写进一个文件里 所以现在有DataInputStream和DataOutputStream 这两个是节点流 例子代码: import java.io.*; public ...

  8. Ubuntu编译安装Apache

    第一步:编译安装依赖包apr,apr-util和pcre ./configure --prefix= make && make install 第二步:编译安装Apache ./con ...

  9. [转]在asp.net mvc中使用PartialView返回部分HTML段

    本文转自:http://blog.csdn.net/sandy945/article/details/6307750 问题链接: MVC如何实现异步调用输出HTML页面 该问题是个常见的 case, ...

  10. Windows远程桌面连接复制文件失败或非常慢

    环境搭建过程中经常会遇到需要将文件从本机传到云服务器或者企业内部服务器上的场景,此时如果文件过大的话要传个半天或者直接告诉你复制失败,让人好生无奈 ~ ~.   windows环境下,可以将本地磁盘映 ...