`
layznet
  • 浏览: 225013 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring工厂方式创建Bean实例

阅读更多
    很多情况下使用<bean id=”bean1” class=”…” />定义一个bean,这种定义方式Spring将会调用默认的无参数构造方法创建Bean实例。除此之外还可以使用工厂方式创建Bean实例,实现Bean创建与使用的分离,将Bean创建工作交由工厂来完成。
配置工厂Bean的三种方式。
抽象接口:
public interface IMusicBox {
     public void play();
}

1、静态工厂方法取得Bean实例
工厂类:
public class MusicBoxFactory {
    public static IMusicBox createMusicBox(){
	return new IMusicBox(){
              public void play(){
		System.out.println("Play piano...");
	     }
	};
    }
}

配置文件:
<bean id="musicBox" class="test.spring.MusicBoxFactory" factory-method="createMusicBox" />

测试类:
public static void main(String[] args) {
    ApplicationContext  ctx = 
	new ClassPathXmlApplicationContext("bean-config.xml");
    IMusicBox musicbox = (IMusicBox)ctx.getBean("musicBox");
    musicbox.play();
}


2、工厂实例的方法取得Bean实例
工厂类:
public class MusicBoxFactory {
    public IMusicBox createMusicBox(){//没有static修饰
	return new IMusicBox(){
              public void play(){
		System.out.println("Play piano...");
	     }
	};
    }
}


配置文件:
<bean id="factoryBean"  class="test.spring.MusicBoxFactory" />
<bean id="musicBox" factory-bean="factoryBean" factory-method="createMusicBox" />

“factory-bean”属性指定工厂Bean,”factory-method”属性指定工厂方法来取得Bean实例。

测试类:
public static void main(String[] args) {
    ApplicationContext  ctx = 
	new ClassPathXmlApplicationContext("bean-config.xml");
    IMusicBox musicbox = (IMusicBox)ctx.getBean("musicBox");
    musicbox.play();
}


3、工厂类实现org.springframework.beans.factory.FacotryBean接口
工厂类:
import org.springframework.beans.factory.FactoryBean;

public class MusicBoxFactory2 implements FactoryBean {
    public Object getObject() throws Exception {
	return new IMusicBox(){
	    public void play(){
	         System.out.println("Play piano...");
              }
	};
    }

    public Class getObjectType() {
	return IMusicBox.class;
    }

    public boolean isSingleton() {
	return false;
    }
}


配置文件:
<bean id="musicBox" class="test.spring.MusicBoxFactory2"/>


测试类:
public static void main(String[] args) {
    ApplicationContext  ctx = 
	new ClassPathXmlApplicationContext("bean-config.xml");
    //不加 & 返回工厂的“产品”
    IMusicBox musicbox = (IMusicBox)ctx.getBean("musicBox");
    musicbox.play();
    //加 & 返回工厂类实例
    Object obj = ctx.getBean("&musicBox");  
    System.out.println(obj.getClass().getName()); 

}

实现FactoryBean接口的类不会被视为普通的Bean,Spring会自动检测,调用getObject方法获取Bean实例
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics