深入学习Spring框架之五通过工厂方法创建Bean

原创 2016年09月08日 16:01:37

    前面我们介绍了,通过构造器的方式创建Bean对象,今天我们来讲一下通过工厂方法来创建Bean。

    有些时候,我们有必要将一些类设置为单例模式,比如说一个国家的最高领导人,再比如我们在银行办理业务的时候,整个业务流程中间,我们作为银行的客户身份必须是独一无二,不然你的钱存到了别人账户里去了,那你能干吗?

    下面是类的具体实现:

/**
 * 我们只希望有一个习大大,所以外面没有其他方式创建
 * 只能通过静态工厂方法获得,忠于习大大的领导
 * @author liuyc
 */
public class TopLeader {
	private TopLeader(){
		
	}
	/**
	 * 内部类,延迟加载实例
	 * @author liuyc
	 */
	private static class SingleToLeaderControllor{
		static final TopLeader instance = new TopLeader();
	}
	
	public static TopLeader getInstance(){
		return SingleToLeaderControllor.instance;
	}
}
    在这里我们运用了一种被称为initialization on demand holder的技术来创建单例类的实例,说白了就是延迟加载单例模式。

    往深一点讲,这得益于Java虚拟机初始化阶段的特性,当一个类被JVM加载,这个类就会历经初始化的过程。既然这个类没有其他静态的变量需要初始化,那么初始化过程就会顺利完成。而定义在类里面的静态类SingleToLeaderControllor直到JVM确定SingleToLeaderControllor一定会被执行的时候才会去初始化。

    当静态方法getInstance调用时,静态类SingleToLeaderControllor被执行,当这件事第一次发生时,JVM这才去加载并初始化SingleToLeaderControllor 

    SingleToLeaderControllor的初始化导致了静态变量instance的初始化,而内部类和外部类的初始化过程是串行操作的,而静态变量又在类的初始化过程中被写入,所以调用getInstance方法返回的是相同的instance,所以即使在并行操作环境下,也不用再考虑同步的开销。


    回到我们的主题,怎么在Spring中通过工厂方法创建Bean呢?

    <bean>元素有一个factory-method,允许我们指定一个静态方法代替构造方法创建类的实例。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	
	<bean id="leader"  class ="com.cm2easy.miki.example.chapter1.TopLeader" factory-method="getInstance"></bean>
</beans>
    至此,我们就使用Spring的factory-method方法配置了一个单例类的实例


版权声明:本文为博主原创文章,未经博主允许不得转载。

Spring的实例工厂方法和静态工厂方法

Spring的实例工厂方法和静态工厂方法  静态工厂方法:直接调用静态方法可以返回Bean的实例 package com.zhu.string.factory; import java.util....
  • zhupengqq
  • zhupengqq
  • 2016年07月01日 21:03
  • 5350

Spring中的设计模式--工厂方法模式

关于工厂模式的误会这是个老生常谈的问题,很多新手或者不太在意设计模式的同事会对工厂模式有极深的误解,总会把“工厂模式”与“静态工厂方法”混为一谈,什么是静态工厂方法呢?可以看一个非常简单的例子:pub...
  • zstu_cc
  • zstu_cc
  • 2017年01月02日 19:40
  • 3861

Spring Bean工厂创建Bean实例的方法之使用静态工厂类

定义接口: package Bean.staticFactoryBean;public interface Axe ...{   public String chop();}package Bean....
  • daryl715
  • daryl715
  • 2007年03月23日 17:21
  • 3512

Spring Bean工厂创建Bean实例的方法之使用工厂类

定义接口: package Bean.FactoryMethods;public interface Axe ...{   public String chop();}package Bean.Fac...
  • daryl715
  • daryl715
  • 2007年03月23日 17:54
  • 3048

Spring中Bean的生成过程

Spring是个Bean大工厂,负责Bean的创建和注入。核心接口BeanFactory是Spring最核心接口,它是Bean的容器,所有Bean的创建和注入几乎都与它有关。很多后缀是“Context...
  • csujiangyu
  • csujiangyu
  • 2016年11月02日 15:31
  • 1921

spring通过工厂方法和FactoryBean来配置Bean

spring通过工厂方法配置Bean 1.通过调用静态工厂方法创建bean(直接调用某一个类的静态方法就可以返回bean的实例) 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当...
  • Mrwuyi
  • Mrwuyi
  • 2016年06月03日 14:30
  • 2047

spring MethodInvokingFactoryBean 的使用和了解,Spring 通过通过方法创建Bean的实例

spring MethodInvokingFactoryBean 的使用和了解作用 让某个实例的某个方法的返回值注入为Bean的实例 让某个类的静态方法的返回值注入为Bean的实例 使用MethodI...
  • u012881904
  • u012881904
  • 2017年08月24日 16:31
  • 597

Spring 工厂方式 创建bean实例

摘自:http://layznet.iteye.com/blog/906619    很多情况下使用定义一个bean,这种定义方式Spring将会调用默认的无参数构造方法创建Bean实例。除此...
  • u014223536
  • u014223536
  • 2015年03月03日 15:04
  • 966

深入学习Spring框架之一Spring的简要概括

Java开发的春天 Spring框架最初的形成,来自于最初的一位Java领域的大牛-----Rod Jahnson。这位大牛所著的一本叫做《Expert One-on-One J2EE Design...
  • lycyl
  • lycyl
  • 2016年09月06日 11:28
  • 1521

spring源码学习之路---深入AOP(终)

作者:zuoxiaolong8810(左潇龙),转载请注明出处。                 上一章和各位一起看了一下springAOP的工作流程,当我们给出AOP相关的配置以后,直接从IOC容...
  • zuoxiaolong8810
  • zuoxiaolong8810
  • 2013年05月22日 22:28
  • 2948
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入学习Spring框架之五通过工厂方法创建Bean
举报原因:
原因补充:

(最多只允许输入30个字)