一、FactoryBean简介
Spring中有两种类型的Bean,一种是普通的Bean,另一种是工厂Bean,即FactoryBean,两种bean都被Spring容器管理,但工厂bean跟普通的bean不同,其返回的对象不是指定类的一个实例,而是实现了FactoryBean的类的getObject()方法所返回的对象。
二、什么时候使用 FactoryBean
既然Spring提供了使用注解和Xml配置的方式来创建bean,那为什么还提供这种方式呢?这就是Spring框架的强大之处,即想你之未所想。如果一个bean的创建过程涉及很多其他的bean和复杂的逻辑,用xml配置比较困难,可以考虑使用FactoryBean。 在Spring框架内部,有很多地方有FactoryBean的实现类,它们在很多应用如(Spring的AOP、ORM、事务管理)及与其它第三框架(ehCache)集成时都有体现。
三、 FactoryBean使用
1、定义Student类,属性包括name,sex,age 。
public class Student {
private String name ;
private String sex ;
private int age = 10 ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2、定义StudentFactoryBean实现FactoryBean接口
@Component
public class StudentFacotryBean implements FactoryBean{
@Override
public Student getObject() throws Exception {
Student student = new Student();
student.setName("nihaiopp");
return student;
}
@Override
public Class getObjectType() {
return Student.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
实现FactoryBean接口需要重写三个方法:
getObject():需要返回的交给Spring管理的实例对象;
getObjectType():要返回对象的class对象;
isSingleton():是否是单例。
3、测试结果
@Test
public void testGetClass() {
try{
ApplicationContext applicationContext = SpringContextUtil.getApplicationContext();
Student student = (Student)applicationContext.getBean("studentFacotryBean");
System.out.println(student.getName());
}catch(Exception e){
e.printStackTrace();
}
结果返回:nihaiopp