FactoryBean接口。
public interface FactoryBean<T> {
//通过该方法,返回值即为需要注册的bean
T getObject() throws Exception;
//得到返回值的类型
Class<?> getObjectType();
//实例在IOC容器中是否是单例
boolean isSingleton();
}
1 创建工厂实现FactoryBean接口。
public class AnimalFactoryBean implements FactoryBean<Animal> {
//返回一个Animal对象添加到IOC容器中
@Override
public Animal getObject() throws Exception {
System.out.println("创建Animal bean");
return new Animal();
}
@Override
public Class<?> getObjectType() {
return Animal.class;
}
/**
* false: 不是单例,每次调用getObject()方法都会创建新的实例
* true:单例
*/
@Override
public boolean isSingleton() {
return false;
}
}
2 配置类中注册
@Configuration
public class ConfigTest1 {
@Bean
public AnimalFactoryBean animalFactoryBean() {
return new AnimalFactoryBean();
}
}
3 容器中获取
PS:工厂bean的方法其实也是借助于@Bean注解将自己实现的工厂bean(AnimalFactoryBean )注入到IOC容器的
但是和其他普通bean不同,普通的bean使用@Bean时,就是将方法返回的值类型注入到容器中,比如返回值
是Cat.class,那么容器中就是Cat类型。
但是,FactoryBean模式,注入到容器的bean并不是返回AnimalFactoryBean ,而是AnimalFactoryBean 内部的getObject()
方法返回的类型。也就是 Animal.class类型。
如果就是想要得到AnimalFactoryBean类型,那么在获取的时候在加上&符号。
即 &animalFactoryBean
public class TestMain {
@SuppressWarnings("resource")
public static void main(String[] args) {
ApplicationContext app = new AnnotationConfigApplicationContext(ConfigTest1.class);
//工厂bean的得到得的是getObject()方法得到的对象。
Object bean = app.getBean("animalFactoryBean");
Object bean2 = app.getBean("animalFactoryBean");
System.out.println("animalFactoryBean的类型" + bean.getClass());
System.out.println(bean == bean2);
}
}