一、@Import 注解
给容器中注册方式:
1) 通过包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)【适用于添加自己写的类】
2)@Bean 导入第三方包里面的组件
3)@Import:快速给容器中导入一个组件
【1】@Import(要导入到容器中组件),容器会自动注册这个组件,id 默认是全类名;
【2】ImportSelector:返回需要导入的 组件的全类名数组;
【3】ImportBeanDefinitionRegistrar:手动注册 bean 到容器中
二、注册组件
给容器中注册组件有以下几种方式:
(1)通过包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)【适用于添加自己写的类】
(2)@Bean (适用于导入第三方包里面的组件)
(3)@Import:快速给容器中导入一个组件
三、@Import 注解快速导入
在配置类上面使用 @Import 注解可以快速给容器中导入组件:
@Import(value = {Color.class, Red.class}) //快速导入多个组件
@Configuration
public class MainConfig4 {
@Bean(name = "person")
public Person person01() {
return new Person("李四", 20);
}
}
注意:
(1)配置类只能有一个 @Import 注解,不能出现多个;
(2)导入的组件的 id 默认是组件的全类名
四、@ImportSelector
ImportSelect 是一个接口,里面提供了一个方法 selectImports,用于返回要导入的组件的全类名数组。
自定义一个 MyImportSelect 类,实现 ImportSelect 接口
//自定义逻辑返回需要导入的组件
public class MyImportSelector implements ImportSelector {
/**
* 返回值,就是要导入到容器中组件全类名
* AnnotationMetadata:当前标注 @Import 注解的类的所有注解信息
* @param importingClassMetadata
* @return
*/
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//方法不要返回 null 值,可以返回空数组
return new String[]{"com.njf.bean.Yellow", "com.njf.bean.Blue"};
}
}
在配置类上进行应用:
@Import(value = {Color.class, Red.class, MyImportSelector.class})
@Configuration
public class MainConfig4 {
@Bean(name = "person")
public Person person01() {
return new Person("李四", 20);
}
}

五、@ImportBeanDefinitionRegistrar
ImportBeanDefinitionRegistrar 是一个接口,它里面有一个 registerBeanDefinition 方法,用于向容器中注册一个组件。

自定义一个 MyImportBeanDefinitionRegistrar 类:
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* AnnotationMetadata:当前类的注解信息
* BeanDefinitionRegistry:Bean定义的注册类
* 把所有需要添加到容器中的 bean,调用registerBeanDefinition方法进行手工注册
* BeanDefinitionRegistry.registerBeanDefinition
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean definition1 = registry.containsBeanDefinition("com.njf.bean.Red");
boolean definition2 = registry.containsBeanDefinition("com.njf.bean.Blue");
if (definition1 && definition2) {
//beanDefinition 指定bean的类型,bean的定义信息,如类型,scope等信息
RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
//注册一个bean,指定bean的名字
registry.registerBeanDefinition("rainBow", beanDefinition);
}
}
}
在配置类上应用:
@Import(value = {Color.class, Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
@Configuration
public class MainConfig4 {
@Bean(name = "person")
public Person person01() {
return new Person("李四", 20);
}
}
测试结果:
分类:
Spring注解驱动
【推荐】编程新体验,更懂你的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迁移实战