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 2115: [Wc2011] Xor【线性基+dfs】
-老是想到最长路上 其实可以这样:把每个环的xor和都存起来,然后任选一条1到n的路径的xor和ans,答案就是这个ans在环的线性基上跑贪心. 为什么是对的--因为可以重边而且是无相连通的,并且对于 ...
- P4475 巧克力王国(KDTree)
传送门 首先可以把约束条件看成一条直线,然后每个巧克力看成一个点,求给定区域内的点权和 用KDTree,每次判断一下当前矩形是否整个都在里面或都在外面,是的话直接返回,否则的话递归 注意,必须该矩形四 ...
- 洛谷P4550 收集邮票(概率期望)
传送门 神仙题啊……这思路到底是怎么来的…… ps:本题是第$k$次买邮票需要$k$元,而不是买的邮票标号为$k$时花费$k$元 我们设$g[i]$表示现在有$i$张,要买到$n$张的期望张数,设$P ...
- 部分安卓微信浏览器无法触发onchange事件
这是安卓微信的一个遗留问题. 解决办法很简单: 将input标签 <input type=“file" name="image" accept="imag ...
- Ubuntu 18 开机后直接进入命令行界面,没法进入桌面
应该是之前不知道干啥,删了gnome的一个东西,导致没法正常进入 暴力解决,直接重装桌面环境 sudo apt install ubuntu-desktop
- CF1140G Double Tree
题解 首先如果我们要确定出每个\(dis_{i \to i+1 , i \in odd}\) 这个可以用两遍树形\(DP\)来解决 一遍是考虑走子树子树绕过来的 一遍是考虑从走祖先绕过来的 然后就可以 ...
- ORACLE数据库的备份分为物理备份和逻辑备份两种。
物理备份是将实际组成数据库的操作系统文件从一处拷贝到另一处的备份过程,通常是从磁盘到磁带.可以使用 Oracle 的恢复管理器(Recovery Manager,RMAN)或操作系统命令进行数据库的物 ...
- Python 相关疑问
1. 如果我的脚本error handling 做的好,在ctrl+c退出的时候是不是不应该有任何traceback log? 2. repr() str() eval() 之间的区别? 3. 参数传 ...
- Cenos7 切换单用户模式
CentOS 7在进入单用户的时候和6.x做了很多改变,下面让我们来看看如何进入单用户. 1.重启服务器,在选择内核界面使用上下箭头移动 2.选择内核并按“e” 3.修改参数 将rhgb quiet ...
- 【转】在Ubuntu中安装HBase
原博客出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/ 感谢! Posted: Apr 3, 2014 Tags: Hado ...