6、spring注解学习(组件注册)——使用spring提供的FactoryBean(工厂bean)注入组件

1、创建一个Color类

 

 

 2、再创建自定义工厂类(实现FactoryBean接口)

复制代码
//创建一个spring定义的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {
    
    //返回一个Color对象,这个对象会添加到容器中
    @Override
    public Color getObject() throws Exception {
        return new Color();
    }

    @Override
    public Class<?> getObjectType() {
        return Color.class;        //返回对象的类型
    }
    
    //设置这个返回的bean是单例还是多例,true:单例;false:多例
    @Override
    public boolean isSingleton() {
        return true;
    }

}
复制代码

3、在spring配置类中注入自定义的工厂类

复制代码
@Configuration        //告诉Spring这是配置类
public class MainConfig {
    
    /*
     * 这里注入的是colorFactoryBean
     * 在容器中通过id为colorFactoryBean获得bean时为该工厂的getObject返回的对象
     * 如果想获得这个工厂bean,则需要在查询时的id前面加一个&,即&colorFactoryBean
     */
    @Bean("colorFactoryBean")
    public ColorFactoryBean colorFactoryBean() {
        return new ColorFactoryBean();
    }
}
复制代码

4、进行测试

复制代码
    /**
     * 测试通过FactoryBean方式注入组件
     */
    @Test
    public void test03() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        Object bean = applicationContext.getBean("colorFactoryBean");
        System.out.println("bean的类型:"+bean.getClass());
    }
复制代码

输出结果:

因为查询id为 colorFactoryBean所以默认是获取colorFactoryBean的getObject返回的对象,所以返回对象类型是com.atguigu.bean.Color

若就是想获得这个colorFactoryBean工厂bean,则在查询id前加一个&

即测试方法改为:

复制代码
    /**
     * 测试通过FactoryBean方式注入组件
     */
    @Test
    public void test03() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        Object bean = applicationContext.getBean("&colorFactoryBean");
        System.out.println("bean的类型:"+bean.getClass());
    }
复制代码

输出结果为:

 

 

 加&后获得的是com.atguigu.bean.ColorFactoryBean

 

再修改测试方法

复制代码
    /**
     * 测试通过FactoryBean方式注入组件
     */
    @Test
    public void test03() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        Object bean1 = applicationContext.getBean("colorFactoryBean");
        Object bean2 = applicationContext.getBean("colorFactoryBean");
        System.out.println(bean1 == bean2);
    }
复制代码

输出

 

 

 因为在colorFactoryBean里面的isSingleton方法返回的是true,所以获得的对象是单例的

posted @   Arbitrary233  阅读(621)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示