Skip to content

Commit 46a9f65

Browse files
committed
refactor(springboot openfeign): Use BeanPostProcessor to modify the original Targeter beans instead of override them.
Signed-off-by: lony2003 <zhangke200377@outlook.com>
1 parent fd89e6f commit 46a9f65

File tree

3 files changed

+46
-14
lines changed

3 files changed

+46
-14
lines changed

dapr-spring/dapr-spring-openfeign/src/main/java/io/dapr/spring/openfeign/autoconfigure/DaprFeignClientAutoConfiguration.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,23 @@
1515

1616
import io.dapr.client.DaprClient;
1717
import io.dapr.feign.DaprInvokeFeignClient;
18-
import io.dapr.spring.openfeign.targeter.DaprClientTargeter;
18+
import io.dapr.spring.openfeign.targeter.DaprClientTargeterBeanPostProcessor;
1919
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2020
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2121
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2222
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2323
import org.springframework.cloud.openfeign.FeignAutoConfiguration;
24-
import org.springframework.cloud.openfeign.Targeter;
2524
import org.springframework.context.annotation.Bean;
2625
import org.springframework.context.annotation.Configuration;
26+
import org.springframework.context.annotation.Import;
2727

2828
@Configuration(proxyBeanMethods = false)
2929
@EnableConfigurationProperties(DaprFeignClientProperties.class)
3030
@ConditionalOnProperty(name = "dapr.feign.enabled", matchIfMissing = true)
3131
@ConditionalOnClass(FeignAutoConfiguration.class)
32+
@Import(DaprClientTargeterBeanPostProcessor.class)
3233
public class DaprFeignClientAutoConfiguration {
3334

34-
@Bean
35-
public Targeter targeter(DaprInvokeFeignClient daprInvokeFeignClient) {
36-
return new DaprClientTargeter(daprInvokeFeignClient);
37-
}
38-
3935
@SuppressWarnings("checkstyle:MissingJavadocMethod")
4036
@Bean
4137
@ConditionalOnMissingBean

dapr-spring/dapr-spring-openfeign/src/main/java/io/dapr/spring/openfeign/targeter/DaprClientTargeter.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,28 @@
2727
public class DaprClientTargeter implements Targeter {
2828

2929
private final DaprInvokeFeignClient daprInvokeFeignClient;
30+
private final Targeter targeter;
3031

31-
public DaprClientTargeter(DaprInvokeFeignClient daprInvokeFeignClient) {
32+
public DaprClientTargeter(DaprInvokeFeignClient daprInvokeFeignClient, Targeter targeter) {
3233
this.daprInvokeFeignClient = daprInvokeFeignClient;
34+
this.targeter = targeter;
3335
}
3436

3537
@Override
3638
public <T> T target(FeignClientFactoryBean factory, Feign.Builder feign, FeignClientFactory context,
3739
Target.HardCodedTarget<T> target) {
40+
Class<T> classOfT = target.type();
41+
UseDaprClient useDaprClient = classOfT.getAnnotation(UseDaprClient.class);
42+
43+
if (useDaprClient == null) {
44+
return targeter.target(
45+
factory,
46+
feign,
47+
context,
48+
target
49+
);
50+
}
51+
3852
Class<Feign.Builder> builderClass = Feign.Builder.class;
3953

4054
Client defaultClient = null;
@@ -49,12 +63,7 @@ public <T> T target(FeignClientFactoryBean factory, Feign.Builder feign, FeignCl
4963
throw new RuntimeException(e);
5064
}
5165

52-
Class<T> classOfT = target.type();
53-
UseDaprClient useDaprClient = classOfT.getAnnotation(UseDaprClient.class);
54-
55-
if (useDaprClient != null) {
56-
feign.client(daprInvokeFeignClient);
57-
}
66+
feign.client(daprInvokeFeignClient);
5867

5968
T targetInstance = feign.target(target);
6069

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package io.dapr.spring.openfeign.targeter;
2+
3+
import io.dapr.feign.DaprInvokeFeignClient;
4+
import org.springframework.beans.BeansException;
5+
import org.springframework.beans.factory.config.BeanPostProcessor;
6+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
7+
import org.springframework.cloud.openfeign.Targeter;
8+
import org.springframework.stereotype.Component;
9+
10+
@Component
11+
@ConditionalOnBean(Targeter.class)
12+
public class DaprClientTargeterBeanPostProcessor implements BeanPostProcessor {
13+
14+
private final DaprInvokeFeignClient daprInvokeFeignClient;
15+
16+
public DaprClientTargeterBeanPostProcessor(DaprInvokeFeignClient daprInvokeFeignClient) {
17+
this.daprInvokeFeignClient = daprInvokeFeignClient;
18+
}
19+
20+
@Override
21+
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
22+
if (bean instanceof Targeter) {
23+
return new DaprClientTargeter(daprInvokeFeignClient, (Targeter) bean);
24+
}
25+
return bean;
26+
}
27+
}

0 commit comments

Comments
 (0)