ChenZhen 搜索
首页 标签 归档 留言板 友链 ChatGPT 提示库 AI工具导航网 🚇开往 关于我

Springboot框架自动装配原理之@Import注解(自动装配的核心底层实现)

在平时看源码或者很多配置类上面都会出现@Import注解,功能就是和Spring XML里面 的 一样.@Import注解是用来导入配置类或者一些需要前置加载的类.,springboot框架实现自动装配的原理之一正是利用这一特性解决了spring框架中重量级的xml配置Import注解的作用:也是注入第三方类让他变成容器管理的bean,比结合@bean功能更加单一。但是更加暴力简单。

ChenZhen 2024-09-30T20:16:34

Springboot框架自动装配原理之@Import注解(自动装配的核心底层实现)

简介

在平时看源码或者很多配置类上面都会出现 @Import 注解,功能就是和Spring XML里面 的 一样. @Import 注解是用来导入配置类或者一些需要前置加载的类.,springboot 框架实现自动装配的原理之一正是利用这一特性解决了 spring 框架中重量级的xml配置

Import 注解的作用:也是注入第三方类让他变成容器管理的 bean ,比 @Configuration 结合 @bean 功能更加单一。但是更加暴力简单

源码解析

@Import 注解源码以及源码描述的翻译

/**
 - Indicates one or more <em>component classes</em> to import &mdash; typically
 - {@link Configuration @Configuration} classes.
表示要导入的一个或多个组件类 通常@Configuration 类。
 -
 - <p>Provides functionality equivalent to the {@code <import/>} element in Spring XML.
 - Allows for importing {@code @Configuration} classes, {@link ImportSelector} and
 - {@link ImportBeanDefinitionRegistrar} implementations, as well as regular component
 - classes (as of 4.2; analogous to {@link AnnotationConfigApplicationContext#register}).
 提供与 Spring XML 中的 <import/> 元素等效的功能。允许导入 @Configuration类、
 ImportSelector和ImportBeanDefinitionRegistrar 实现,
 以及常规组件类(从 4.2 开始;类似于AnnotationConfigApplicationContext#register) 
 - 
 - <p>{@code @Bean} definitions declared in imported {@code @Configuration} classes should be
 - accessed by using {@link org.springframework.beans.factory.annotation.Autowired @Autowired}
 - injection. Either the bean itself can be autowired, or the configuration class instance
 - declaring the bean can be autowired. The latter approach allows for explicit, IDE-friendly
 - navigation between {@code @Configuration} class methods.
在导入的 @Configuration 类中声明的 @Bean 定义应该是
通过使用 @Autowired访问注射。 bean 本身可以自动装配,或者配置类实例
声明 bean 可以自动装配。 后一种方法允许显式的、IDE 友好的
@Configuration 类方法之间的导航。
 
 - <p>May be declared at the class level or as a meta-annotation.
 -  16. <p>If XML or other non-{@code @Configuration} bean definition resources need to be
 - imported, use the {@link ImportResource @ImportResource} annotation instead.
 -  */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {

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

通过源码的描述翻译可以总结出 @Import 可以通过以下四种方式导入一个 bean(其实只有三种):

  1. 导入普通类(4.2 版本之前只可以导入配置类,4.2版本之后 也可以导入 普通类),将普通类变为Spring bean 。这意味着,通过 @Import 注解,可以将不在 Spring Boot 的包扫描路径下的文件加载到容器里面,前提是这些类有一个无参的构造器。
  2. 导入 @Configuration 配置类( @Configuration 配置类已经是被注册为 bean 了,因此再用 Import 导入没什么意义
  3. 导入 ImportSelector 的实现类,ImportSelector 接口中定义了方法 selectImports ,它返回字符串数组,里面是类的全路径。使用 @Import 导入 ImportSelector 的实现类,就是将 selectImports 方法返回的类注册为 Spring bean
  4. 导入 ImportBeanDefinitionRegistrar 的实现类,ImportBeanDefinitionRegistrar 接口中定义了方法registerBeanDefinitions ,它的功能就是通过 BeanDefinitionRegistry 实例注册 Spring bean

Springboot框架自动装配原理之@Import注解作用

© 版权声明
😀😃😄😁😆😅🤣😂🙂🙃😉😊😇🥰😍🤩😘😗😚😙😋😛😜🤪😝🤑🤗🤭🤫🤔🤐🤨😐😑😶😏😒🙄😬🤥😌😔😪🤤😴😷🤒🤕🤢🤮🤧🥵🥶🥴😵🤯🤠🥳😎🤓🧐😕😟🙁☹️😮😯😲😳🥺😦😧😨😰😥😢😭😱😖😣😞😓😩😫🥱😤😡😠🤬