11.Spring通过工厂方法配置Bean
通过工厂方法配置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的更多相关文章
- spring 通过工厂方法配置Bean
概要: 通过调用静态工厂方法创建Bean 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中.当client须要对象时,仅仅须要简单地调用静态方法,而不用关心创建对象地细节. 要声明通过静 ...
- Spring初学之通过工厂方法配置Bean
工厂方法配置bean分为两种,一种是实例工厂方法,另一种是静态工厂方法. 先来看看实体bean: Car.java: package spring.beans.factory; public clas ...
- 4.spriing:Bean的生命周期/工厂方法配置Bean/FactoryBean
1.Bean的生命周期 scope:singleton/prototype 1)spring容器管理singleton作用的生命周期,spring能够精确知道Bean合适创建,何时初始化完成,以及何时 ...
- 工厂方法配置bean
1:静态工厂方法配置bean 1):对象 package com.spring.helloworld; public class Car { private String name; private ...
- Spring4学习回顾之路07- 通过工厂方法配置Bean
一:通过静态工厂配置Bean 建立Student.java package com.lql.srping04; /** * @author: lql * @date: 2019.10.28 * Des ...
- Spring学习记录(九)---通过工厂方法配置bean
1. 使用静态工厂方法创建Bean,用到一个工厂类 例子:一个Car类,有brand和price属性. package com.guigu.spring.factory; public class C ...
- Spring4.0学习笔记(6) —— 通过工厂方法配置Bean
1.静态工厂方法: bean package com.spring.factory; public class Car { public Car(String brand) { this.brand ...
- spring4-2-bean配置-9-通过工厂方法配置bean
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjwAAAFICAIAAADbNrOHAAAgAElEQVR4nO2dy7W0uhGFOxWn4JEXAS
- Spring_通过工厂方法配置 Bean
beans-factory.xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns=&q ...
随机推荐
- bzoj 3944: Sum【莫比乌斯函数+欧拉函数+杜教筛】
一道杜教筛的板子题. 两个都是积性函数,所以做法是一样的.以mu为例,设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1} ...
- Golang 入门 : 理解并发与并行
Golang 的语法和运行时直接内置了对并发的支持.Golang 里的并发指的是能让某个函数独立于其他函数运行的能力.当一个函数创建为 goroutine 时,Golang 会将其视为一个独立的工作单 ...
- docker保存对容器的修改
我有一个Ubuntu的镜像用命令docker run -i -t -v /home/zzq/app/:/mnt/software/ 0ef2e08ed3fa /bin/bash登录进去发现没vi编辑器 ...
- SQL 初级教程学习(二)
1.SQL 语句从 "Websites" 表中选取头两条记录: SELECT * FROM Websites LIMIT 2; SELECT TOP 50 PERCENT * FR ...
- 1.1.2最小生成树(Kruskal和Prim算法)
部分内容摘自 勿在浮沙筑高台 http://blog.csdn.net/luoshixian099/article/details/51908175 关于图的几个概念定义: 连通图:在无向图中,若任意 ...
- DFS Codeforces Round #299 (Div. 2) B. Tavas and SaDDas
题目传送门 /* DFS:按照长度来DFS,最后排序 */ #include <cstdio> #include <algorithm> #include <cstrin ...
- Toasts官方教程
Toasts IN THIS DOCUMENT The Basics Positioning your Toast Creating a Custom Toast View 在其它线程中启动Toast ...
- PHP autoload实践
本文目的 本文简要的描述了PHP提供的autoload机制,以及在scake中使用实践.用于减少不必要的文件包含,提高php系统性能. 什么是__autoload php是脚本语言,不同于c++只需要 ...
- ZOJ 3605Find the Marble(dp)
ZOJ 3605 大体意思就是 找出随机选了K个交换后 石子在第i个罐子里的概率最大 也就是可能的总数最大 这样就可以写出递推方程 dp[i][j][k] += dp[i-1][e][k]; (0&l ...
- Spring注解驱动开发之AOP
前言:现今SpringBoot.SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解.原理,比如@Conditional.@Import.@Ena ...