首页 > 其他分享 >Spring6 探析之@Import 注解

Spring6 探析之@Import 注解

时间:2023-05-26 20:14:22浏览次数:39  
标签:字节 IOC bean 探析 注解 Import Spring6 注入

Spring6 探析之@Import 注解

简介

@Import 注解与 @Bean注解的作用相同,都可以将实例注册到IOC中,但区别是,@Import 只能作用在类上,并且使用@Import时,不需要再使用@Configuration注解

下面是 @Import 的源码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
    
	Class<?>[] value();

}

可以看到,@Import只能作用在类上,并且可以传递字节数组

使用@Import可以有三种注入方式(都是单例的)

  • 直接在字节数组中传递Bean的class字节码文件
  • 实现 ImportSelector 接口注入bean,比较灵活
  • 实现 ImportBeanDefinitionRegistrar 接口注入 bean,最为灵活强大

下面演示这三种注入方式

直接在字节数组中传递Bean的class字节码文件

创建一个User bean

image-20230526194534416

新建一个config类,使用 @Import 传递 User.class 字节码文件

image-20230526194704442

这时候,User bean 就被注入到 IOC中了

实现 ImportSelector 接口注入bean

首先,创建一个 SelectorBean 对象,我们的目的是要将它注入到IOC中

image-20230526194740500

然后,创建一个配置对象,该对象实现 ImportSelector,范围包含 SelectorBean 字节码的数组

image-20230526194827349

最后,仍然是在config类中使用 @Import 注解,不过要注意的是,我们要传递 配置对象 的字节码文件,此时,配置对象 不会被注入到IOC中,而配置对象所管理的bean会被注入到IOC中

image-20230526195016939

实现 ImportBeanDefinitionRegistrar 接口注入 bean

它与第二种方法即为类似,只是函数的使用方法不同

创建 RegistrarBean 对象 ,我们的目的是要将它注入到IOC中

image-20230526195100569

创建配置对象 MyRegistrarBean,用于管理要注入的 bean

可见,函数的使用方式与第二种有所不同

public class MyRegistrarBean implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
        String beanName = RegistrarBean.class.getName();
        RootBeanDefinition beanDefinition = new RootBeanDefinition(RegistrarBean.class);
        registry.registerBeanDefinition(beanName, beanDefinition);

    }
}

然后在config类中使用 @Import 注解 ,与第二种相同,将配置类的字节码传递进去,配置类不会被注册进IOC,而配置类所管理的对象可以

image-20230526195355973

测试

查看IOC中所有bean

image-20230526195432581

image-20230526195453490

可以看到,三个对象注册成功了

标签:字节,IOC,bean,探析,注解,Import,Spring6,注入
From: https://www.cnblogs.com/acdongla/p/17435699.html

相关文章

  • Spring6 探析之@Bean 注解
    Spring6探析之@Bean注解介绍@Bean是spring的常用注解,他可以标记在方法和注解上,可以将方法的返回值放在IOC容器中,它又以下特点单例可指定bean的名称可控制bean的初始化与销毁方法让我们看一下@Bean的源码吧@Target({ElementType.METHOD,ElementType.ANNOTATION_TYPE})......
  • Spring6 探析之@Configuration 注解
    Spring6探析之@Configuration注解介绍@Configuration注解大家都不陌生,该注解有以下特点必须在类上使用能够将被注解的类加载到IOC容器里能够将类中被@Bean注解标记的方法加载到IOC容器里@Configuration有一些参数,其中最值得关注的是proxyBeanMethods,该参数值默认为tr......
  • unplugin-auto-import的配置和eslint报错解决
    unplugin-auto-import的配置和eslint报错解决先上官网:unplugin-auto-importunplugin-auto-import解决了vue3-hook、vue-router、useVue等多个插件的自动导入,也支持自定义插件的自动导入,是一个功能强大的typescript支持工具。unplugin-auto-import常用的配置如下:AutoImport({......
  • 【836】Cannot import tensorflow_text
    Ref:Cannotimporttensorflow_textSometimesyouneedtoreinstallandupdatetensorflowtheninstalltensorflow_text.(Becauseyouneedyourtensorflow.__version__andtensorflow_text.__version__tohavethesameversion)Makesuretensorflowandtensor......
  • python 问题修复ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+
    目录python问题修复ImportError:urllib3v2.0onlysupportsOpenSSL1.1.1+升级openssl版本降低urllib版本python问题修复ImportError:urllib3v2.0onlysupportsOpenSSL1.1.1+这个问题时python版本安装的urllib3版本过高,而openssl版本太低导致的解决无非两种方法,降低......
  • ImportError: cannot import name 'QuantStub' from 'torch.ao.quantization' (E:\Ep
    ImportError:cannotimportname'QuantStub'from'torch.ao.quantization'(E:\Eprogramfiles\Anaconda3\lib\site-packages\torch\ao\quantization\__init__.py)fromtorch.ao.quantizationimportQuantStub,DeQuantStub ModuleNotFoundE......
  • 什么是 !important
     CSS中的!important规则用于增加样式的权重。!important 与优先级无关,但它与最终的结果直接相关,使用一个!important规则时,此声明将覆盖任何其他声明。实例#myid{ }.myclass{ }p{ }https://www.81rz.com/mnst47/......
  • Tomcat10依赖问题 jakarta.servlet-api 6.0.0 spring6.x.x
    org.springframework.web.servlet.DispatcherServlet’isnotassignabletojavax.servlet.Servlet1、pom.xml配置<dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifact......
  • 架构师日记-从数据库发展历程到数据结构设计探析
    作者:京东零售刘慧卿一数据库发展史起初,数据的管理方式是文件系统,数据存储在文件中,数据管理和维护都由程序员完成。后来发展出树形结构和网状结构的数据库,但都存在着难以扩展和维护的问题。直到七十年代,关系数据库理论的提出,以表格形式组织数据,数据之间存在关联关系,具有了良好......
  • Import maps
    当 ESModule 最开始作为一种新的 JavaScript 模块化方案在 ES6 中被引入的候,其实是通过在 import 语句中强制指定相对路径或绝对路径来实现的。import dayjs from "https://cdn.skypack.dev/[email protected]"; // ES modulesconsole.log(dayjs("2022-08-12").form......