美文网首页springboot
springboot-自动装配-ImportBeanDefini

springboot-自动装配-ImportBeanDefini

作者: 愤怒的奶牛 | 来源:发表于2020-07-26 17:02 被阅读0次

    本次我们来了解目前为止最后一种自动装配机制编程接口ImportBeanDefinitionRegistrar。

    • 工程目录
      因为本次演示案例和 ImportSelector 编程接口的思路时一样的,所以工程结构和上次时一样的。
    • 案例代码:
    /**
     * 需要被spring 管理的Bean
     */
    public class UserService {
    
        public String getUser() {
            return "ImportBeanDefinitionRegistrar 自动装配。。。";
        }
    }
    ================UserServiceConfig=======================
    package com.boot.study.importBeanDefinitionRegistrar;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @Configuration 配置类
     */
    @Configuration
    public class UserServiceConfig {
    
        @Bean
        public UserService userService () {
            return new UserService();
        }
    }
    
    ====================MyImportBeanDefinitionRegistrar 重点==========================
    package com.boot.study.importBeanDefinitionRegistrar;
    
    import org.springframework.beans.factory.support.BeanDefinitionRegistry;
    import org.springframework.beans.factory.support.RootBeanDefinition;
    import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
    import org.springframework.core.type.AnnotationMetadata;
    
    public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    
        /**
         * 注册 BeanDefinition
         * @param importingClassMetadata
         * @param registry
         */
        @Override
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    
            String beanName = "userService";
            RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
            rootBeanDefinition.setBeanClass(UserService.class);
            registry.registerBeanDefinition(beanName, rootBeanDefinition);
        }
    }
    
    
    ==================@EnableUserService========================
    
    package com.boot.study.importBeanDefinitionRegistrar;
    
    import org.springframework.context.annotation.Import;
    
    import java.lang.annotation.*;
    
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Import(MyImportBeanDefinitionRegistrar.class)
    public @interface EnableUserService {
    }
    
    
    • 测试:
    package com.example.enabledemo;
    
    import com.boot.study.demo.TestDemo;
    import com.boot.study.importBeanDefinitionRegistrar.EnableUserService;
    import com.boot.study.importBeanDefinitionRegistrar.UserService;
    import com.boot.study.importselecter.EnableDemo;
    import com.boot.study.importselecter.ImportSelectorDemo;
    import com.example.enabledemo.helloworld.HelloWorld;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cache.annotation.EnableCaching;
    import org.springframework.context.ConfigurableApplicationContext;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.annotation.Resource;
    
    @EnableUserService
    //@EnableDemo
    @RestController
    @SpringBootApplication
    public class EnableDemoApplication {
    
    //    @Autowired
    //    private TestDemo testDemo;
    //    //运行时注入
    //    @Autowired
    //    private ImportSelectorDemo importSelectorDemo;
        //运行时注入
        @Autowired
        private UserService userService;
    
        public static void main(String[] args) {
            SpringApplication.run(EnableDemoApplication.class, args);
        }
    
        @GetMapping
        public String hello () {
    //        return testDemo.hello();
    //        return importSelectorDemo.hello();
            return userService.getUser();
        }
    }
    
    

    运行结果,访问http://127.0.0.1:8080, 返回:ImportBeanDefinitionRegistrar 自动装配。。。

    总结:
    编程步骤或者说需要提供的类大致和 ImportSelector 接口编程思路是一致的,只是使用的具体的接口不一样,这里使用的加载Bean 定义的接口 ImportBeanDefinitionRegistrar。

    现在我们基本就介绍完了springboot 实现自动装配的几种方式,注意,这里是介绍了最简单的编程方式,没有加入 条件装配机制,原因是为了我们能够先知道最简单的方式,然后我们可以在这个基础上再慢慢添加一些复杂的东西。

    • 后续

    再了解了如何使用springboot 的自动装配以后,我们可以尝试着分析一下原理,看看springboot是如何做到的,能够加载外部模块的Bean,让spring容器管理。

    相关文章

      网友评论

        本文标题:springboot-自动装配-ImportBeanDefini

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