一、使用 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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战