【Spring注解驱动开发】使用@Import注解给容器中快速导入一个组件-阿里云开发者社区

开发者社区> 优惠活动> 正文

【Spring注解驱动开发】使用@Import注解给容器中快速导入一个组件

简介:
+关注继续查看

【Spring注解驱动开发】使用@Import注解给容器中快速导入一个组件

写在前面
我们可以将一些bean组件交由Spring管理,并且Spring支持单实例bean和多实例bean。我们自己写的类,可以通过包扫描+标注注解(@Controller、@Servcie、@Repository、@Component)的形式将其注册到IOC容器中,如果不是我们自己写的类,比如,我们在项目中引入了一些第三方的类库,此时,我们需要将这些第三方类库中的类注册到Spring容器中,该怎么办呢?此时,我们就可以使用@Bean和@Import注解将这些类快速的导入Spring容器中。接下来,我们来一起探讨下如何使用@Import注解给容器中快速导入一个组件。

项目工程源码已经提交到GitHub:https://github.com/sunshinelyz/spring-annotation

注册bean的方式
向Spring容器中注册bean通常有以下几种方式:

包扫描+标注注解(@Controller、@Servcie、@Repository、@Component),通常用于自己写的类。
@Bean注解,通常用于导入第三方包中的组件。
@Import注解,快速向Spring容器中导入组件。
@Import注解概述
Spring 3.0之前,创建Bean可以通过xml配置文件与扫描特定包下面的类来将类注入到Spring IOC容器内。而在Spring 3.0之后提供了JavaConfig的方式,也就是将IOC容器里Bean的元信息以java代码的方式进行描述。我们可以通过@Configuration与@Bean这两个注解配合使用来将原来配置在xml文件里的bean通过java代码的方式进行描述

@Import注解提供了@Bean注解的功能,同时还有xml配置文件里标签组织多个分散的xml文件的功能,当然在这里是组织多个分散的@Configuration

先看一下@Import注解的源码:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {

/**
  * {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
  * or regular component classes to import.
  */
 Class<?>[] value();

}
从源码里可以看出@Import可以配合 Configuration ,ImportSelector, ImportBeanDefinitionRegistrar 来使用,下面的or表示也可以把Import当成普通的Bean使用。

@Import只允许放到类上面,不能放到方法上。下面我们来看具体的使用方式。

@Import注解的使用方式
@Import注解的三种用法主要包括:

直接填class数组方式
ImportSelector方式【重点】
ImportBeanDefinitionRegistrar方式
注意:我们先来看第一种方法:直接填class数组的方式,其他的两种方式我们后面继续讲。

@Import导入组件的简单示例
没有使用@Import注解的效果
首先,我们创建一个Department类,这个类是一个空类,没有成员变量和方法,如下所示。

package io.mykit.spring.plugins.register.bean;

/**

  • @author binghe
  • @version 1.0.0
  • @description 测试@Import注解的bean
    */

public class Department {
}
接下来,我们先在SpringBeanTest类中创建testAnnotationConfig7()方法,输出Spring容器中所有的bean,来查看是否存在Department类对应的bean实例,以此来判断Spring容器中是否注册有Department类对应的bean实例。

@Test
public void testAnnotationConfig7(){

ApplicationContext context = new AnnotationConfigApplicationContext(PersonConfig2.class);
String[] names = context.getBeanDefinitionNames();
Arrays.stream(names).forEach(System.out::println);

}
运行SpringBeanTest类的testAnnotationConfig7()方法,输出的结果信息如下所示。

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
personConfig2
person
binghe001
可以看到Spring容器中并没有Department类对应的bean实例。

使用@Import注解的效果
我们在PersonConfig2类上添加@Import注解,并将Department类标注到注解中,如下所示。

@Configuration
@Import(Department.class)
public class PersonConfig2 {
此时,我们再次运行SpringBeanTest类的testAnnotationConfig7()方法,输出的结果信息如下所示。

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
personConfig2
io.mykit.spring.plugins.register.bean.Department
person
binghe001
可以看到,输出结果中打印了io.mykit.spring.plugins.register.bean.Department,说明使用@Import导入bean时,id默认是组件的全类名。

@Import注解支持同时导入多个类,例如,我们再次创建一个Employee类,如下所示。

package io.mykit.spring.plugins.register.bean;
/**

  • @author binghe
  • @version 1.0.0
  • @description 测试@Import注解的bean
    */

public class Employee {
}
接下来,我们也将Employee类添加到@Import注解中,如下所示。

@Configuration
@Import({Department.class, Employee.class})
public class PersonConfig2 {
此时,我们再次运行SpringBeanTest类的testAnnotationConfig7()方法,输出的结果信息如下所示。

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
personConfig2
io.mykit.spring.plugins.register.bean.Department
io.mykit.spring.plugins.register.bean.Employee
person
binghe001
可以看到,结果信息中同时输出了io.mykit.spring.plugins.register.bean.Department和io.mykit.spring.plugins.register.bean.Employee,说明Department类的bean实例和Employee类的bean实例都导入到Spring容器中了。

好了,咱们今天就聊到这儿吧!别忘了给个在看和转发,让更多的人看到,一起学习一起进步!!

项目工程源码已经提交到GitHub:https://github.com/sunshinelyz/spring-annotation

原文地址https://www.cnblogs.com/binghe001/p/13089993.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用IntelliJ IDEA开发SpringMVC网站(一)开发环境
原文:使用IntelliJ IDEA开发SpringMVC网站(一)开发环境 摘要 主要讲解初期的开发环境搭建,Maven的简单教学。 IDEA Spring MVC 目录[-] 文章已针对IDEA 15做了一定的更新,部分更新较为重要,请重新阅读文章并下载最新源码。
1629 0
使用 Date 和 SimpleDateFormat 类表示时间
使用 Date 和 SimpleDateFormat 类表示时间 在程序开发中,经常需要处理日期和时间的相关数据,此时我们可以使用 java.util 包中的 Date 类。这个类最主要的作用就是获取当前时间,我们来看下 Date 类的使用: 使用 Date ...
949 0
使用IntelliJ IDEA开发SpringMVC网站(四)用户管理
原文:使用IntelliJ IDEA开发SpringMVC网站(四)用户管理 摘要 通过对用户表的管理,更加深入地讲解SpringMVC的操作。 目录[-] 文章已针对IDEA 15做了一定的更新,部分更新较为重要,请重新阅读文章并下载最新源码。
969 0
使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置
原文:使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置 摘要 讲解在IntelliJ IDEA中,如何进行Mysql数据库的配置 目录[-] 文章已针对IDEA 15做了一定的更新,部分更新较为重要,请重新阅读文章并下载最新源码。
1255 0
使用IntelliJ IDEA开发SpringMVC网站(五)博客文章管理
原文:使用IntelliJ IDEA开发SpringMVC网站(五)博客文章管理 摘要 通过对博客文章的管理,实现外键操作。 目录[-] 八、博客文章管理 1、查看文章 2、添加博客        3、查看博文详情 4、修改博客内容 5、删除博客文章 九、尾声         1、如何部署 2、进一步的学习 3、ENDING 转载请注明出处:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) 。
1071 0
使用MMX/SSE汇编指令集优化视频开发
1、汇编指令集 目前大部分的PC机采用的都是Intel或者AMD的CPU,其支持的多媒体汇编指令有: MMX:多媒体扩展指令(MultiMedia eXtention),该指令由Intel在1996年为Pentium处理器开发,包括了57条多媒体指令,可以i一次处理多个数据。
1640 0
使用unidac 在linux 上无驱动直接访问MS SQL SERVER
随着delphi 10.2 开始了对Linux 的重新支持。devart 也迅速的发布了unidac 7.0, 最大的特性就是支持linux和MongoDB. 并有了其他更新: In this release we added such significant features as: T...
1471 0
帆软FineReport如何使用程序数据集
大多数情况下,FineReport直接在设计器里使用“数据集查询”,直接写SQL就能满足报表要求,但对于一些复杂的报表,有时候SQL处理并不方便,这时可以把查询结果在应用层做一些预处理后,再传递给报表,即所谓的“程序数据集”,FineReport的帮助文档上给了一个示例: 1 package com.
1511 0
+关注
优惠活动
阿里云代金码,领券优惠bieryun.com
99
文章
3
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载