0
点赞
收藏
分享

微信扫一扫

搞定Spring:ImportAware接口有啥作用?(ImportAwareBeanPostProcessor)

code_balance 2022-08-04 阅读 240


搞定Spring:ImportAware接口有啥作用?(ImportAwareBeanPostProcessor)_ide

介绍

在《搞定Spring:Enable**注解是如何实现的?》介绍了一下@Import注解的使用,和@Import相关的还有一个ImportAware接口

@Import注解注入Bean的方式有如下三种

  1. 基于Configuration Class
  2. 基于ImportSelector接口
  3. 基于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的生命周期中将属性设置进去



举报

相关推荐

0 条评论