spring boot之@Import注解的应用

火影  论坛元老 | 2024-12-10 13:41:46 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1742|帖子 1742|积分 5226

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我们知道spring boot会通过@ComponentScan界说包扫描路径进行业务界说的bean的加载,但是对于很多不在此包路径下界说的bean怎么办呢?比如其他jar包中界说的。这时候import就发挥作用了,通过它也可以实现bean的界说。具体是怎么做的呢,我们先看一下Import这个注解的类:

它的value属性方法中明确阐明,可以是Configuration,ImportSelector,ImportBeanDefinitionRegistrar,或者其他常规的组件类。下面我们一一举例:
我们先和大部分jar包一样,界说一个EnableUserConfiguration,然后在META-INF/spring.factories中加入配置,这样EnableUserConfiguration就会在Spring boot启动时加载。此时它是个空的类,后面我们在这个上面展示Import四种应用方式
  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.mall.provider.config.EnableUserConfiguration
复制代码
  1. public class EnableUserConfiguration {
  2. }
复制代码
(1)Configuration
我们在扫描包路径外界说了一个Configuration配置类:
  1. package com.mall.pkgscan1;
  2. import com.mall.pkgscan1.bean.ClassInfo;
  3. import com.mall.pkgscan1.bean.Student;
  4. import com.mall.pkgscan1.bean.UserInfo;
  5. import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. /**
  9. * @since 2024/11/28 15:17
  10. */
  11. @Configuration
  12. public class UserConfiguration {
  13.     @Bean
  14.     public UserInfo userInfo() {
  15.         return new UserInfo();
  16.     }
  17.     @Bean
  18.     @ConditionalOnBean(ClassInfo.class)
  19.     public Student student() {
  20.         class Student1 {
  21.         }
  22.         new Student1();
  23.         return new Student();
  24.     }
  25.     @Bean
  26.     public ClassInfo classInfo() {
  27.         return new ClassInfo();
  28.     }
  29. }
复制代码
然后在EnableUserConfiguration上用@Import导入此配置类
  1. @Import(UserConfiguration.class)public class EnableUserConfiguration {
  2. }
复制代码
这样UserConfiguration中界说的Bean就会被加载了,我们直接在调试状态下可以看到利用上下文是可以获取到UserConfiguration中界说的Bean的

(2)ImportSelector
这种方式我们需要界说一个实现ImportSelector的类,然后赋值给Import注解的Value。为了方便展示,这里直接在EnableUserConfiguration中界说了一个静态内部类,代码如下:
  1. @Import(EnableUserConfiguration.UserSelector.class)
  2. public class EnableUserConfiguration {
  3.     public static class UserSelector implements ImportSelector {
  4.         @Override
  5.         public String[] selectImports(AnnotationMetadata importingClassMetadata) {
  6.             return new String[]{"com.mall.pkgscan1.UserConfiguration"};
  7.         }
  8.     }
  9. }
复制代码
通过selectImports返回的类的全限定名数组,就是我们想要Spring去加载的Bean。
(3)ImportBeanDefinitionRegistrar
此方式需要导入类ImportBeanDefinitionRegistrar接口。然后重写它的registerBeanDefinitions方法逻辑,自行实现bean界说,然后通过注册器进行bean的注册。此种方式可以随意自界说bean的名称
  1. @Import(EnableUserConfiguration.UserRegistrar.class)
  2. public class EnableUserConfiguration {
  3.     public static class UserRegistrar implements ImportBeanDefinitionRegistrar {
  4.         @Override
  5.         public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
  6.             RootBeanDefinition beanDefinition = new RootBeanDefinition(UserConfiguration.class);
  7.             registry.registerBeanDefinition("userConfiguration", beanDefinition);
  8.         }
  9.     }
  10. }
复制代码

(4)导入常规组件类
这种方式最简单,但也最局限。
  1. @Import({UserInfo.class, ClassInfo.class})public class EnableUserConfiguration {
  2. }
复制代码
上面代码把UserInfo和ClassInfo这两个普通类加载为Bean。但由于没有直接导入它两的外围类UserConfiguration这个配置类,所以不能用它的Bean方法获取,而是用对应类获取:下方的两种获取方式,UserInfo可以获取到bean,但ClassInfo不行


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

火影

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表