容纳你的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的更多相关文章

  1. Java——静态变量/方法与实例变量/方法的区别

    静态只能调用静态 非静态: 对象名.方法名 package ti; //通过两个类 StaticDemo.LX4_1 说明静态变量/方法与实例变量/方法的区别. class StaticDemo { ...

  2. Spring学习--静态工厂方法、实例工厂方法创建 Bean

    通过调用静态工厂方法创建 bean: 调用静态工厂方法创建 bean 是将对象创建的过程封装到静态方法中 , 当客户端需要对象时 , 只需要简单地调用静态方法 , 而不需要关心创建对象的细节. 要声明 ...

  3. [原创]java WEB学习笔记102:Spring学习---Spring Bean配置:bean配置方式(工厂方法(静态工厂方法 & 实例工厂方法)、FactoryBean) 全类名

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. Spring实例化Bean三种方法:构造器、静态工厂、实例工厂

    Spring中Bean相当于java中的类,可以通过xml文件对bean进行配置和管理. 一.Bean的实例化: 构造器实例化.静态工厂实例化.实例工厂方式实例化. 目录: 构造器实例化: xml配置 ...

  5. 【Spring】Spring中的Bean - 2、Baen的实例化 (构造器、静态工厂、实例工厂)

    Bean的实例化 文章目录 Bean的实例化 构造器实例化 静态工厂方式实例化 实例工厂方式实例化 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-S ...

  6. 4.spring对象的创建(静态工厂 实例工厂 泛型,嵌套类型)

    1.原料类 namespace CreateObjects{    public class GenericClass<T>    { }} PersonDao 类 包含嵌套类型 name ...

  7. vue教程2-04 vue实例简单方法

    vue教程2-04 vue实例简单方法 vue实例简单方法: vm.$el -> 就是元素 vm.$data -> 就是data <!DOCTYPE html> <htm ...

  8. Python面向对象高级编程:__slot__(给实例添加方法、属性)

    纲要: 本章总的来说是给实例添加属性,给类添加方法两个主题,以及相应的作用范围.总结如下: 1.给实例添加属性(作用范围:当然是只对当前实例有效): 2.用__slots__限制可以给实例添加的属性( ...

  9. Spring(十三):使用工厂方法来配置Bean的两种方式(静态工厂方法&实例工厂方法)

    通过调用静态工厂方法创建Bean 1)调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中.当客户端需要对象时,只需要简单地调用静态方法,而不需要关心创建对象的具体细节. 2)要声明通过静态 ...

随机推荐

  1. java设计模式-----21、备忘录模式

    概念: Memento模式也叫备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式,它的作用是保存对象的内部状态,并在需要的时候(u ...

  2. deferred对象详解

    什么是Deferred对象  defer,推迟:延期.含义就是”延迟”到未来某个点再执行. 在开发中,我们经常遇到某些耗时很长的javascript操作.其中,既有异步的操作(比如ajax读取服务器数 ...

  3. JS 回调函数、立即执行、for块作用域、try/catch、let、垃圾收集 p3

    限于时间关系,加上有些倦意,简单的记录下一些要点: 1.回调函数:就你把函数当成参数传给另一个函数,这个函数在某个时间段会执行这个函数.

  4. multipartUpload上传图片到阿里云

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. 微信小程序 引入公共页面的几种情况

    1.不带参数 首先在pages文件夹中新建一个template文件夹,文件夹中新建一个template.wxml文件,代码如下 <!--template.wxml--> <templ ...

  6. js-ES6学习笔记-for...of循环

    1.一个数据结构只要部署了Symbol.iterator属性,就被视为具有iterator接口,就可以用for...of循环遍历它的成员.也就是说,for...of循环内部调用的是数据结构的Symbo ...

  7. SD从零开始47-50, 装运成本基础、控制、结算, 信用/风险管理概述

    [原创] SD从零开始47 装运成本基础 详细的装运成本处理Shipment Cost Processing in Detail 装运成本计算和装运成本结算可用于内向和外向交货: 装运成本记录在一张新 ...

  8. Android Vsync 原理浅析

    Preface Android中,Client测量和计算布局,SurfaceFlienger(server)用来渲染绘制界面,client和server的是通过匿名共享内存(SharedClient) ...

  9. 使用 Roslyn引擎动态编译代码

    Roslyn引擎自2014年开源至今这么久,一直没怎么了解过,虽然VS2015早就集成了它. 以前老一套的动态编译方法在 .NET Core中似乎不再支持了,很多方法都是未实现的.下面就介绍如何在.N ...

  10. Oracle EBS GL总账凭证取值

    SELECT gh.je_header_id, gh.period_name, gh.default_effective_date, gh.je_source, gs.user_je_source_n ...