Spring注解学习_组件注册5_FactoryBean
“MyBatis能被整合进Spring就是因为实现了FactoryBean接口,用的是SqlSessionFactoryBean”
到目前为止,我们所学习的给IOC容器中注册组件的方法有:
- 包扫描(@ComponentScan(“package_path”))+ 组件标注注解(@Controller, @Service, @Repository, @Component):导入我们自定义的组件
- @Bean:可用于导入第三方包里面的组件
- @Import:快速给容器导入一个组件
- @Import(要导入到容器中的组件.class),容器中就会自动注册这个组件id默认为全类名
- ImportSelector,自定义实现ImportSelector的selectImports方法,返回String[]数组对象,内携带要导入容器的类的全类名
- ImportBeanDefinitionRegistrar:手动注册bean到容器中
- 使用Spring提供的FactoryBean(工厂Bean)
- 默认获取到的是工厂Bean调用getObject() 创建的对象
- 要获取工厂Bean本身,我们getBean(“id”)时需要给id前面加一个"&"
先创建一个ColorFactoryBean,实现FactoryBean接口:
//创建一个Spring定义的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {
/**
* 返回一个color对象,它将被添加到Spring容器中
* @return 一个color对象
* @throws Exception
*/
@Override
public Color getObject() throws Exception {
System.out.println("color factory bean ... getObject()...");
return new Color();
}
@Override
public Class<?> getObjectType() {
return Color.class;
}
/**
* 是否为单实例
* @return true:在容器中只会保存一份;false:每次获取都会创建一个新的
*/
@Override
public boolean isSingleton() {
return true;
}
}
在配置类中注册该BeanFactory:
@Configuration
@Import(...)
public class MainConfig2 {
...
@Bean
public ColorFactoryBean colorFactoryBean(){
return new ColorFactoryBean();
}
}
测试类获取该BeanFactory:
@Test
public void testImport(){
String[] names = context.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
Object colorFactoryBean1 = context.getBean("colorFactoryBean");
Object colorFactoryBean2 = context.getBean("colorFactoryBean");
System.out.println("colorFactoryBean1的类型:"+colorFactoryBean1.getClass());
System.out.println("colorFactoryBean2的类型:"+colorFactoryBean2.getClass());
System.out.println("两次获取到的bean是否相同:"+(colorFactoryBean1==colorFactoryBean2));
Object bean = context.getBean("&colorFactoryBean");
System.out.println("bean类型:"+bean.getClass());
}
结果:

翻开BeanFactory源码,Spring的工厂Bean一般都会在id加上前缀"&",以区别于产品Bean:

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,邮件至 708801794@qq.com
文章标题:Spring注解学习_组件注册5_FactoryBean
文章字数:481
本文作者:梅罢葛
发布时间:2020-03-29, 17:17:41
最后更新:2020-03-29, 18:37:29
原始链接:https://qiurungeng.github.io/2020/03/29/Spring%E6%B3%A8%E8%A7%A3%E5%AD%A6%E4%B9%A0-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-FactoryBean/