Java 如何在spring中创建已代理类的动态代理

Java 如何在spring中创建已代理类的动态代理,java,proxy,spring-cloud,feign,resilience4j,Java,Proxy,Spring Cloud,Feign,Resilience4j,我对spring/spring boot比较陌生 目前,我正在使用一个SpringBootREST应用程序,它提供了一个假客户端,可以包含在其他项目中。现在,我想让那些假客户被断路器包裹起来 我提出的最佳解决方案是动态创建一个代理,其中包括断路器实现,该实现本身调用创建的假客户端 因此,假设我有以下描述RestController的接口: @RequestMapping(“/”) 公共接口MyWebService{ @GetMapping(“名称”) 公共字符串getName(); } 现在,

我对spring/spring boot比较陌生

目前,我正在使用一个SpringBootREST应用程序,它提供了一个假客户端,可以包含在其他项目中。现在,我想让那些假客户被断路器包裹起来

我提出的最佳解决方案是动态创建一个代理,其中包括断路器实现,该实现本身调用创建的假客户端

因此,假设我有以下描述RestController的接口:

@RequestMapping(“/”)
公共接口MyWebService{
@GetMapping(“名称”)
公共字符串getName();
}
现在,我有了假客户端的接口:

@FeignClient(“应用程序”)
公共接口WebServiceClient扩展了WebService{
}
所以。。我的目标是实现我有另一个注释e。g
@WithCircuitBreaker
,然后我将对其进行扫描,并动态创建一个代理bean,该代理bean将被注入,而不是伪客户端bean

目前,我的代码如下所示:

@FeignClient(“应用程序”)
@带断路器
公共接口WebServiceClient扩展了WebService{
}
据我所知,我现在可以创建一个
@Configuration
类,它将如下所示:

@配置
带有CircuitBreaker配置的公共类实现Importware{
私有注释元数据注释元数据;
私有注释属性注释属性;
@凌驾
public void setImportMetadata(注释元数据importMetadata){
this.annotationMetadata=importMetadata;
Map annotatedClasses=importMetadata.getAnnotationAttributes(WithCircuitBreaker.class.getName());
this.annotationAttributes=annotationAttributes.fromMap(annotatedClass);
}
还需要导入什么来创建代理并将其注入?
}
现在我已经到了关键时刻,我不知道如何继续下去。如何动态创建执行以下操作的代理类:

公共类PorxyedWebService{
私有WebService假装客户端代理;
@自动连线
公共代理Web服务(Web服务假装客户端代理){
this.feignClientProxy=feignClientProxy;
}
公共字符串getName(){
...
....
返回这个.feignClientProxy.getName();
}
}

然后,一旦有人自动连接
WebService
界面,就返回此代理,而不是从Feign生成的代理。

我不是Spring用户,但我知道Spring不会递归创建代理,例如,如果多个Spring AOP方面应用于同一对象。相反,其他拦截器(或AOP语言中的通知)在同一代理上注册。我认为您希望使用该基础架构来实现您的目标。

我不是Spring用户,但我知道Spring不会递归创建代理,例如,如果将多个Spring AOP方面应用于同一对象。相反,其他拦截器(或AOP语言中的通知)在同一代理上注册。我认为您希望使用该基础架构来实现您的目标。

您可以使用resilience4j Spring Boot2 starter。 您可以在接口级别将
@CircuitBreaker
注释与
@FeignClient
注释相结合

然后,您可以按如下方式使用它:

@FeignClient(name = DUMMY_FEIGN_CLIENT_NAME)
@CircuitBreaker(name = DUMMY_FEIGN_CLIENT_NAME)
public interface DummyFeignClient {

    String DUMMY_FEIGN_CLIENT_NAME = "dummyFeignClient";

    @GetMapping(path = "/api/{param}")
    void doSomething(@PathVariable(name = "param") String param);
} 


您只需使用resilience4j Spring Boot2启动器即可。 您可以在接口级别将
@CircuitBreaker
注释与
@FeignClient
注释相结合

然后,您可以按如下方式使用它:

@FeignClient(name = DUMMY_FEIGN_CLIENT_NAME)
@CircuitBreaker(name = DUMMY_FEIGN_CLIENT_NAME)
public interface DummyFeignClient {

    String DUMMY_FEIGN_CLIENT_NAME = "dummyFeignClient";

    @GetMapping(path = "/api/{param}")
    void doSomething(@PathVariable(name = "param") String param);
}