简介
在平时看源码或者很多配置类上面都会出现 @Import
注解,功能就是和Spring XML
里面 的 一样. @Import
注解是用来导入配置类或者一些需要前置加载的类.,springboot
框架实现自动装配的原理之一正是利用这一特性解决了 spring
框架中重量级的xml配置
Import
注解的作用:也是注入第三方类让他变成容器管理的 bean
,比 @Configuration
结合 @bean
功能更加单一。但是更加暴力简单
源码解析
@Import
注解源码以及源码描述的翻译
/**
- Indicates one or more <em>component classes</em> to import — 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
(其实只有三种):
- 导入普通类(4.2 版本之前只可以导入配置类,4.2版本之后 也可以导入 普通类),将普通类变为
Spring bean
。这意味着,通过@Import
注解,可以将不在Spring Boot
的包扫描路径下的文件加载到容器里面,前提是这些类有一个无参的构造器。 - 导入
@Configuration
配置类(@Configuration
配置类已经是被注册为bean
了,因此再用Import
导入没什么意义 - 导入
ImportSelector
的实现类,ImportSelector
接口中定义了方法selectImports
,它返回字符串数组,里面是类的全路径。使用@Import
导入ImportSelector
的实现类,就是将selectImports
方法返回的类注册为Spring bean
。 - 导入
ImportBeanDefinitionRegistrar
的实现类,ImportBeanDefinitionRegistrar
接口中定义了方法registerBeanDefinitions
,它的功能就是通过BeanDefinitionRegistry
实例注册Spring bean
。