SpringBoot中的@import注解


@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注解

 

總結: 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM