一、介绍@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();
}