Spring工厂方式创建Bean实例

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

1、静态工厂方法取得Bean实例
工厂类:
Java代码 复制代码  收藏代码
  1. public class MusicBoxFactory {   
  2.     public static IMusicBox createMusicBox(){   
  3.     return new IMusicBox(){   
  4.               public void play(){   
  5.         System.out.println("Play piano...");   
  6.          }   
  7.     };   
  8.     }   
  9. }  
public class MusicBoxFactory {
    public static IMusicBox createMusicBox(){
	return new IMusicBox(){
              public void play(){
		System.out.println("Play piano...");
	     }
	};
    }
}

配置文件:
Xml代码 复制代码  收藏代码
  1. <bean id="musicBox" class="test.spring.MusicBoxFactory" factory-method="createMusicBox" />  

测试类:
Java代码 复制代码  收藏代码
  1. public static void main(String[] args) {   
  2.     ApplicationContext  ctx =    
  3.     new ClassPathXmlApplicationContext("bean-config.xml");   
  4.     IMusicBox musicbox = (IMusicBox)ctx.getBean("musicBox");   
  5.     musicbox.play();   
  6. }  
public static void main(String[] args) {
    ApplicationContext  ctx = 
	new ClassPathXmlApplicationContext("bean-config.xml");
    IMusicBox musicbox = (IMusicBox)ctx.getBean("musicBox");
    musicbox.play();
}


2、工厂实例的方法取得Bean实例
工厂类:
Java代码 复制代码  收藏代码
  1. public class MusicBoxFactory {   
  2.     public IMusicBox createMusicBox(){//没有static修饰   
  3.     return new IMusicBox(){   
  4.               public void play(){   
  5.         System.out.println("Play piano...");   
  6.          }   
  7.     };   
  8.     }   
  9. }  
public class MusicBoxFactory {
    public IMusicBox createMusicBox(){//没有static修饰
	return new IMusicBox(){
              public void play(){
		System.out.println("Play piano...");
	     }
	};
    }
}


配置文件:
Xml代码 复制代码  收藏代码
  1. <bean id="factoryBean"  class="test.spring.MusicBoxFactory" />  
  2. <bean id="musicBox" factory-bean="factoryBean" factory-method="createMusicBox" />  

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

测试类:
Java代码 复制代码  收藏代码
  1. public static void main(String[] args) {   
  2.     ApplicationContext  ctx =    
  3.     new ClassPathXmlApplicationContext("bean-config.xml");   
  4.     IMusicBox musicbox = (IMusicBox)ctx.getBean("musicBox");   
  5.     musicbox.play();   
  6. }  
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接口
工厂类:
Java代码 复制代码  收藏代码
  1. import org.springframework.beans.factory.FactoryBean;   
  2.   
  3. public class MusicBoxFactory2 implements FactoryBean {   
  4.     public Object getObject() throws Exception {   
  5.     return new IMusicBox(){   
  6.         public void play(){   
  7.              System.out.println("Play piano...");   
  8.               }   
  9.     };   
  10.     }   
  11.   
  12.     public Class getObjectType() {   
  13.     return IMusicBox.class;   
  14.     }   
  15.   
  16.     public boolean isSingleton() {   
  17.     return false;   
  18.     }   
  19. }  
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;
    }
}


配置文件:
Xml代码 复制代码  收藏代码
  1. <bean id="musicBox" class="test.spring.MusicBoxFactory2"/>  


测试类:
Java代码 复制代码  收藏代码
  1. public static void main(String[] args) {   
  2.     ApplicationContext  ctx =    
  3.     new ClassPathXmlApplicationContext("bean-config.xml");   
  4.     //不加 & 返回工厂的“产品”   
  5.     IMusicBox musicbox = (IMusicBox)ctx.getBean("musicBox");   
  6.     musicbox.play();   
  7.     //加 & 返回工厂类实例   
  8.     Object obj = ctx.getBean("&musicBox");     
  9.     System.out.println(obj.getClass().getName());    
  10.   
  11. }  
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实例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值