随笔 - 1162  文章 - 0  评论 - 16  阅读 - 59万 

一、使用 FactoryBean 注册组件

使用 Spring 提供的 FactoryBean(工厂 Bean)注册组件。

Spring 中提供了 FactoryBean 这个接口,用于定义工厂 Bean。

自定义一个 Spring 的 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;
    }

    //控制是否为单例
    //true 这个bean是单实例,在容器中保存一份
    //false 这个bean是多实例,每次获取都创建一个新的
    @Override
    public boolean isSingleton() {
        return true;
    }

}

在配置类中注册工厂 Bean:

@Configuration
public class MainConfig5 {

    @Bean
    public ColorFactoryBean colorFactoryBean() {
        return new ColorFactoryBean();
    }

}

测试:

    @Test
    public void test05() {
        ApplicationContext ioc = new AnnotationConfigApplicationContext(MainConfig5.class);

        System.out.println("IOC容器创建完成");

        //工厂Bean获取的是调用getObject() 方法创建的对象
        //获取的是工厂中生产的 bean 对象
        Object bean = ioc.getBean("colorFactoryBean");
        Object bean2 = ioc.getBean("colorFactoryBean");
        System.out.println(bean == bean2);


        System.out.println("bean的类型是" +  bean.getClass());

        //在id前面加 & 前缀获取工厂
        //获取的是 工厂 本身
        Object bean3 =  ioc.getBean("&colorFactoryBean");
        System.out.println(bean3.getClass());

    }

注意:FactoryBean 中创建的是工厂中生产的 bean

(1)默认获取的是工厂 bean,调用 getObject() 创建的对象;

(2)如果要获取工厂 bean 本身,需要在 id 前面加上一个 & ,如:&colorFactoryBean

二、给容器中注册组件方式

1)通过包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)【适用于添加自己写的类】

2)@Bean 导入第三方包里面的组件

3)@Import:快速给容器中导入一个组件

【1】@Import(要导入到容器中组件),容器会自动注册这个组件,id 默认是全类名;

【2】ImportSelector:返回需要导入的 组件的全类名数组;

【3】ImportBeanDefinitionRegistrar:手动注册 bean 到容器中

4)使用 Spring 提供的 FactoryBean(工厂 Bean):创建的工厂中生产的 bean

【1】默认获取的是工厂 bean 调用 getObject 创建的对象

【2】要获取工厂 bean 本身,需要给 id 前面加一个 &,如:&colorFactoryBean

posted on   格物致知_Tony  阅读(72)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示

目录导航