前言
@Import注解用来导入配置类或一些需要前置加载的类,其可以通过快速导入的方式实现把实例加入Spring的IOC容器中。
普通类导入
- 控制层
@RestController
@RequestMapping("/test")
@Import(TestOne.class)
public class TestController {
public class TestController {
@Autowired
private TestInter testOne;
@GetMapping(value = "/test")
public String test(){
return testOne.sayHello();
}
}
- 接口
public interface TestInter {
String sayHello();
}
- 实现类
public class TestOne implements TestInter {
public TestOne () {
System.out.println("TestOne init");
}
@Override
public String sayHello() {
return "Hello TestOne";
}
}
- 接口调用结果
- TestOne 是一个普通类,现在可以被@Autowired注入调用,说明已经被Spring 实例化
@Configuration的配置类导入
- 配置类
@Configuration
public class TestConfiguration {
@Bean
public TestInter testOne() {
return new TestOne();
}
}
- 新建启动类
@Import(TestConfiguration.class)
public class SpringLearnTestApplication {
public static void main(String[] args) {
// 不要求启动web服务器
ConfigurableApplicationContext context =
new SpringApplicationBuilder(SpringLearnTestApplication.class)
.web(WebApplicationType.NONE)
.run(args);
TestInter testInter = (TestInter) context.getBean("testOne");
System.out.println(testInter.sayHello());
}
}
- 导入TestConfiguration配置类中定义的所有Bean,运行结果
ImportSelector 方式导入
- 配置类
@Configuration
public class TestConfiguration {
@Bean
public TestInter testOne() {
return new TestOne();
}
}
- 新建TestConfigurationSelector实现ImportSelector接口注入TestConfiguration配置类中定义的所有Bean
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class TestConfigurationSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[] {TestConfiguration.class.getName()};
}
}
- 新建启动类
@Import(TestConfigurationSelector.class)
public class SpringLearnTestApplication {
public static void main(String[] args) {
// 不要求启动web服务器
ConfigurableApplicationContext context =
new SpringApplicationBuilder(SpringLearnTestApplication.class)
.web(WebApplicationType.NONE)
.run(args);
TestInter testInter = (TestInter) context.getBean("testOne");
System.out.println(testInter.sayHello());
}
}
- 运行结果
- @Import手动注册bean到容器:ImportBeanDefinitionRegistrar,这里就略过了。。。