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);
}
}