美文网首页
springboot学习(1)自定义@Enable模块驱动

springboot学习(1)自定义@Enable模块驱动

作者: matthewfly | 来源:发表于2021-01-16 21:19 被阅读0次

    《springboot编程思想》将spring enable注解模块分类“注解驱动”和“接口编程”。其中@Configoration、@Component被称作“注解驱动”,@ImportSelector、@ImportBeanDefinitionRegister被称作“接口编程”。
    通过ImportSelector模拟实现@Enable模块驱动,通过配置加载接口的不同实例对象。

    工程结构


    image.png
    1. IHello接口
    public interface IHello {
        String hello();
    }
    

    IHello的两个实现:

    public class HelloKitty implements IHello {
        public String hello() {
            return "hello kitty";
        }
    }
    
    public class HelloWorld implements IHello {
        public String hello() {
            return "hello world";
        }
    }
    

    注解定义:

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Import(HelloImportSelector.class)
    public @interface EnableHello {
        String value();
    }
    

    SelectImportor实现:

    public class HelloImportSelector implements ImportSelector {
        public String[] selectImports(AnnotationMetadata annotationMetadata) {
            System.out.println("HelloImportSelector...");
    
            Map<String, Object> annotationAttributes = annotationMetadata.getAnnotationAttributes(EnableHello.class.getName());
            String value = (String) annotationAttributes.get("value");
            if ("world".equals(value)) {
                //读取注解value值,如果等于world实例化HelloWorld
                return new String[]{HelloWorld.class.getName()};
            } else if ("kitty".equals(value)) {
                //读取注解value值,如果等于world实例化HelloKitty
                return new String[]{HelloKitty.class.getName()};
            }
            return new String[0];
        }
    }
    

    启用@EnableHello注解

    @EnableWebMvc
    @Configuration
    //@EnableHello(value = "kitty")
    @EnableHello(value = "world")
    @ComponentScan(basePackages = "controller")
    public class SpringWebMVCConfiguration {
    }
    

    注入IHello实例

    @Controller
    public class HelloController {
    
        @Resource
        private IHello hello;
    
        @PostConstruct
        public void init() {
            System.out.println("hello..." + hello);
        }
    
        @RequestMapping
        @ResponseBody
        public String hello() {
            return hello.hello();
        }
    }
    

    测试注入IHello实例对象:

    curl http://localhost:8080
    hello world
    

    输出hello world,表示注入的为HelloWorld对象。

    相关文章

      网友评论

          本文标题:springboot学习(1)自定义@Enable模块驱动

          本文链接:https://www.haomeiwen.com/subject/rqfoaktx.html