静态工厂方法和实例工厂方法及普通的bean
容纳你的bean
bean工厂:最简单的容器,提供了基础的依赖注入支持。创建各种类型的Bean。
应用上下文(ApplicationContext):建立在bean工厂基础之上,提供系统架构服务。
bean工厂介绍
工厂设计模式,创建分发各种bean。配置好它们之间的协作关系,参与bean的生命周期。
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
bean工厂只把bean的定义信息加载进来,用到的时候才实例化。
factory.getBean("mybean");就可得到一个bean
静态工厂方法实例
package com.test.srping.bean.factory; import java.util.HashMap;
import java.util.Map; //静态工厂方法:直接调用某一个类的静态方法就可以返回Bean的实例
public class StaticCarFactory {
private static Map<String,Car> cars = new HashMap<String,Car>(); static{
cars.put("baoma", new Car("BaoMa",));
cars.put("benci", new Car("BenCi",));
} public StaticCarFactory(){
System.out.println("静态工厂方法构造函数被调用-StaticCarFactory");
}
//静态工厂方法,不需要创建staticCarFactory对象情况下,通过该方法就可以得到对应的实例
public static Car getCar(String brand){
return cars.get(brand);
}
}
实例工厂方法实例
package com.test.srping.bean.factory; import java.util.HashMap;
import java.util.Map; //实例工厂方法:实例工厂的方法,即先需要创建工厂bean本身,再调用工厂的实例方法来 返回bean的实例
public class InstanceCarFactory {
private Map<String,Car> cars = null; public InstanceCarFactory(){
cars = new HashMap<String,Car>();
cars.put("audi", new Car("Audi",));
cars.put("ford", new Car("Ford",));
System.out.println("实例工厂方法构造函数被调用-InstanceCarFactory");
} public Car getCar(String brand){
return cars.get(brand);
}
}
package com.test.srping.bean.factory;
public class Car {
private String brand;
private double price;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", price=" + price + "]";
}
public Car(String brand, double price) {
super();
this.brand = brand;
this.price = price;
}
}
<?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.test.srping.bean.factory.StaticCarFactory"
factory-method="getCar">
<constructor-arg value="baoma"></constructor-arg>
</bean> <!-- .配置工厂的实例 -->
<bean id="carFactory"
class="com.test.srping.bean.factory.InstanceCarFactory"></bean>
<!--
.通过实例工厂来配置bean
class属性:指向实例工厂方法的全类名
factory-method:指向实例工厂方法的名字
constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数
-->
<bean id="car2" factory-bean="carFactory"
factory-method="getCar">
<constructor-arg value="ford"></constructor-arg>
</bean> </beans>
package com.test.srping.bean.factory; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /*
* 1.通过调用静态工厂方法创建bean(直接调用某一个类的静态方法就可以返回bean的实例)
调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单的调用静态方法,
而不关心创建对象的细节。
要声明通过静态方法创建bean:
1.需要在bean的class属性里指定拥有该方法的类,
2.同时在factory-method属性里指定工厂方法的名称,
3.最后,使用<constrctor-arg>元素为该方法传递方法参数。
*/
//spring通过工厂方法配置Bean
public class Mainfactory {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factory.xml"); //静态工厂方法测试:
Car car1 = (Car) ctx.getBean("car1");
System.out.println(car1); //实例工厂方法测试:
Car car2 = (Car) ctx.getBean("car2");
System.out.println(car2);
}
}
运行结果
实例工厂方法构造函数被调用-InstanceCarFactory
Car [brand=BaoMa, price=3000000.0]
Car [brand=Ford, price=400000.0]
实例工厂方法在加载过程中对象被创建,静态工厂方法没有被创建直接被调用
--------------------------------------------------------------------------------------------
通过实现FactoryBean接口来配置bean
package com.test.spring.bean.factorybean; import org.springframework.beans.factory.FactoryBean; //自定义的Factory需要实现FactoryBean接口
public class CarFactoryBean implements FactoryBean<Car>{
private String brand; public void setBrand(String brand) {
this.brand = brand;
}
//返回bean的对象
public Car getObject() throws Exception {
return new Car(brand,);
}
//返回的bean的类型
public Class<?> getObjectType() {
return Car.class;
}
//是否是单例的
public boolean isSingleton() {
return true;
}
}
<?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">
<!--
通过FactoryBean来配置Bean的实例
class:指向FactoryBean的全类名
property:配置FactoryBean的属性 注意:实际返回的实例是FactoryBean的getObject()方法返回的实例
-->
<bean id="car1"
class="com.test.spring.bean.factorybean.CarFactoryBean">
<property name="brand" value="BMW"></property>
</bean>
</beans>
package com.test.spring.bean.factorybean; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* 2.通过调用实例工厂方法创建bean(即先需要创建工厂bean本身,再调用工厂的实例方法来返回bean的实例)
实例工厂方法:将对象的创建过程封装到另外一个对象实例方法里,当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。
1.先声明实例工厂类的bean
声明通过实例工厂方法创建的bean:
2.在bean的factory-bean属性里指定拥有该该工厂方法的bean
3.在factory-method属性里指定该工厂方法的名称。
4.使用constructor-arg元素为工厂方法传递方法参数。
*
*/
//通过FactoryBean来配置Bean
public class MainFactoryBean {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factorybean.xml"); Car car = (Car) ctx.getBean("car1");
System.out.println(car);
}
}
静态工厂方法和实例工厂方法及普通的bean的更多相关文章
- Java——静态变量/方法与实例变量/方法的区别
静态只能调用静态 非静态: 对象名.方法名 package ti; //通过两个类 StaticDemo.LX4_1 说明静态变量/方法与实例变量/方法的区别. class StaticDemo { ...
- Spring学习--静态工厂方法、实例工厂方法创建 Bean
通过调用静态工厂方法创建 bean: 调用静态工厂方法创建 bean 是将对象创建的过程封装到静态方法中 , 当客户端需要对象时 , 只需要简单地调用静态方法 , 而不需要关心创建对象的细节. 要声明 ...
- [原创]java WEB学习笔记102:Spring学习---Spring Bean配置:bean配置方式(工厂方法(静态工厂方法 & 实例工厂方法)、FactoryBean) 全类名
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring实例化Bean三种方法:构造器、静态工厂、实例工厂
Spring中Bean相当于java中的类,可以通过xml文件对bean进行配置和管理. 一.Bean的实例化: 构造器实例化.静态工厂实例化.实例工厂方式实例化. 目录: 构造器实例化: xml配置 ...
- 【Spring】Spring中的Bean - 2、Baen的实例化 (构造器、静态工厂、实例工厂)
Bean的实例化 文章目录 Bean的实例化 构造器实例化 静态工厂方式实例化 实例工厂方式实例化 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-S ...
- 4.spring对象的创建(静态工厂 实例工厂 泛型,嵌套类型)
1.原料类 namespace CreateObjects{ public class GenericClass<T> { }} PersonDao 类 包含嵌套类型 name ...
- vue教程2-04 vue实例简单方法
vue教程2-04 vue实例简单方法 vue实例简单方法: vm.$el -> 就是元素 vm.$data -> 就是data <!DOCTYPE html> <htm ...
- Python面向对象高级编程:__slot__(给实例添加方法、属性)
纲要: 本章总的来说是给实例添加属性,给类添加方法两个主题,以及相应的作用范围.总结如下: 1.给实例添加属性(作用范围:当然是只对当前实例有效): 2.用__slots__限制可以给实例添加的属性( ...
- Spring(十三):使用工厂方法来配置Bean的两种方式(静态工厂方法&实例工厂方法)
通过调用静态工厂方法创建Bean 1)调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中.当客户端需要对象时,只需要简单地调用静态方法,而不需要关心创建对象的具体细节. 2)要声明通过静态 ...
随机推荐
- HTML文字闪烁
<div id="blink">闪烁的文字</div> <script language="javascript"> fun ...
- CSS图标文字不对齐
页面排版经常遇到‘图标+文字’的需求,正常样式写下来是这样 , 但产品要的应该是长这样 ,怎么办呢?其实很简单,加个样式看看 vertical-align: top/middle/bottom; ...
- python生成器简单了解
1.什么是生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素, ...
- CSS笔记——属性选择器
1.存在和值(Presence and value)属性选择器这些属性选择器尝试匹配精确的属性值:[attr]:该选择器选择包含 attr 属性的所有元素,不论 attr 的值为何.[attr=val ...
- Thinkphp5+PHPExcel实现批量上传表格数据
1.首先要下载PHPExcel放到vendor文件夹下,我的路径是:项目/vendor/PHPExcel/,把下载的PHPExcel文件放在这里 2.前端代码 <!DOCTYPE html> ...
- PHP实现批量删除(封装)
前台 <!DOCTYPE html> <html> <head> <title>批量删除</title> </head> < ...
- linux mysql 卸载与安装及配置命令
1.RPM包安装方式的MySQL卸载 1) 检查是否安装了MySQL组件. # rpm -qa | grep -i mysql 2)卸载前关闭MySQL服务 # service mysql statu ...
- java中return、break、continue的区别
1.return @Testpublic void testReturn(){ for (int j = 1; j < 3; j++) { for (int i = 1; i < 5; i ...
- EasyUI 通过 Combobox 实现 AutoComplete 效果
朋友在做一个web程序,用的EasyUI框架,让我帮忙实现一个自动提示功能.由于之前我也没用过EasyUI框架,就想到了jQueryUI有 AutoComplete 插件,就想直接拿过来用. 但当我将 ...
- ActiveReports 报表应用教程 (14)---数据可视化
葡萄城ActiveReports报表中提供了丰富的数据可视化解决方案,用户可以将数据以图像化的方式进行显示,让报表数据更加形象且便于理解.在葡萄城ActiveReports报表中提供了大多数常用的二维 ...