@Import注解
下文笔者讲述@import注解的功能简介说明,如下所示
@Import注解的功能
@Import注解是Spring中java注解 @Import注解拥有@Bean注解的功能 是一个配置类@Configuration类的权限
功能1:引入其他@Configuration
例//假设有如下接口和两个实现类: package com.test interface ServiceInterface { void test(); } class ServiceA implements ServiceInterface { @Override public void test() { System.out.println("ServiceA"); } } class ServiceB implements ServiceInterface { @Override public void test() { System.out.println("ServiceB"); } } //两个@Configuration,其中ConfigA``@Import``ConfigB: package com.test @Import(ConfigB.class) @Configuration class ConfigA { @Bean @ConditionalOnMissingBean public ServiceInterface getServiceA() { return new ServiceA(); } } @Configuration class ConfigB { @Bean @ConditionalOnMissingBean public ServiceInterface getServiceB() { return new ServiceB(); } } //通过ConfigA创建AnnotationConfigApplicationContext,获取ServiceInterface,看是哪种实现: public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigA.class); ServiceInterface bean = ctx.getBean(ServiceInterface.class); bean.test(); } //输出为:ServiceB.证明@Import的优先于本身的的类定义加载。
直接初始化其他类Bean
Spring 4.2之后 @Import可以直接指定实体类到context中 将上面代码中ConfigA @Import修改为@Import(ServiceB.class) 就会生成ServiceB的Bean到容器上下文中 输出: ServiceB.证明@Import优先于本身的的类定义加载例
package com.test; class ServiceImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { //可以是@Configuration注解修饰的类,也可以是具体的Bean类的全限定名称 return new String[]{"com.test.ConfigB"}; } } @Import(ServiceImportSelector.class) @Configuration class ConfigA { @Bean @ConditionalOnMissingBean public ServiceInterface getServiceA() { return new ServiceA(); } } package com.test; @Retention(RetentionPolicy.Runtime) @Documented @Target(ElementType.TYPE) @Import(ServiceImportSelector.class) @interface EnableService { String name(); } class ServiceImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { //这里的importingClassMetadata针对的是使用@EnableService的非注解类 //因为`AnnotationMetadata`是`Import`注解所在的类属性,如果所在类是注解类,则延伸至应用这个注解类的非注解类为止 Map<String , Object> map = importingClassMetadata.getAnnotationAttributes(EnableService.class.getName(), true); String name = (String) map.get("name"); if (Objects.equals(name, "B")) { return new String[]{"com.test.ConfigB"}; } return new String[0]; } } //在ConfigA中增加注解@EnableService(name = "B") package com.test; @EnableService(name = "B") @Configuration class ConfigA { @Bean @ConditionalOnMissingBean public ServiceInterface getServiceA() { return new ServiceA(); } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。