spring注解之@Import注解的三种使用方式

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到多个。

语法如下:

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-javascript">@<span style="color:#a31515">Import</span>({ 类名.class , 类名.class... })
public <span style="color:#0000ff">class</span> <span style="color:#a31515">TestDemo</span> {

}
</code></span></span>

对应的import的bean都将加入到spring容器中,这些在容器中bean名称是该类的全类名 ,比如com.yc.类名

2.2、第二种用法:ImportSelector方式【重点】

这种方式的前提就是一个类要实现ImportSelector接口,假如我要用这种方法,目标对象是Myclass这个类,分析具体如下:

创建Myclass类并实现ImportSelector接口

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-javascript">public <span style="color:#0000ff">class</span> <span style="color:#a31515">Myclass</span> implements <span style="color:#a31515">ImportSelector</span> {
<span style="color:#008000">//既然是接口肯定要实现这个接口的方法</span>
    @<span style="color:#a31515">Override</span>
    public <span style="color:#a31515">String</span>[] <span style="color:#a31515">selectImports</span>(AnnotationMetadata annotationMetadata) {
        <span style="color:#0000ff">return</span> <span style="color:#0000ff">new</span> <span style="color:#a31515">String</span>[<span style="color:#880000">0</span>];
    }
}
</code></span></span>

分析实现接口的selectImports方法中的:

  • 1、返回值: 就是我们实际上要导入到容器中的组件全类名【重点 
  • 2、参数: AnnotationMetadata表示当前被@Import注解给标注的所有注解信息【不是重点】

需要注意的是selectImports方法可以返回空数组但是不能返回null,否则会报空指针异常!

以上分析完毕之后,具体用法步骤如下:

第一步:创建Myclass类并实现ImportSelector接口,这里用于演示就添加一个全类名给其返回值

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-javascript">public <span style="color:#0000ff">class</span> <span style="color:#a31515">Myclass</span> implements <span style="color:#a31515">ImportSelector</span> {
    @<span style="color:#a31515">Override</span>
    public <span style="color:#a31515">String</span>[] <span style="color:#a31515">selectImports</span>(AnnotationMetadata annotationMetadata) {
        <span style="color:#0000ff">return</span> <span style="color:#0000ff">new</span> <span style="color:#a31515">String</span>[]{<span style="color:#a31515">"com.yc.Test.TestDemo3"</span>};
    }
}
</code></span></span>

第二步:编写TestDemo 类,并标注上使用ImportSelector方式的Myclass类

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-javascript">@<span style="color:#a31515">Import</span>({<span style="color:#a31515">TestDemo2</span>.class,<span style="color:#a31515">Myclass</span>.class})
public <span style="color:#0000ff">class</span> <span style="color:#a31515">TestDemo</span> {
        @<span style="color:#a31515">Bean</span>
        public <span style="color:#a31515">AccountDao2</span> <span style="color:#a31515">accountDao2</span>(){
            <span style="color:#0000ff">return</span> <span style="color:#0000ff">new</span> <span style="color:#a31515">AccountDao2</span>();
        }

}
</code></span></span>

可以看出,宜春故意挑了个龙套角色@Bean注解,若对@Bean注解不是很清晰的童鞋可以参考大白话讲解Spring的@bean注解

第三步:编写打印容器中的组件测试类

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-javascript"><span style="color:#008000">/**
 * 打印容器中的组件测试
 */</span>
public <span style="color:#0000ff">class</span> <span style="color:#a31515">AnnotationTestDemo</span> {
    public <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> <span style="color:#a31515">main</span>(<span style="color:#0000ff">String</span>[] args) {
        <span style="color:#a31515">AnnotationConfigApplicationContext</span> applicationContext=<span style="color:#0000ff">new</span> <span style="color:#a31515">AnnotationConfigApplicationContext</span>(<span style="color:#a31515">TestDemo</span>.class);  <span style="color:#008000">//这里的参数代表要做操作的类</span>

        <span style="color:#a31515">String</span>[] beanDefinitionNames = applicationContext.<span style="color:#a31515">getBeanDefinitionNames</span>();
        <span style="color:#0000ff">for</span> (<span style="color:#a31515">String</span> name : beanDefinitionNames){
            <span style="color:#a31515">System</span>.out.<span style="color:#a31515">println</span>(name);
        }

    }
}
</code></span></span>

第四步:运行结果
在这里插入图片描述

2.3、第三种用法:ImportBeanDefinitionRegistrar方式

同样是一个接口,类似于第二种ImportSelector用法,相似度80%,只不过这种用法比较自定义化注册,具体如下:

第一步:创建Myclass2类并实现ImportBeanDefinitionRegistrar接口

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-javascript">public <span style="color:#0000ff">class</span> <span style="color:#a31515">Myclass2</span> implements <span style="color:#a31515">ImportBeanDefinitionRegistrar</span> {
<span style="color:#008000">//该实现方法默认为空</span>
    @<span style="color:#a31515">Override</span>
    public <span style="color:#0000ff">void</span> <span style="color:#a31515">registerBeanDefinitions</span>(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
      
    }
}
</code></span></span>

参数分析:

  • 第一个参数:annotationMetadata 和之前的ImportSelector参数一样都是表示当前被@Import注解给标注的所有注解信息
  • 第二个参数表示用于注册定义一个bean

第二步:编写代码,自定义注册bean

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-javascript">public <span style="color:#0000ff">class</span> <span style="color:#a31515">Myclass2</span> implements <span style="color:#a31515">ImportBeanDefinitionRegistrar</span> {
    @<span style="color:#a31515">Override</span>
    public <span style="color:#0000ff">void</span> <span style="color:#a31515">registerBeanDefinitions</span>(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
        <span style="color:#008000">//指定bean定义信息(包括bean的类型、作用域...)</span>
        <span style="color:#a31515">RootBeanDefinition</span> rootBeanDefinition = <span style="color:#0000ff">new</span> <span style="color:#a31515">RootBeanDefinition</span>(<span style="color:#a31515">TestDemo4</span>.class);
        <span style="color:#008000">//注册一个bean指定bean名字(id)</span>
        beanDefinitionRegistry.<span style="color:#a31515">registerBeanDefinition</span>(<span style="color:#a31515">"TestDemo4444"</span>,rootBeanDefinition);
    }
}
</code></span></span>

第三步:编写TestDemo 类,并标注上使用ImportBeanDefinitionRegistrar方式的Myclass2类

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-javascript">@<span style="color:#a31515">Import</span>({<span style="color:#a31515">TestDemo2</span>.class,<span style="color:#a31515">Myclass</span>.class,<span style="color:#a31515">Myclass2</span>.class})
public <span style="color:#0000ff">class</span> <span style="color:#a31515">TestDemo</span> {

        @<span style="color:#a31515">Bean</span>
        public <span style="color:#a31515">AccountDao2</span> <span style="color:#a31515">accountDao222</span>(){
            <span style="color:#0000ff">return</span> <span style="color:#0000ff">new</span> <span style="color:#a31515">AccountDao2</span>();
        }

}
</code></span></span>

第四步:运行结果
在这里插入图片描述

3、@Import注解的三种使用方式总结

第一种用法:@Import({ 要导入的容器中的组件 } ):容器会自动注册这个组件,id默认是全类名

 

第二种用法:ImportSelector:返回需要导入的组件的全类名数组,springboot底层用的特别多【重点 

 

第三种用法:ImportBeanDefinitionRegistrar:手动注册bean到容器

以上三种用法方式皆可混合在一个@Import中使用,特别注意第一种和第二种都是以全类名的方式注册,而第三中可自定义方式。

@Import注解本身在springboot中用的很多,特别是其中的第二种用法ImportSelector方式在springboot中使用的特别多,尤其要掌握!

如果本文对你有一点点帮助,那么请点个赞呗,谢谢~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值