前面两篇文章我们大致说了一下如何使用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
- 总结:
上面是最简单的使用ImportSelector 实现的自动装配,我们通过演示案例也知道了 这种方式必须配合几个注解才能完成:@Import(MyImportSelector.class) ,@EnableDemo,其他的就是 @Configuration,@Bean。这里我们也看到了@Enablexxx 的身影,没错springboot也是这样玩的。
开发步骤:
- 定义一个Bean ----->ImportSelectorDemo
- 实现 ImportSelector接口,并实现 selectImports 方法---->MyImportSelector
- 自定义@EnableXXX 注解,使用@Import引入ImportSelector 接口---->@EnableDemo
- 使用,使用@EnableDemo,在spring容器运行时加载Bean。
除了上面的编程接口,springboot还为我们提供了一个接口ImportBeanDefinitionRegistrar,可以实现更复杂的功能。