自定义starter,使用的是Annotation和Import实现的,现在的问题是Annotation中的参数如何获取并使用呢?

罗树鹏 发布于 2018/08/29 09:14
阅读 138
收藏 0

自定义starter,使用的是Annotation和Import实现的,现在的问题是Annotation中的参数如何获取并使用呢?

加载中
0
nonnetta
nonnetta

想要获取参数需要创建一个BeanRegister对象,需实现ImportBeanDefinitionRegistrar接口的registerBeanDefinitions方法,从metadata中获取相应的属性。

具体可以参考EnableFeignClients的注解,以及具体的实现类FeignClientsRegistrar,使用FeignClientsRegistrar的方式如下。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients

获取相关属性的源码如下:

protected Set<String> getBasePackages(AnnotationMetadata importingClassMetadata) {
    Map<String, Object> attributes = importingClassMetadata
            .getAnnotationAttributes(EnableFeignClients.class.getCanonicalName());

    Set<String> basePackages = new HashSet<>();
    for (String pkg : (String[]) attributes.get("value")) {
        if (StringUtils.hasText(pkg)) {
            basePackages.add(pkg);
        }
    }
    for (String pkg : (String[]) attributes.get("basePackages")) {
        if (StringUtils.hasText(pkg)) {
            basePackages.add(pkg);
        }
    }
    for (Class<?> clazz : (Class[]) attributes.get("basePackageClasses")) {
        basePackages.add(ClassUtils.getPackageName(clazz));
    }

    if (basePackages.isEmpty()) {
        basePackages.add(
                ClassUtils.getPackageName(importingClassMetadata.getClassName()));
    }
    return basePackages;
}
0
罗树鹏
罗树鹏

引用来自“nonnetta”的评论

想要获取参数需要创建一个BeanRegister对象,需实现ImportBeanDefinitionRegistrar接口的registerBeanDefinitions方法,从metadata中获取相应的属性。

具体可以参考EnableFeignClients的注解,以及具体的实现类FeignClientsRegistrar,使用FeignClientsRegistrar的方式如下。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients

获取相关属性的源码如下:

protected Set<String> getBasePackages(AnnotationMetadata importingClassMetadata) {
    Map<String, Object> attributes = importingClassMetadata
            .getAnnotationAttributes(EnableFeignClients.class.getCanonicalName());

    Set<String> basePackages = new HashSet<>();
    for (String pkg : (String[]) attributes.get("value")) {
        if (StringUtils.hasText(pkg)) {
            basePackages.add(pkg);
        }
    }
    for (String pkg : (String[]) attributes.get("basePackages")) {
        if (StringUtils.hasText(pkg)) {
            basePackages.add(pkg);
        }
    }
    for (Class<?> clazz : (Class[]) attributes.get("basePackageClasses")) {
        basePackages.add(ClassUtils.getPackageName(clazz));
    }

    if (basePackages.isEmpty()) {
        basePackages.add(
                ClassUtils.getPackageName(importingClassMetadata.getClassName()));
    }
    return basePackages;
}

谢谢

返回顶部
顶部