spring注解---FactoryBean工厂模式注册bean

FactoryBean接口。

public interface FactoryBean {

    //通过该方法,返回值即为需要注册的bean
	T getObject() throws Exception;

   //得到返回值的类型
	Class getObjectType();

   //实例在IOC容器中是否是单例
	boolean isSingleton();

}

1 创建工厂实现FactoryBean接口。

public class AnimalFactoryBean implements FactoryBean {
	//返回一个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);
	}
}

 

你可能感兴趣的:(spring注解)