@Import 导入bean对象
@Import 导入bean对象
被@Import注解导入的类会被Spring注册到IOC容器中,成为IOC容器管理的bean对象。
@Import 常见的导入形式
- 导入类
- 导入ImportSelector接口实现类
1). 导入普通类
//Common.java
public class Common {}//===============================
@Import(Common.class) //将普通类导入IOC容器中
@SpringBootTest
class ImportQuickstartApplicationTests {@Autowiredprivate Common common;@Testvoid testCommon() {System.out.println(common);}
}
运行测试方法,控制台日志输出如下:
@Import注解导入Common类成为IOC容器中的bean对象。
2). 导入配置类
//Config.java
@Configuration
public class Config {@Beanpublic ConfigBean1 getConfigBean1() {return new ConfigBean1();}@Beanpublic ConfigBean2 getConfigBean2() {return new ConfigBean2();}}//====================================
//ConfigBean1.java
public class ConfigBean1 {}//====================================
//ConfigBean2.java
public class ConfigBean1 {}//=====================================
@Import(Config.class) //将配置类导入IOC容器中
@SpringBootTest
class ImportQuickstartApplicationTests {@Autowiredprivate Config config;@Autowiredprivate ConfigBean1 configBean1;@Autowiredprivate ConfigBean2 configBean2;@Testvoid testConfig() {System.out.println(config);System.out.println(configBean1);System.out.println(configBean2);}}
执行测试方法,控制台输出日志如下:
@Import注解会将配置类及配置类中声明的bean对象一并导入IOC容器成为IOC容器中的bean对象。
3).导入ImportSelector接口实现类
观察ImportSelector接口中待实现的selectImports方法,我们发现该方法的返回值返回的字符串数组是我们要导入IOC容器中的类的全类名。 也就是说这个方法的返回值中封装着我们要导入IOC容器的bean对象。
//ImportSelectorDemo.java
public class ImportSelectorDemo implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[] {"com.ryuki.importquickstart.Common","com.ryuki.importquickstart.config.Config"};}
}//================================
@Import(ImportSelectorDemo.class) //导入ImportSelector接口实现类
@SpringBootTest
class ImportQuickstartApplicationTests {@Autowiredprivate Common common;@Autowiredprivate Config config;@Autowiredprivate ConfigBean1 configBean1;@Autowiredprivate ConfigBean2 configBean2;@Testvoid testConfig() {System.out.println(common);System.out.println(config);System.out.println(configBean1);System.out.println(configBean2);}}
执行测试方法,控制台输出如下:
需要注意的是:
@Import
导入ImportSelector接口实现类时,不会将该类交由Spring IOC管理,而是通过其selectImports()
方法动态导入其他类。- @Import注解的生效前提:所在类必须被Spring容器管理
通常情况下,我们会将该注解进一步封装为@EnableXxxx开头的注解,使得使用方无需关注需要导入那些bean对象。
由Spring IOC管理**,而是通过其selectImports()
方法动态导入其他类。
- @Import注解的生效前提:所在类必须被Spring容器管理
通常情况下,我们会将该注解进一步封装为@EnableXxxx开头的注解,使得使用方无需关注需要导入那些bean对象。