SpringBoot11(@Improt注解)

一、介绍@improt

1-@Import注解的作用是什么?

通过导入的方式,来实现把"实例"加入Spring容器中的功能。

2-@Import注解能够导入哪些类?

可以导入普通类;
可以和@Configuration注解的类搭配使用;
可以和实现了ImportSelector和ImportBeanDefinitionRegistrar接口的类搭配使用

3-@Import注解能够添加到哪些类上?

@Import注解可以添加在自定义的注解
@SpringBootApplication(启动类)
@Configuration(配置类)
@Component(组件类)所注解的类上(@RestController、@Service、@Repository都属于@Component)

目的:从而实现将"实例"加入到Spring容器中的功能。

二、(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());
    }

  • 新建一个ImportConfig,在类上面加上@Configuration,加上@Configuration是为了能让Spring 扫描到这个类,并且直接通过@Import引入TestA类
@Import({TestA.class})
@Configuration
public class ImportConfig {
}
  • 测试
  • TestA 是一个普通的类,现在可以被@Autowired注释然后调用,就直接说明已经被Spring 注入并管理了,普通的类都是需要先实例化.
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ApplicationMain.class)
public class ImportAnnotionTest {
 
    @Autowired
    TestA testA; //可以发现,这个类生成了对象,就是因为Import注解的功劳
 
    @Test
    public void TestA() {
        testA.printName();
    }
}


(2)导入带有@Configuration的配置类

  • 新建TestB
@Configuration
public class TestB {
    public void fun(String str) {
        System.out.println(str);
    }
 
    public void printName() {
        System.out.println("类名 :" + Thread.currentThread().getStackTrace()[1].getClassName());
    }
}
  • 在ImportConfig.class里面直接引入TestB
@Import({TestA.class,TestB.class})
@Configuration
public class ImportConfig {
}
  • 测试结果
  • TestB.class 的类上面已经有了@Configuration注解,本身就会配spring扫到并实例化,@import引入带有@Configuration的配置文件,是需要先实例这个配置文件再进行相关操作
@Autowired
TestB testB;

@Test
public void TestB(){
   testB.printName();
}



(3)通过ImportSelector 方式导入的类

  • 新建TestC
public class TestC {
    public void fun(String str) {
        System.out.println(str);
    }
 
    public void printName() {
        System.out.println("类名 :" + Thread.currentThread().getStackTrace()[1].getClassName());
    }
}
  • 新建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"};
    }
}
  • ImportConfig上面引入SelfImportSelector.class
@Import({TestA.class,TestB.class,SelfImportSelector.class})
@Configuration
public class ImportConfig {
}
  • 测试
@Autowired
TestC testC;
 
@Test
public void TestC() {
    testC.printName();
}

小结:@improt就是为了把一个"实例"加入到SpringBoot容器中,可以被Spring调用和使用

posted on 2022-11-16 21:57  陈嘻嘻-  阅读(87)  评论(0编辑  收藏  举报

导航