Spring Framework 组件注册 之 @Import

Spring Framework 组件注册 之 @Import

写在前面

spring中注册组件或者叫javaBean是使用spring的功能的前提条件。而且spring也提供了很多种方式,让我们可以将普通的javaBean注册到spring容器中,比如前一篇文章Spring Framework 组件注册 之 @Component中写的利用@Component注解将普通的javaBean注册到容器中,本文说的@Import注解也是spring Framework提供的将普通javaBean注册到容器中,以及后续文章会说的@Configuration,FactoryBean等方式。

@Import 注册普通Bean

使用@Import注册一个普通Bean,只需要在@Import注解中指定待注册Bean的class即可

/** * 使用Import注解,注册一个普通的Bean */ @Data public class TestImport { private String id = "@Import"; }

在spring启动引导类中,添加@Import注解

/** * spring 容器启动引导类 */ @Import(TestImport.class) public class TestImportBootstrap { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestImportBootstrap.class); System.out.println("context id : " + applicationContext.getId()); String[] beanNames = applicationContext.getBeanNamesForType(TestImport.class); System.out.println("Bean Name is : " + Arrays.toString(beanNames)); TestImport bean = applicationContext.getBean(TestImport.class); System.out.println("TestImport bean : " + bean); applicationContext.close(); } }

spring容器启动后,控制台打印的结果:

context id : org.springframework.context.annotation.AnnotationConfigApplicationContext@21b8d17c
==Bean Name is : [com.spring.study.ioc.register.TestImport]==
TestImport bean : TestImport(id=@Import)

通过简单使用@Import注解,便可以将一个普通的javaBean注册到spring容器中。并且我们可以看到,通过@Import注解默认注册的组件名称为该javaBean的全类名

@Import 导入 配置类

使用@Import注解导入配置类,就会将配置类中的所有组件注册到spring容器中。在spring中,并不是@Configuration标注的类才是配置类,但是被@Configuration标注的类会被生成代理对象,spring注入时与不使用@Configuration注解有很大区别,后续会单独说明此处内容,本文不在赘述。

/** * spring组件配置类 */ //@Configuration 使用@Import导入时,此注解可以不加 public class TestConfiguration { @Bean public TestImport testImport() { return new TestImport(); } @Bean public TestImport testImport2() { return new TestImport(); } }

@Import注解中指定待导入的配置类

/** * spring 容器启动引导类 */ @Import(TestConfiguration.class) public class TestImportBootstrap { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestImportBootstrap.class); System.out.println("context id : " + applicationContext.getId()); String[] beanNames = applicationContext.getBeanNamesForType(TestImport.class); System.out.println("Bean Name is : " + Arrays.toString(beanNames)); TestImport bean = (TestImport) applicationContext.getBean("testImport"); System.out.println("TestImport bean : " + bean); applicationContext.close(); } }

spring容器启动后,配置类中的注解同样会被注册到spring容器中:

context id : org.springframework.context.annotation.AnnotationConfigApplicationContext@21b8d17c
==Bean Name is : [testImport, testImport2]==
TestImport bean : TestImport(id=@Import)

由结果可以看出,此时注册的组件名称即为配置类中指定的组件名称,并且通过配置类,可以一次导入多个组件。

@Import 通过ImportSelector 注册

在ImportSelector接口中只定义了一个接口selectImports,通过此接口返回需要注册的JavaBean的全类名数组,在使用@Import导入时,会将接口返回的所有类注册到spring容器中

/** * 通过 ImportSelector 接口注册组件 */ @Data public class TestSelector { private String id = "@Import:ImportSelector"; }

自定义实现ImportSelector接口

/** * 自定义组件选择器,通过返回需要注册的bean的全类名,进行快速的在IOC容器中注册组件 */ public class CustomImportSelector implements ImportSelector { /** * @param importingClassMetadata 标注了@Import配置类上面所有的注解信息 */ public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{TestSelector.class.getName()}; } }

@Import注解中指定ImportSelector实现类

/** * spring 容器启动引导类 */ @Import(CustomImportSelector.class) public class TestImportBootstrap { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestImportBootstrap.class); System.out.println("context id : " + applicationContext.getId()); TestSelector bean = applicationContext.getBean(TestSelector.class); System.out.println("TestSelector bean : " + bean); String[] beanNames = applicationContext.getBeanNamesForType(TestSelector.class); System.out.println("bean names:" + Arrays.asList(beanNames)); applicationContext.close(); } }

spring容器启动后,控制台打印的结果:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyffdg.html