springboot

springboot-自动装配-ImportSelecter-0

2020-07-26  本文已影响0人  愤怒的奶牛

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

在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

  1. 定义一个Bean ----->ImportSelectorDemo
  2. 实现 ImportSelector接口,并实现 selectImports 方法---->MyImportSelector
  3. 自定义@EnableXXX 注解,使用@Import引入ImportSelector 接口---->@EnableDemo
  4. 使用,使用@EnableDemo,在spring容器运行时加载Bean。

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

上一篇 下一篇

猜你喜欢

热点阅读