spring注解之@Import注解的三种使用方式 ﹏ヽ暗。殇╰゛Y 2022-12-19 08:44 103阅读 0赞 ## 1、@Import注解须知 ## > 1、**@Import只能用在类上**,@Import通过快速导入的方式实现把实例加入spring的IOC容器中 > > > > 2、加入IOC容器的方式有很多种,@Import注解就相对很牛皮了,**@Import注解可以用于导入第三方包**,当然@Bean注解也可以,但是@Import注解快速导入的方式更加便捷 > > > > 3、@Import注解有三种用法 ## 2、@Import的三种用法 ## @Import的三种用法主要包括: > 1、直接填class数组方式 > 2、ImportSelector方式【重点】 > 3、ImportBeanDefinitionRegistrar方式 2.1、第一种用法:直接填class数组 **直接填对应的class数组,class数组可以有0到多个。** 语法如下: @Import({ 类名.class , 类名.class... }) public class TestDemo { } 对应的import的bean都将加入到spring容器中,这些在容器中bean名称是该类的**全类名**,比如com.yc.类名 2.2、第二种用法:ImportSelector方式【重点】 这种方式的前提就是一个类要实现ImportSelector接口,假如我要用这种方法,目标对象是Myclass这个类,分析具体如下: 创建Myclass类并实现ImportSelector接口 public class Myclass implements ImportSelector { //既然是接口肯定要实现这个接口的方法 @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { return new String[0]; } } 分析实现接口的selectImports方法中的: * 1、返回值: 就是我们实际上要导入到容器中的组件全类名【**重点**】 * 2、参数: AnnotationMetadata表示当前被@Import注解给标注的所有注解信息【不是重点】 > 需要注意的是selectImports方法可以返回空数组但是不能返回null,否则会报空指针异常! 以上分析完毕之后,具体用法步骤如下: 第一步:创建Myclass类并实现ImportSelector接口,这里用于演示就添加一个全类名给其返回值 public class Myclass implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { return new String[]{"com.yc.Test.TestDemo3"}; } } 第二步:编写TestDemo 类,并标注上使用ImportSelector方式的Myclass类 @Import({TestDemo2.class,Myclass.class}) public class TestDemo { @Bean public AccountDao2 accountDao2(){ return new AccountDao2(); } } 可以看出,宜春故意挑了个龙套角色@Bean注解,若对@Bean注解不是很清晰的童鞋可以参考[大白话讲解Spring的@bean注解][Spring_bean] 第三步:编写打印容器中的组件测试类 /** * 打印容器中的组件测试 */ public class AnnotationTestDemo { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(TestDemo.class); //这里的参数代表要做操作的类 String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames(); for (String name : beanDefinitionNames){ System.out.println(name); } } } 第四步:运行结果 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NTQzNTA4_size_16_color_FFFFFF_t_70] 2.3、第三种用法:ImportBeanDefinitionRegistrar方式 同样是一个接口,类似于第二种ImportSelector用法,相似度80%,只不过这种用法比较自定义化注册,具体如下: 第一步:创建Myclass2类并实现ImportBeanDefinitionRegistrar接口 public class Myclass2 implements ImportBeanDefinitionRegistrar { //该实现方法默认为空 @Override public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { } } 参数分析: * 第一个参数:annotationMetadata 和之前的ImportSelector参数一样都是表示当前被@Import注解给标注的所有注解信息 * 第二个参数表示用于注册定义一个bean 第二步:编写代码,自定义注册bean public class Myclass2 implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { //指定bean定义信息(包括bean的类型、作用域...) RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TestDemo4.class); //注册一个bean指定bean名字(id) beanDefinitionRegistry.registerBeanDefinition("TestDemo4444",rootBeanDefinition); } } 第三步:编写TestDemo 类,并标注上使用ImportBeanDefinitionRegistrar方式的Myclass2类 @Import({TestDemo2.class,Myclass.class,Myclass2.class}) public class TestDemo { @Bean public AccountDao2 accountDao222(){ return new AccountDao2(); } } 第四步:运行结果 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NTQzNTA4_size_16_color_FFFFFF_t_70 1] ## 3、@Import注解的三种使用方式总结 ## > 第一种用法:`@Import`(\{ 要导入的容器中的组件 \} ):容器会自动注册这个组件,**id默认是全类名** > > > > 第二种用法:`ImportSelector`:返回需要导入的组件的全类名数组,springboot底层用的特别多【**重点**】 > > > > 第三种用法:`ImportBeanDefinitionRegistrar`:手动注册bean到容器 **以上三种用法方式皆可混合在一个@Import中使用,特别注意第一种和第二种都是以全类名的方式注册,而第三中可自定义方式。** @Import注解本身在springboot中用的很多,特别是其中的第二种用法ImportSelector方式在springboot中使用的特别多,尤其要掌握! [Spring_bean]: https://blog.csdn.net/qq_44543508/article/details/103718958 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NTQzNTA4_size_16_color_FFFFFF_t_70]: /images/20221120/e3c09f43b547484bbe61079b319d01b3.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NTQzNTA4_size_16_color_FFFFFF_t_70 1]: https://img-blog.csdnimg.cn/2019122715572214.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NTQzNTA4,size_16,color_FFFFFF,t_70
还没有评论,来说两句吧...