Spring 与组件注入相关之 FactoryBean

前言:

前面已经介绍了十好几个与 spring 组件注入相关的注解,这里介绍最后一种组件注入方式(并不是通过注解,而是通过一个工厂 Bean ~ FactoryBean)。

简介:

关于 FactoryBean,可以自行查看源码相关注释。虽然是英文的,但是大致能看懂(本人水平有限,就不进行翻译了,而且有些翻译出来也觉得怪怪的 …)。此外,这里还引出了一个设计模式:工厂设计模式(这些人太厉害了~~),后面还会针对 spring 中出现的各种设计模式作一总结。
Spring 与组件注入相关之 FactoryBean

实验:

通过上面的介绍了解到,借助 Factorybean 实现组件的注入,其实就是自定义一个实现了这个接口的 XxxFactoryBean,然后将其注入到 spring 容器中即可。

  1. 自定义 Drinks 实体类(可以为空);
  2. 自定义一个 DrinksFactoryBean,实现 FactoryBean 接口(传入 Drinks 代替泛型),重写其中的方法。接口中的三个方法也很容易理解:
public class DrinksFactoryBean implements FactoryBean<Drinks>{

	// getObject() 的返回值将被注入到容器中
	@Override
	public Drinks getObject() throws Exception {
		return new Drinks();
	}

	@Override
	public Class<Drinks> getObjectType() {
		return Drinks.class;
	}

	// 返回 true,代表单例;false,代表多例
	@Override
	public boolean isSingleton() {
		return true;
	}
	
}
  1. 在配置类中,用 @Bean 注解注入上面定义的 DrinksFactoryBean:
	@Bean
	public DrinksFactoryBean drinksFactoryBean (){
		return new DrinksFactoryBean();
	}

表面上看起来注入的是工厂Bean,但实际上确实 Drinks 类型的!

  1. 单元测试:尝试获取下刚刚注入的bean的id及其类型
id: drinksFactoryBean, Type: [email protected]
  1. 那如果就是想获取 DrinksFactoryBean 的实例呢?只需要在 getBean() 方法的 beanName 前面加一个 &,即 &drinksFactoryBean
		// 获取 DrinksFactoryBean 对象
		Object bean3 = context.getBean("&drinksFactoryBean");
		System.out.println(bean3.getClass()); // class com.uestc.auto.xiaoxie.factory.DrinksFactoryBean