Spring 与组件注入相关之 FactoryBean
前言:
前面已经介绍了十好几个与 spring 组件注入相关的注解,这里介绍最后一种组件注入方式(并不是通过注解,而是通过一个工厂 Bean ~ FactoryBean)。
简介:
关于 FactoryBean,可以自行查看源码相关注释。虽然是英文的,但是大致能看懂(本人水平有限,就不进行翻译了,而且有些翻译出来也觉得怪怪的 …)。此外,这里还引出了一个设计模式:工厂设计模式(这些人太厉害了~~),后面还会针对 spring 中出现的各种设计模式作一总结。
实验:
通过上面的介绍了解到,借助 Factorybean 实现组件的注入,其实就是自定义一个实现了这个接口的 XxxFactoryBean,然后将其注入到 spring 容器中即可。
- 自定义 Drinks 实体类(可以为空);
- 自定义一个 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;
}
}
- 在配置类中,用 @Bean 注解注入上面定义的 DrinksFactoryBean:
@Bean
public DrinksFactoryBean drinksFactoryBean (){
return new DrinksFactoryBean();
}
表面上看起来注入的是工厂Bean,但实际上确实 Drinks 类型的!
- 单元测试:尝试获取下刚刚注入的bean的id及其类型
id: drinksFactoryBean, Type: [email protected]
- 那如果就是想获取 DrinksFactoryBean 的实例呢?只需要在 getBean() 方法的 beanName 前面加一个 &,即 &drinksFactoryBean
// 获取 DrinksFactoryBean 对象
Object bean3 = context.getBean("&drinksFactoryBean");
System.out.println(bean3.getClass()); // class com.uestc.auto.xiaoxie.factory.DrinksFactoryBean