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

 

总结: 

posted @   许君闲乘悦  阅读(1630)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示