1、使用静态工厂方法创建Bean
首先,静态工厂:
public class MusicBoxFactory {
// 工厂方法
public static IMusicBox createMusicBox(){
return new IMusicBox(){
public void play(){
System.out.println("播放钢琴音乐...");
}
};
}
}
该静态方法创建一个IMusicBox接口的实例
则,在xml配置文件中,做如下配置:
<bean id="musicBox" class="onlyfun.caterpillar.MusicBoxFactory" factory-method="createMusicBox"/>
这里定义的musicBox指的是由静态方法创建出来的IMusicBox实例
2、使用实例工厂方法创建Bean
实例工厂代码如下:
public class SomeFactory {
public IMusicBox createInstance(){
return new IMusicBox(){
public void play(){
System.out.println("播放piano音乐...");
}
};
}
}
实例工厂没有静态工厂方法,所以首先要创建出实例工厂本身的对象,再调用对象的createInstance()工厂方法创建目标对象,所以XML配置为:
<bean id="factoryBean" class="onlyfun.caterpillar.SomeFactory"/> <bean id="some" factory-bean="factoryBean" factory-method="createInstance"/>
第一句,先定义了实例工厂,然后通过对ID为some的bean的获取,先创建实例工厂对象,再调用工厂对象的工厂方法创建目标对象,此时无需指定bean的class属性。
测试代码:
public class SpringDemo {
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans-config.xml");
IMusicBox musicBox = (IMusicBox)context.getBean("musicBox");
musicBox.play();
IMusicBox musicBox2 = (IMusicBox)context.getBean("some");
musicBox2.play();
}
}
打印出结果:
播放钢琴音乐... 播放piano音乐...