• @Import注解的作用以及如何使用


    🥇 《Java系核心技术》 《中间件核心技术》
    🥇 《微服务核心技术》 《云原生核心技术》

    1. @Import注解提供了@Bean注解的功能,在Spring 4.2之后,@Import可以直接指定实体类,加载这个类定义到context中。

    2. @Import的优先于本身的的类定义加载。

    这里直讲@Import比较常用的用法

    直接指定类

    新建类ImportTest1

    public class ImportTest1 {
    
        public void run() {
            System.out.println("======ImportTest1=======");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    新建配置类ImportTest2,并标注注解@Import,注解内部指定想要加载的类,这里使其交给Spring IOC容器管理。

    @Configuration
    @Import(ImportTest1.class)
    public class ImportTest2 {
    
        @Bean
        public ImportTest2 importTest2(){
    		return new ImportTest2();
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    通过@Autowired就可以直接使用这个类了。

    @RestController
    public class ProducerController {
    
        @Autowired
        private ImportTest1 importTest1;
    
        @GetMapping("/imported")
        public String imported() {
    
            importTest1.run();
            return String.valueOf(ThreadLocalRandom.current().nextInt(100));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    实现ImportSelector接口

    新建类ImportTest1

    public class ImportTest1 {
    
        public void run() {
            System.out.println("======ImportTest1=======");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    实现ImportSelector接口,实现selectImports方法,指定想要加载的全类名。

    public class ImportSelectorTest implements ImportSelector {
        @Override
        public String[] selectImports( AnnotationMetadata annotationMetadata) {
            return new String[]{"com.issa.producer.csdn.imported.ImportTest1"};
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在配置类中使用@Import注解指定ImportSelector的实现类。

    @Configuration
    @Import(ImportSelectorTest.class)
    public class ImportTest2 {
    
        public void run() {
            System.out.println("======ImportTest2=======");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    通过@Autowired就可以直接使用这个类了。

    @RestController
    public class ProducerController {
    
        @Autowired
        private ImportTest1 importTest1;
    
        @GetMapping("/imported")
        public String imported() {
    
            importTest1.run();
            return String.valueOf(ThreadLocalRandom.current().nextInt(100));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    自定义注解整合ImportSelector接口

    自定义注解

    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Target(ElementType.TYPE)
    @Import(ImportTest.class)
    public @interface EnableSelector {
    
        @AliasFor("name")
        String value() default "";
    
        @AliasFor("value")
        String name() default "";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    注解处理

    public class ImportTest implements ImportSelector {
    
        @Override
        public String[] selectImports(AnnotationMetadata annotationMetadata) {
            Map<String, Object> map = annotationMetadata.getAnnotationAttributes(EnableSelector.class.getName(), true);
            assert map != null;
            String name = (String) map.get("name");
            if (Objects.equals(name, "ImportTest1")) {
                return new String[]{"com.issa.producer.csdn.imported.ImportTest1"};
            }
            return new String[0];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    注解使用

    @Configuration
    @EnableSelector("ImportTest1")
    public class ImportTest2 {
    
        public void run() {
            System.out.println("======ImportTest2=======");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    参考:https://spring.io、https://cloud.tencent.com/developer/article/1811376

  • 相关阅读:
    HTML+CSS【超浪漫的表白网页代码】不会编程也能制作送给女朋友的表白网站
    魔兽世界服务端源码各个重要文件详细情况说明开服一条龙
    add_precompiled_header
    Android Studio实现记单词App,背完四六级一次过~
    深度克隆和浅拷贝的区别
    还在用纸质表进行设备巡检?
    oracle入门笔记五
    一起学数据结构(12)——归并排序的实现
    树莓派更换国内可用镜像源
    R数据分析:扫盲贴,什么是多重插补
  • 原文地址:https://blog.csdn.net/CSDN_SAVIOR/article/details/126154581