springboot-自动装配-ImportSelecter-03

前面两篇文章我们大致说了一下如何使用springboot内置的EnableAutoConfiguration实现自动装配,并实现了一个简单的演示。现在我们来说一下使用内置编程接口如何实现自动装配。

  • 工程结构:


    测试.PNG

在study模块我们定义了4个类:

package com.boot.study.importselecter;

/**
 * Bean
 */
public class ImportSelectorDemo {

    public ImportSelectorDemo () {
        System.out.println("importSelector init..............");
    }

    public String hello () {
        return "使用importSelector接口实现自动装配。。。。";
    }
}

========CreateBeanConfig ========
package com.boot.study.importselecter;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 编程式 创建Bean
 */
@Configuration
public class CreateBeanConfig {

    @Bean
    public ImportSelectorDemo importSelectorDemo () {
        return new ImportSelectorDemo();
    }
}


=========MyImportSelector =========

package com.boot.study.importselecter;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

/**
 * 实现 ImportSelector 接口
 */
public class MyImportSelector implements ImportSelector {
    /**
     * 该方法会被spring回调,返回创建Bean 的 @Configuration 类
     * CreateBeanConfig.class.getName()
     * @param annotationMetadata
     * @return
     */
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{CreateBeanConfig.class.getName()};
    }
}

==========@EnableDemo ============

package com.boot.study.importselecter;
import org.springframework.context.annotation.Import;
import java.lang.annotation.*;

/**
 * @Enablexxx 使用@Import注解
 * 导入 ImportSelector 接口实现类
 * 自定义注解
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(MyImportSelector.class) //导入ImportSelector
public @interface EnableDemo {
}

  • 测试

@EnableDemo //使用@Enable注解
@RestController
@SpringBootApplication
public class EnableDemoApplication {

    @Autowired
    private TestDemo testDemo;
    //运行时注入
    @Autowired
    private ImportSelectorDemo importSelectorDemo;
    public static void main(String[] args) {
        SpringApplication.run(EnableDemoApplication.class, args);
    }

    @GetMapping
    public String hello () {
//        return testDemo.hello();
        return importSelectorDemo.hello();
    }
}

运行结果,访问http://127.0.0.1:8080

  • 总结:
    上面是最简单的使用ImportSelector 实现的自动装配,我们通过演示案例也知道了 这种方式必须配合几个注解才能完成:@Import(MyImportSelector.class) ,@EnableDemo,其他的就是 @Configuration,@Bean。这里我们也看到了@Enablexxx 的身影,没错springboot也是这样玩的。
    开发步骤:
  1. 定义一个Bean ----->ImportSelectorDemo
  2. 实现 ImportSelector接口,并实现 selectImports 方法---->MyImportSelector
  3. 自定义@EnableXXX 注解,使用@Import引入ImportSelector 接口---->@EnableDemo
  4. 使用,使用@EnableDemo,在spring容器运行时加载Bean。

除了上面的编程接口,springboot还为我们提供了一个接口ImportBeanDefinitionRegistrar,可以实现更复杂的功能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容