Spring注解之@Import用法解析

 2023-09-11 阅读 30 评论 0

摘要:前言:最近在回顾阅读Springboot源码时发现框架层面大量使用@Import注解,特别是Springboot自动装配机制更是大量使用该注解,搜索部分结果图如下。简单来说就是Springboot中用到了Spring中的@Import注解来帮助实现自动装配。那么本篇博客就来结合&

前言:最近在回顾阅读Springboot源码时发现框架层面大量使用@Import注解,特别是Springboot自动装配机制更是大量使用该注解,搜索部分结果图如下。简单来说就是Springboot中用到了Spring中的@Import注解来帮助实现自动装配。那么本篇博客就来结合@Import注解源码,学习下该注解的日常使用以便进一步理解Springboot自动装配原理。

Spring中@Import注解的出现是Spring迈向注解化道路上重要的一步,一般结合@Configuration注解来使用来导入配置类或者一些特殊用途的类到IOC容器中,传统Springmvc项目会出现如下大量的*.xml配置文件,有了@Import之后一定程度上会减少xml配置文件数目或者xml中配置的内容;

简述基于注解的装配方式的基本用法。有兴趣的话可以先阅读下@Import中的文档注释,注释中对@Import的用法做了完整描述,下面内容是我对文档注释的总结,通过第2条我们可以得出@Import的四个用法,下面将针对这四个用法进行讲解。

  1. 设计目的就是用来导入一个或多个配置类;
  2. 功能同SpringXML文件中的import元素一致,用来导入被@Configuration注解的类、ImportSelector和ImportBeanDefinitionRegistrar的实现类以及Spring4.2起的普通component;
  3. 被@Import注解所导入的类可以作为IOC容器中正常的Component来使用;
  4. 在导入像XML或者没有被@Configuration所注解类定义资源文件时,使用@ImportResource代替;

注意:以下代码可以新建一个java项目,然后引入Spring必要jar包即可,本文为了方便还是在Springboot项目基础上演示,只是为了用Spring必要jar而已;

1、新建一个Springboot项目,项目结构如下

2、base包下类就是普通类,只包含一个重写的toString()方法。base包下类的作用就是为了演示可以被导入,仅此而异。下面只贴出JdbcConfig类的实现,类中注释已删除,其它类只是类名不一样,大家复制粘贴改名即可:

package com.dongnao.base;public class JdbcConfig {@Overridepublic String toString() {return this.getClass().getName() + "实例化成功!";}}

resource注解的用法。3、下面贴出config包下类的实现,只保留有用注释,大家参照注释理解用法;

package com.dongnao.config;/*** @description: 没有被@Configuration所修饰的普通BEAN*/
public class ComponentWithoutConfigAnnotation {@Overridepublic String toString() {return this.getClass().getName() + "实例化成功!";}}
package com.dongnao.config;import com.dongnao.base.RedisConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @description: 被@Configuration所修饰的配置类*/
@Configuration
public class ComponentWithConfigAnnotation {@Beanpublic RedisConfig instanceRedisTemplate() {return new RedisConfig();}}
package com.dongnao.config;import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;/*** @description: ImportSelector实现类, 通过提供selectImports方法的实现来提供* 被导入类(一般为配置类)的全路径名称列表*/
public class ImportSelectorImpl implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{"com.dongnao.base.OssConfig"};}}
package com.dongnao.config;import com.dongnao.base.JdbcConfig;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;/*** @description: ImportBeanDefinitionRegistrar实现类, 来实现直接注册BEAN*/
public class ImportBeanDefinitionRegistrarImpl implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {BeanDefinition jdbcConfig = new RootBeanDefinition(JdbcConfig.class);registry.registerBeanDefinition("jdbcConfig", jdbcConfig);}
}

4、编写配置导入类,该类中对配置类通过@Import注解进行导入:

package com.dongnao.config;import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;/*** @description: 配置导入类*/
@Configuration
@Import({ComponentWithoutConfigAnnotation.class, ComponentWithConfigAnnotation.class, ImportSelectorImpl.class, ImportBeanDefinitionRegistrarImpl.class})
public class ImportConfiguration {@Overridepublic String toString() {return this.getClass().getName() + "实例化成功!";}}

5、编写简单测试类,测试后发现均能从ApplicationContext中获取实例化对象。

package com.dongnao;import com.dongnao.base.JdbcConfig;
import com.dongnao.base.OssConfig;
import com.dongnao.base.RedisConfig;
import com.dongnao.config.ComponentWithoutConfigAnnotation;
import com.dongnao.config.ImportConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class FirstAppByGuiApplication {public static void main(String[] args) {// 利用ImportConfiguration配置类来实例化ApplicationContextApplicationContext applicationContext = new AnnotationConfigApplicationContext(ImportConfiguration.class);// 测试能否从ApplicationContext获取实例对象System.out.println(applicationContext.getBean(ImportConfiguration.class));System.out.println(applicationContext.getBean(ComponentWithoutConfigAnnotation.class));System.out.println(applicationContext.getBean(JdbcConfig.class));System.out.println(applicationContext.getBean(RedisConfig.class));System.out.println(applicationContext.getBean(OssConfig.class));}
}

总结:Spring框架提供了@Import,一般结合@Configuration使用,来导入一些配置或者特殊用途的类纳入到Spring容器中。Spring框架包含方方面面,简单来说你只要这么配置了,Spring容器在初始化装在Bean时就会读取到。一般采用@Import导入的类有四种情形,每种情形大家酌情使用即可;

以上,完了!

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/48336.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息