通过工厂方法配置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 2733: [HNOI2012]永无乡【并查集+权值线段树】

    bzoj上数组开大会T-- 本来想用set瞎搞的,想了想发现不行 总之就是并查集,每个点开一个动态开点的权值线段树,然后合并的时候把值并在根上,询问的时候找出在根的线段树里找出k小值,看看这个值属于哪 ...

  2. [App Store Connect帮助]七、在 App Store 上发行(2.1)设定价格与销售范围:为您的 App 设定价格

    在您提交 App 以供审核之前,您必须为您的 App 设定一个价格,该价格将用于 App Store 的所有地区.如果您没有<付费应用程序协议>,则只能选择免费. 必要职能:“帐户持有人” ...

  3. Spark SQL概念学习系列之Spark SQL入门

    前言 第1章   为什么Spark SQL? 第2章  Spark SQL运行架构 第3章 Spark SQL组件之解析 第4章 深入了解Spark SQL运行计划 第5章  测试环境之搭建 第6章 ...

  4. springMVC RedirectAttributes

    @Controller public class TestController { @RequestMapping("/redirectDemo") public String r ...

  5. SQL 初级教程学习(三)

    1.SQL JOIN  NNER JOIN:如果表中有至少一个匹配,则返回行 LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行 RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的 ...

  6. BZOJ2159 Crash的文明世界

    Description 传送门 给你一个n个点的树,边权为1. 对于每个点u, 求:\(\sum_{i = 1}^{n} distance(u, i)^{k}\) $ n \leq 50000, k ...

  7. 51nod 1154 回文串划分

    1154 回文串划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有 ...

  8. Vasiliy's Multiset CodeForces -706D || 01字典树模板

    就是一个模板 注意这题有一个要求:有一个额外的0一直保持在集合中 #include<cstdio> #include<algorithm> using namespace st ...

  9. 逆序数 UVALive 6508 Permutation Graphs

    题目传送门 /* 题意:给了两行的数字,相同的数字连线,问中间交点的个数 逆序数:第一行保存每个数字的位置,第二行保存该数字在第一行的位置,接下来就是对它求逆序数 用归并排序或线段树求.想到了就简单了 ...

  10. ASP.NET CORE 使用 EF CORE访问数据库

    asp.net core通过ef core来访问数据库,这里用的是代码优先,通过迁移来同步数据库与模型. 环境:vs2017,win10,asp.net core 2.1 一.从建立asp.net c ...