Dog类如下:
package com.dora.testingAnimal.bean;
import com.dora.testingAnimal.ibeans.Being;
public class Dog implements Being{
private String msg;
public void setMsg(String msg) {
this.msg=msg;
}
public void testBeing() {
System.out.println(msg+ " 狗爱啃骨头");
}
}
工厂Bean是Spring的一种特殊Bean,一般实现FactoryBean接口,工厂Bean部署在Spring容器中,并通过getBean()获得的Bean不是工厂Bean,而是返回FactoryBean的产品。
package com.dora.testingAnimal.service.factoryBean;
import org.springframework.beans.factory.FactoryBean;
import com.dora.testingAnimal.bean.Dog;
import com.dora.testingAnimal.ibeans.Being;
public class AnimalFactory implements FactoryBean {
private Being being = null;
public Object getObject() throws Exception {
// TODO Auto-generated method stub
if(being == null) {
Dog dog = new Dog();
dog.setMsg("这是一只小狗");
this.being = dog;
}
return being;
}
public Class getObjectType() {
// TODO Auto-generated method stub
return Dog.class;
}
public boolean isSingleton() {
// TODO Auto-generated method stub
return true;
}
}
FactoryBean有三个方法:
Object getObject() 方法:获取FactoryBean的产品;
Class getObjectType() 方法:获取FactoryBean产品的类型;
boolean isSingleton()方法:在本例子中因为getObject返回的是单例,所以isSingleton()方法要返回true;
主程序获得Dog的代码为:
package com.dora.testingAnimal.service;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dora.testingAnimal.ibeans.Being;
public class SpringTest {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Being b1 = ctx.getBean("dog", Being.class);
b1.testBeing();
Being b2 = ctx.getBean("dog", Being.class);
b2.testBeing();
System.out.println(b1 == b2);
System.out.println(ctx.getBean("&dog"));
}
}
执行结果如下:
这是一只小狗 狗爱啃骨头
这是一只小狗 狗爱啃骨头
true
com.dora.testingAnimal.service.factoryBean.AnimalFactory@fec107
因为FactoryBean以单例形式管理Bean,所以两次请求的产品获得的是同一个实例。
在bean的id前加上"&" 可以获得该工厂类