我们知道注册bean到IOC中有很多中方式,比如xml
方式 ,JavaConfig
方式 包括:(@Compent,@Service,@Controller,@Repository,@Bean
)等等。
但是除了以上几种,有没有其他方式把我们的对象交给IOC让他去管理呢?
答案肯定是有啦!!! 那就是@Import();
@Import支持三种类型的导入。
- 普通类
- 配置类(如 Configuration修饰的类)
- 实现了 ImportSelector
(可以选择性导入到IOC
)` 接口- 实现了 ImportBeanDefinitionRegistrar 接口
(可以添加bean定义信息到spring中(使用RootBeanDefinition的registerBeanDefinition方法),从而被spring创建bean并管理)
下边我们分别举例并测试一下~
我们来试一把 (注意 ImportJavaConfigList中的@Configuration被我注掉了)
哎嗨报错了。加上@Configuration我们再看看
ok没问题,普通的类EmailService可以注册到spring容器中了。
如图,可以看到RedisTemplateExample
被 spring
管理,有人说我不@Import
也行呀,spring
也会扫描到RedisConfigurationExample
配置类从而创建bean
呀,这里我想说的是,其实我觉得@Import
中的参数即xxx.class
更多是在非springboot启动类
项目中的配置类,举个例子: 假如我有个admin
服务(是个springboot
项目),然后admin
需要依赖common
的pom
文件,common是非springboot应用
,这个时候,其实你可以指定扫描路径扫描到common
中的xxx.class
配置类(比如@scan("com.xzll.*")
),也可以使用这种@Import
的方式导入该xxx.class
。
这里模拟一个场景就是(根据注解值的不同,来使用不同的bean来进行报警消息发送)
3.1 定义一个注解 EnableAlarmNotice
1 | java复制代码/** |
3.2 自定义个选择器 (根据上边注解的types获取不同的bean)
实现 ImportSelector
1 | java复制代码/** |
3.3 搞个枚举 来定义报警的方式以及bean的全类名
1 | java复制代码@Getter |
3.4 在启动类开启注解并设置ding_ding和email
两个值
1 | java复制代码@SpringBootTest(classes = StudyTestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.NONE) |
3.5 执行单元测试看下结果
但是我发现 用@Service注册的bean和实现ImportSelector注册的bean的id不一样,这个在实际中要注意下
如下所示:
ok关于 ImportSelector就说到这
4.1 我们实现ImportBeanDefinitionRegistrar接口,并重写其方法,然后再该方法中,可以对bean信息进行修改或者增加。
如下所示:
ok关于@Import注解今天就说这些了,有时间整理一篇其源码文章。相信会对这个注解有更深刻的理解。大后天中秋节,祝大家中秋快乐!!!
本文转载自: 掘金