在spring框架与其他框架整合中用到FactoryBean很多,下面举个例子简单介绍一下使用FactoryBean注册bean
首先是需要写一个待注册类
public class Color {
}
写一个类实现FactoryBean接口
package chd.condition;
import org.springframework.beans.factory.FactoryBean;
import spring.Color;
public class ColorFactoryBean implements FactoryBean<Color>{
//返回一个对象,添加到容器中
public Color getObject() throws Exception {
// TODO Auto-generated method stub
return new Color();
}
//返回对象的类型
public Class<?> getObjectType() {
// TODO Auto-generated method stub
return Color.class;
}
//是否是单例?
//true:这个bean是单例,在容器中保存一份
//false:每次获取都活创建一个新的bean
public boolean isSingleton() {
// TODO Auto-generated method stub
return true;
}
}
配置类中使用@Bean注解注册一下实现类
public class MainConfig2 {
@Bean
public ColorFactoryBean colorFactoryBean() {
return new ColorFactoryBean();
}
}
测试类测试一下
AnnotationConfigApplicationContext applicationContext =new AnnotationConfigApplicationContext(MainConfig2.class);
@Test
public void Test3() {
String[] names=applicationContext.getBeanDefinitionNames();
for (String na : names) {
System.out.println(na);
}
//查看一下注册bean的类型是spring.Color
Object bean = applicationContext.getBean("colorFactoryBean");
System.out.println("bean类型"+bean.getClass());
}
结果如下(获取bean是Color类)
那么我想拿到工厂bean(实现类ColorFactoryBean)的本身,而不是获取Color的bean,怎么实现呢?
在测试类中写法如下(在实现类名前加上“&”符号)
@Test
public void Test3() {
String[] names=applicationContext.getBeanDefinitionNames();
for (String na : names) {
System.out.println(na);
}
//查看一下注册bean的类型是spring.Color
Object bean = applicationContext.getBean("colorFactoryBean");
System.out.println("bean类型"+bean.getClass());
//获取colorFactoryBean的bean 实现类名前加上“&”符号
Object bean2 = applicationContext.getBean("&colorFactoryBean");
System.out.println("bean类型"+bean2.getClass());
}