本篇文章记录对@Import注解学习的整个过程。首先文章会介绍@Import注解的使用,接着分析下spring是如何处理@Import注解,最后通过@EnableAsync来举例说明该类型注解实现的原理。
基本用法
大体上有三种用法
- 引入其它Configuration
- 初始化其它的bean
- 个性化加载bean
下面依次介绍这三种的用法,首先定义几个类,方便后面的讲解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| interface ServiceInterface { void test(); } class ServiceA implements ServiceInterface {
@Override public void test() { System.out.println("ServiceA"); } }
class ServiceB implements ServiceInterface {
@Override public void test() { System.out.println("ServiceB"); } }
|
引入configuration
创建了俩个Config类,其中ConfigA通过@Import引入ConfigB,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @Import(ConfigB.class) @Configuration class ConfigA { @Bean @ConditionalOnMissingBean public ServiceInterface getServiceA() { return new ServiceA(); } }
@Configuration class ConfigB { @Bean @ConditionalOnMissingBean public ServiceInterface getServiceB() { return new ServiceB(); } }
|
同时这里也使用了ConditionalOnMissingBean注解,主要用于判断哪个bean先生成。
通过ConfigA创建AnnotationConfigApplicationContext,获取ServiceInterface,看是哪种实现:
1 2 3 4 5
| public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigA.class); ServiceInterface bean = ctx.getBean(ServiceInterface.class); bean.test(); }
|
输出为:ServiceB.证明@Import的优先于本身的的类定义加载。