@Import注解
Springboot的自動配置依賴於主配置類中的EnableAutoConfguration注解,而該注解的底層依賴的就是@Import這個注解
Enable*底層會使用@Import注解導入一些類,使用@Import注解導入的類會自動加載進SpringIOC容器中
轉載資源:Springboot框架中的注解-@Import注解的使用以及意義_Tronhon的博客-CSDN博客_springboot的import注解
@Import中共提供4中方式:
- 方式一:直接導入Bean(springboot-4.2版本之后才可以直接導入普通類)
1. 導入普通類
// 新建一個TestA
public class TestA {
public void fun(String str) {
System.out.println(str);
}
public void printName() {
System.out.println("類名 :" + Thread.currentThread().getStackTrace()[1].getClassName());
}
}
2.新建一個ImportConfig,在類上面加上@Configuration,
加上@Configuration是為了能讓Spring 掃描到這個類,並且直接通過@Import引入TestA類
@Configuration
@Import({TestA.class}) //也可以引入多個,寫成數組形式:@Import({TestA.class,TestB.class})
public class ImportConfig {
}
3.測試結果
//TestA 是一個普通的類,現在可以被@Autowired注釋然后調用,
//就直接說明已經被Spring 注入並管理了,普通的類都是需要先實例化
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ApplicationMain.class)
public class ImportAnnotionTest {
@Autowired
TestA testA;
@Test
public void TestImport() {
testA.printName();
}
}
4. 測試結果
打印:
類名 :com.test.importdemo.TestA
- 方式二:導入帶有@Configuration的配置類
1.新建TestB,使用@Configuration標注為一個配置類
@Configuration
public class TestB {
public void fun(String str) {
System.out.println(str);
}
public void printName() {
System.out.println("類名 :" + Thread.currentThread().getStackTrace()[1].getClassName());
}
}
2.在ImportConfig.class里面直接引入TestB
@Import({TestA.class,TestB.class})
@Configuration
public class ImportConfig {
}
3.測試
//TestB.class 的類上面已經有了@Configuration注解,本身就會配spring掃到並實例,
//@import引入帶有@Configuration的配置文件,是需要先實例這個配置文件再進行相關操作
@Autowired
TestB testB;
@Test
public void TestB(){
testB.printName();
}
方式三:導入ImportSelector接口的實現類,
該方式是Spingboot中@Import注解默認使用的方式
1. 通過ImportSelector 方式導入的類,新建TestC.class
public class TestC {
public void fun(String str) {
System.out.println(str);
}
public void printName() {
System.out.println("類名 :" + Thread.currentThread().getStackTrace()[1].getClassName());
}
}
2.新建SelfImportSelector.class 實現ImportSelector 接口,注入TestC.class
//TODO ImportSelector 相關解釋
public class SelfImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.test.importdemo.TestC"};
}
}
3.ImportConfig上面引入SelfImportSelector.class
@Import({TestA.class,TestB.class,SelfImportSelector.class})
@Configuration
public class ImportConfig {
}
4.測試結果
@Autowired
TestC testC;
@Test
public void TestC() {
testC.printName();
}
- 方式四:創建ImportBeanDefinitionRegisterar這個接口的實現類
1.新建TestD.class
public class TestD {
public void fun(String str) {
System.out.println(str);
}
public void printName() {
System.out.println("類名 :" + Thread.currentThread().getStackTrace()[1].getClassName());
}
}
2. 新建SelfImportBeanDefinitionRegistrar.class,實現接口ImportBeanDefinitionRegistrar,注入TestD.class
public class SelfImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition root = new RootBeanDefinition(TestD.class);
registry.registerBeanDefinition("testD", root);
}
}
3.ImportConfig類上加上導入SelfImportBeanDefinitionRegistrar.class
@Import({TestA.class,TestB.class,SelfImportSelector.class, SelfImportBeanDefinitionRegistrar.class})
@Configuration
public class ImportConfig {
}
4.測試結果
@Autowired
TestD testD;
@Test
public void TestD() {
testD.printName();
}
針對第三種方式跟一下Springboot源碼,解析:
//1.進入SpringbootApplication這個注解
@SpringBootApplication
//2.該注解下有三個注解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan()
//3.跟蹤EnableAutoConfiguration這個注解,該注解中有:
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
//4.Import這個注解使用的是引入ImportSelector實現類這個方式
具體實現方式在@EnableAutoConfiguration這個注解中進行說明,關注博客中的Springboot的@EnableAutoConfiguration注解