FactoryBean
使用Spring提供的FactoryBean接口注册组件:
- 默认获取到的是工厂bean调用getObject()创建的对象
- 要获取工厂本身,需要在id前面加上一个“&”
package org.springframework.beans.factory;
public interface FactoryBean<T> {
//容器调用该方法,将返回的对象T注册到容器中
T getObject() throws Exception;
//返回对象类型
Class<?> getObjectType();
//是否单例
boolean isSingleton();
}
示例:
定义一个Color
package pers.zhang.bean;
public class Color {
}
定义一个FactoryBean
package pers.zhang.bean;
import org.springframework.beans.factory.FactoryBean;
/**
* @author zhang
* @date 2019/12/1 - 16:30
*/
//创建一个Spring提供的FactoryBean
public class ColorFactory implements FactoryBean<Color> {
//返回一个Color对象,这个对象会注册到容器中
@Override
public Color getObject() throws Exception {
System.out.println("ColorFactoryBean...getObject");
return new Color();
}
@Override
public Class<?> getObjectType() {
return Color.class;
}
//返回true:单实例,在容器中保存一份
//返回false:每次获取都创建一个新的
@Override
public boolean isSingleton() {
return false;
}
}
在主配置类中注册:
@Bean
public ColorFactory colorFactory(){
return new ColorFactory();
}
测试:
public void printBeans(){
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class);
String[] definitionNames = ac.getBeanDefinitionNames();
for(String name : definitionNames){
System.out.println(name);
}
//获取工厂生产的Color,如果要获取工厂本身则使用&colorFactory
Object colorFactory = ac.getBean("colorFactory");
Object colorFactory1 = ac.getBean("colorFactory");
//打印类型
System.out.println(colorFactory.getClass());
//打印是否相同
System.out.println(colorFactory == colorFactory1);
}