spring註解---FactoryBean工廠模式註冊bean

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章