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

结果:

image-20200329182808284

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

image-20200329183017262


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,邮件至 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/
目录
×

喜欢就点赞,疼爱就打赏