前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring源码从入门到精通---FactoryBean接口(六)

Spring源码从入门到精通---FactoryBean接口(六)

作者头像
用户9919783
发布2022-07-26 11:38:27
1640
发布2022-07-26 11:38:27
举报
文章被收录于专栏:后端从入门到精通

上篇文章介绍了如何吧bean注入容器:

1、@ComponentScan+注解(@Controller,@Service,@Repository,@Component)

2、@Bean+@Configuration(适用于第三方导入组件的注入)

3、@Import,import分为直接导入,也可以实现importSelector接口返回类全名注册组件,也可以实现ImportBeanDefinitionRegister接口自定义id名称,手动注册bean。

Spring源码从入门到精通---@Import(五)

这篇文章主要介绍第四种注册bean到ioc容器的方法:

4、spring提供的FactoryBean。

老规矩,先贴上项目目录。。

一、FactoryBean接口

自定义类实现FactoryBean,代码入下。

1)默认返回的重写方法getObject返回的类型

2)根据BeanFactory源码可以看到,里面有个&,当在getBean的时候,在容器里的id前面加个&就会获取到工厂本身的类型。

代码语言:javascript
复制
public class ColorFactoryBean implements FactoryBean<Color> {
    public Color getObject() throws Exception {
        System.out.println("get Object ...");
        return new Color();
    }
 
    public Class<?> getObjectType() {
        return Color.class;
    }
 
    /**
     *
     * @return true 单例
     *          false 多例
     */
    public boolean isSingleton() {
        return false;
    }
}
代码语言:javascript
复制
@Configuration
public class BeanConfig2 {
 
    @Bean
    public ColorFactoryBean getColorFactoryBean(){
        return new ColorFactoryBean();
    }
}
代码语言:javascript
复制
 AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(
        BeanConfig2.class);
 
    /**
     * @Import
     */
    @org.junit.Test
    public void testImport() {
        getDefinitionNames(annotationConfigApplicationContext);
 
        //放入容器后,从容器中获取
        Blue blue = annotationConfigApplicationContext.getBean(Blue.class);
        System.out.println("获取成功的组件:" + blue);
 
        System.out.println("获取容器中getColorFactoryBean:");
        Object colorFactoryBeanObject = annotationConfigApplicationContext.getBean("getColorFactoryBean");
        Object colorFactoryBeanObject2 = annotationConfigApplicationContext.getBean("getColorFactoryBean");
        System.out.println("getObject方法获取的类型:" + colorFactoryBeanObject.getClass());
        System.out.println("Bean:" + colorFactoryBeanObject);
        System.out.println("多实例情况下:" + (colorFactoryBeanObject2 == colorFactoryBeanObject));
        Object factoryBeanObject = annotationConfigApplicationContext.getBean("&getColorFactoryBean");
        System.out.println("获取工厂本身的类型:" + factoryBeanObject.getClass());
    }

打印结果如下,从结果可以知道,当指定多实例的时候,两个对象比较会返回false,并且每次获取对象的时候都会创建一个对象,默认的情况下,获取的是getObject()返回的类。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端从入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、FactoryBean接口
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档