一般情况下,应用程序有自己的工程对象来创建bean,如果将自己的工厂对象交给Spring管理,这就是一个工厂Bean
在Spring中配置工厂bean,有3种不同的配置。
1、静态工厂
创建具体Bean实例的是静态方法。
spring配置文件:
<!-- createNum方法必须是static的,才能找到 -->
<bean id="factoryBeans" class="com.learn.spring.FactoryBeans"
factory-method="createNum" />
java类:
package com.learn.spring;
public class FactoryBeans {
public static int createNum() {
return 1;
}
}
测试类:
package com.learn.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println(context.getBean("factoryBeans"));
}
}
调用getBean()时,获取的是createNum()方法返回的对象,即1。如果没有指定factory-method,返回FactoryBeans实例,即返回工厂Bean
2、实例工厂
创建具体Bean实例的是实例(工厂Bean的实例),不是静态方法
spring配置文件:
<!-- 工厂Bean -->
<bean id="factory" class="com.learn.spring.FactoryBeans" />
<!-- createNum方法不是static的 -->
<bean id="factoryBeans"
factory-bean="factory"
factory-method="createNum" />
java类:
package com.learn.spring;
public class FactoryBeans {
public int createNum() {
return 1;
}
}
测试类:
package com.learn.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println(context.getBean("factoryBeans"));
}
}
调用getBean()时,先生成FactoryBeans实例,再调用createNum()方法,获取返回对象。即1
3、实现FactoryBean接口
spring配置文件:
<!-- 工厂Bean -->
<bean id="factoryBeans" class="com.learn.spring.FactoryBeans" />
java类:
package com.learn.spring;
import org.springframework.beans.factory.FactoryBean;
public class FactoryBeans implements FactoryBean<Object> {
@Override
public Object getObject() throws Exception {
return new Integer(1);
}
@Override
public Class<Integer> getObjectType() {
return Integer.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
测试类:
package com.learn.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//返回FactoryBeans的工厂方法getObject返回的Integer对象实例
System.out.println(context.getBean("factory").toString());
//加"&"返回工厂Bean的实例,即FactoryBeans实例
System.out.println(context.getBean("&factory").toString());
}
}
实现了FactoryBean接口的Bean,不再视为普通的Bean,Spring会自动检测。