zoukankan      html  css  js  c++  java
  • 【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

    写在最后

    如果觉得文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习Spring注解驱动开发。公众号回复“spring注解”关键字,领取Spring注解驱动开发核心知识图,让Spring注解驱动开发不再迷茫。

  • 相关阅读:
    【Java】抽象类、接口
    【Java】封装、继承、多态
    【Java】WrapperClass 包装类
    【Java】步入OOP 面向对象
    【MySQL】Windows8.0.19 解压版 下载安装
    【Java】05 Variable 变量
    【MySQL】更改root根用户密码 和 SQLyog安装
    LOJ2033.[SDOI2016]生成魔咒 (后缀自动机)
    HDU4641 Kstring (后缀自动机+线段树合并)
    HDU5853 Jong Hyok and String (广义后缀自动机)
  • 原文地址:https://www.cnblogs.com/binghe001/p/13089993.html
Copyright © 2011-2022 走看看