静态工厂方法和实例工厂方法及普通的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)要声明通过静态 ...
随机推荐
- Android - AsyncTask你知道多少?
http://www.cnblogs.com/qlky/p/5658070.html 为什么asyncTask最好在主线程初始化?在子线程怎么办? AsyncTask四个方法的执行顺序? mWorke ...
- Unix环境高级编程:守护进程
参考 Unix环境高级编程,第9,13章 介绍 守护进程就是Linux中使用ps aux那些一般以d结尾的程序,比如rsyslogd,sshd等,为daemon简称.他们是长期在后台执行的随终端关闭而 ...
- Code Signal_练习题_evenDigitsOnly
Check if all digits of the given integer are even. Example For n = 248622, the output should beevenD ...
- imanager一些常用方法汇总
一.求和函数(根据键值数组求键值的总和) function sum(arr){ //arr是传入的值数组,格式如["张三","李四","王五" ...
- js-权威指南学习笔记19.2
1.jQuery动画是异步的,会立刻返回,但动画会在后台执行,可传入函数作为动画完成的回调函数. 2.jQuery动画默认是队列化的. 3.stop()方法接受两个可选的布尔值参数,如果第一个参数是t ...
- Vue.js之生命周期
有时候,我们需要在实例创建过程中进行一些初始化的工作,以帮助我们完成项目中更复杂更丰富的需求开发,针对这样的需求,Vue提供给我们一系列的钩子函数. vue生命周期 beforeCreate 在实例初 ...
- AngularJS学习之 ui router
1.安装 bower install --save angular_ui-router 2.在项目主页面 index.html中添加 <div ui-view="">& ...
- php 实现简单购物车功能(2)
上一篇的时候只是写了简单的加入购物车功能,购物车中产品的删除.提交订单后,库存的减少 以及客户账户的余额都没有完善, 这一篇是接着完善上一篇的,上一篇写到了购物车中删除的功能了,为了使删除的代码少敲一 ...
- flutter tab切换页面防止重置
问题描述:TabBar 配合TabBarView切换页面,然后每个页面是一个listview加载数据,但是切换页面后listview的数据会被重置, 重新被加载了,解决办法使用 with Automa ...
- 注意Sqlserver中使用with(nolock)后实际上还是会加架构锁,只是不对要查询的数据加S锁而已(转载)
开发人员喜欢在SQL脚本中使用WITH(NOLOCK), WITH(NOLOCK)其实是表提示(table_hint)中的一种.它等同于 READUNCOMMITTED . 具体的功能作用如下所示(摘 ...