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注解
总结:
标签:
SpringBoot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了