当前位置: 首页 > 知识库问答 >
问题:

为接口创建Bean

蓝慈
2023-03-14

我试图创建像@repository这样的系统。

@Client(uri = "http://example.com", username = "httpBasicUsername", password = "httpBasicPassword")
public interface RequestRepository {

     @Request(method = Method.POST, uri = "/mono")
     Mono<Response> ex1(Object body);

     @Request(method = Method.POST, uri = "/flux")
     Flux<Response> ex2(Object body);
}
@Bean
public RequestRepository requestRepository(WebClient.Builder builder) {
    return (RequestRepository) Proxy.newProxyInstance(
            RequestRepository.class.getClassLoader(),
            new Class[]{RequestRepository.class},
            new MyDynamicInvocationHandler(builder)
    );
}

共有1个答案

赵英资
2023-03-14

我已经解决了创建自定义界面扫描器。

欲了解更多详情:https://stackoverflow.com/a/43651431/6841566

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import({InterfaceScanner.class})
public @interface InterfaceScan {
    String[] value() default {};
}

public class InterfaceScanner implements ImportBeanDefinitionRegistrar, EnvironmentAware {
    private Environment environment;

    @Override
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }

    @Override
    public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
        Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes(InterfaceScan.class.getCanonicalName());
        if (annotationAttributes != null) {
            String[] basePackages = (String[]) annotationAttributes.get("value");
            if (basePackages.length == 0)
                basePackages = new String[]{((StandardAnnotationMetadata) metadata)
                        .getIntrospectedClass().getPackage().getName()};

            ClassPathScanningCandidateComponentProvider provider =
                    new ClassPathScanningCandidateComponentProvider(false, environment) {
                        @Override
                        protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
                            AnnotationMetadata meta = beanDefinition.getMetadata();
                            return meta.isIndependent() && meta.isInterface();
                        }
                    };
            provider.addIncludeFilter(new AnnotationTypeFilter(Client.class));
            for (String basePackage : basePackages)
                for (BeanDefinition beanDefinition : provider.findCandidateComponents(basePackage))
                    registry.registerBeanDefinition(
                            generateName(beanDefinition.getBeanClassName()),
                            getProxyBeanDefinition(beanDefinition.getBeanClassName()));
        }
    }
}

@InterfaceScan
@SpringBootApplication
public class ExampleApplication {
    ...
}
 类似资料:
  • 我尝试了很多事情 be.fgov.minfin.virtualprinter.model.StatusMap中的字段statusDescriptionDao需要一个类型为

  • 主要内容:打开新建Java接口向导,新建Java接口,查看新建的Java接口打开新建Java接口向导 新建 Java 接口向导可用于创建新的 Java 接口。有很多方法可以打开这个向导 : 单击“File”菜单并选择“New”→“Interface”。 右键单击包资源管理器并选择New> Interface。 单击工具栏中的类下拉按钮 ( ) 并选择接口 ( )。 在打开 New Java Interface 向导之前,如果可能,请选择要在其中创建接口的包,以便向导可以自

  • 打开新建 Java 接口向导 新建 Java 接口向导可以创建新的 Java 接口。打开向导的方式有: 点击 File 菜单并选择 New > Interface 在 Package Explorer 窗口中右击鼠标并选择 New > Interface 在工具条上的下拉框按钮中 () 选择 () 在打开创建 Java 接口向导前,最好选择好Java接口所属的包名,这样在创建 Java 接口时包名

  • 把大象装进冰箱分几步?三步:把冰箱门打开,把大象装进去,关门,搞定~ 新建接口分几步?也是三步: 获取权限 找到一个项目 新建接口 搞定~ 获取权限 新用户登录拥有 个人空间 分组下的全部权限,个人空间分组仅自己可见,因此可以在这里任意试用 YApi 的功能。 除此以外没有任何项目或分组的权限,只能浏览已存在分组下面的公开项目。 如果找不到想找的项目,可能是尚未成为项目成员,此时应联系 项目组长

  • 打开“新建Java接口向导” New Java Interface向导可用于创建新的Java接口。 有很多方法可以打开这个向导 - 单击“文件”菜单,然后选择“新建”→“界面”。 右键单击包浏览器并选择“新建”>“界面”。 单击class下拉按钮( )在工具栏中选择界面( )。 在启动New Java Interface向导之前,如果可能,请选择要在其中创建接口的程序包,以便向导可以自动为您填写程