很多情况下使用<bean id=”bean1” class=”…” />定义一个bean,这种定义方式Spring将会调用默认的无参数构造方法创建Bean实例。除此之外还可以使用工厂方式创建Bean实例,实现Bean创建与使用的分离,将Bean创建工作交由工厂来完成。
配置工厂Bean的三种方式。
抽象接口:
1、静态工厂方法取得Bean实例
工厂类:
配置文件:
测试类:
2、工厂实例的方法取得Bean实例
工厂类:
配置文件:
“factory-bean”属性指定工厂Bean,”factory-method”属性指定工厂方法来取得Bean实例。
测试类:
3、工厂类实现org.springframework.beans.factory.FacotryBean接口
工厂类:
配置文件:
测试类:
实现FactoryBean接口的类不会被视为普通的Bean,Spring会自动检测,调用getObject方法获取Bean实例
配置工厂Bean的三种方式。
抽象接口:
- public interface IMusicBox {
- public void play();
- }
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...");
- }
- };
- }
- }
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" />
<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();
- }
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...");
- }
- };
- }
- }
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" />
<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();
- }
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;
- }
- }
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"/>
<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());
- }
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实例