介绍
在《搞定Spring:Enable**注解是如何实现的?》介绍了一下@Import注解的使用,和@Import相关的还有一个ImportAware接口
@Import注解注入Bean的方式有如下三种
- 基于Configuration Class
- 基于ImportSelector接口
- 基于ImportBeanDefinitionRegistrar接口
基于ImportSelector接口和ImportBeanDefinitionRegistrar接口的方式都可以从方法上获取AnnotationMetadata(注解元信息),那么基于Configuration Class的方式该如何获取AnnotationMetadata呢?只需要实现ImportAware就可以了
写个Demo演示一下
ImportAware接口的作用
@Data
public class ProxyMode {
private String mode;
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(ProxyConfiguration.class)
public @interface EnableProxy {
String mode() default "jdk";
}
@Configuration
public class ProxyConfiguration implements ImportAware {
private AnnotationAttributes info;
@Bean
public ProxyMode proxyMode() {
ProxyMode proxyMode = new ProxyMode();
proxyMode.setMode(info.getString("mode"));
return proxyMode;
}
@Override
public void setImportMetadata(AnnotationMetadata importMetadata) {
this.info = AnnotationAttributes.fromMap(
importMetadata.getAnnotationAttributes(EnableProxy.class.getName(), false));
}
}
@EnableProxy
public class ImportAwareDemo {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ImportAwareDemo.class);
ProxyMode bean = context.getBean(ProxyMode.class);
// ProxyMode(mode=jdk)
System.out.println(bean);
context.close();
}
}
ImportAware是如何获取到注解元信息的呢?
主要就是在ConfigurationClassPostProcessor中注入了一个ImportAwareBeanPostProcessor,在Bean的生命周期中将属性设置进去