@Import(Class[] value)可以将value的类上的注解引入到使用@Import的类中。
-----若@Import(Object.class)中的Object实现了ImportBeanDefinitionRegistrar接口,不管有没有实现接口方法,这个Object对象上的注解都不会以配置的方式加入到spring容器中。
(ImportBeanDefinitionRegistrar有两个重载接口方法,同时实现两个时只会执行三个入参的方法,此方法作为spring注册beanDefinition的拓展点,执行时机在spring默认扫描之后。都由ConfigurationClassPostProcessor完成)
-----若@Import(Object.class)中的Object没有实现ImportBeanDefinitionRegistrar接口,则spring会将这个Object对象上的所有注解带入到使用@Import注解的类中(此时Object也会被spring管理,既Object也成为了一个bean),
这个类在spring环境中拥有Object所有的注解,bean化注解除外。
重要:
只有当一个类使用spi机制或者含有bean化注解时使用@Import才会生效(@Import(Object.class)的Object类不需要是bean)
spi:最早由java语义定义,表示java启动流程中会调用规定的接口方法,spring自己的spi机制为META-INFO/spring.factories里定义的接口实现类,spring启动会扫描它们
举个栗子说明一下@Import的用法:
@Configuration
@Import(Y.class)
public class X{
}
@MpperScan("xxxxx")
public class Y{
}
此时spring容器启动的时候就会把 @MapperScan("xxxxx")带入配置类(X)中,其实此时类Y也是一个Bean。
若:
@Configuration
@Import(Y.class)
public class X{
}
@MpperScan("xxxxx")
public class Y implement ImportBeanDefinitionRegistrar{
}
则spring启动的时候配置@MpperScan("xxxxx")不会生效,但是如果Y实现了ImportBeanDefinitionRegistrar的接口方法,则spring启动时ConfiugrationClassPostProcessor这个处理器会调用到这个方法。