diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/configuration/RestClientProperties.java b/rest-proxy-core/src/main/java/group/flyfish/rest/configuration/RestClientProperties.java index 919252d..a163bb6 100644 --- a/rest-proxy-core/src/main/java/group/flyfish/rest/configuration/RestClientProperties.java +++ b/rest-proxy-core/src/main/java/group/flyfish/rest/configuration/RestClientProperties.java @@ -1,15 +1,21 @@ package group.flyfish.rest.configuration; +import group.flyfish.rest.configuration.configure.PropertiesConfigurable; +import group.flyfish.rest.configuration.modifier.RestPropertiesModifier; import group.flyfish.rest.core.auth.RestAuthProvider; -import group.flyfish.rest.core.factory.PropertiesConfigurator; +import group.flyfish.rest.registry.proxy.RestInvokers; import group.flyfish.rest.utils.DataUtils; +import lombok.AccessLevel; import lombok.Data; +import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import java.time.Duration; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -47,6 +53,20 @@ public class RestClientProperties implements InitializingBean { */ private RestAuthProvider authProvider; + /** + * 修改器们 + */ + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private List modifiers; + + /** + * 配置感知项 + */ + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private List configures; + /** * 获取字典url * @@ -65,8 +85,24 @@ public class RestClientProperties implements InitializingBean { this.authProvider = provider; } + @Autowired(required = false) + public void setModifiers(List modifiers) { + this.modifiers = modifiers; + } + + @Autowired(required = false) + public void setConfigures(List configures) { + this.configures = configures; + } + @Override public void afterPropertiesSet() { - PropertiesConfigurator.shared().configure(this); + if (DataUtils.isNotEmpty(modifiers)) { + modifiers.forEach(modifier -> modifier.modify(this)); + } + if (DataUtils.isNotEmpty(configures)) { + configures.forEach(item -> item.configure(this)); + } + RestInvokers.forEach(invoker -> invoker.configure(this)); } } diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/configuration/configure/PropertiesConfigurable.java b/rest-proxy-core/src/main/java/group/flyfish/rest/configuration/configure/PropertiesConfigurable.java new file mode 100644 index 0000000..58986ef --- /dev/null +++ b/rest-proxy-core/src/main/java/group/flyfish/rest/configuration/configure/PropertiesConfigurable.java @@ -0,0 +1,18 @@ +package group.flyfish.rest.configuration.configure; + +import group.flyfish.rest.configuration.RestClientProperties; + +/** + * 属性感知 + * + * @author wangyu + */ +public interface PropertiesConfigurable { + + /** + * 配置属性,完成初始化 + * + * @param properties 属性 + */ + void configure(RestClientProperties properties); +} diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/configuration/modifier/RestPropertiesModifier.java b/rest-proxy-core/src/main/java/group/flyfish/rest/configuration/modifier/RestPropertiesModifier.java new file mode 100644 index 0000000..ccc90f7 --- /dev/null +++ b/rest-proxy-core/src/main/java/group/flyfish/rest/configuration/modifier/RestPropertiesModifier.java @@ -0,0 +1,18 @@ +package group.flyfish.rest.configuration.modifier; + +import group.flyfish.rest.configuration.RestClientProperties; + +/** + * rest属性修改器 + * + * @author wangyu + */ +public interface RestPropertiesModifier { + + /** + * 修改属性,发生在afterPropertiesSet之前 + * + * @param properties 属性 + */ + void modify(RestClientProperties properties); +} diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/core/factory/DefaultHttpClientProvider.java b/rest-proxy-core/src/main/java/group/flyfish/rest/core/factory/DefaultHttpClientProvider.java index 6e0a5e7..4ed6d1c 100644 --- a/rest-proxy-core/src/main/java/group/flyfish/rest/core/factory/DefaultHttpClientProvider.java +++ b/rest-proxy-core/src/main/java/group/flyfish/rest/core/factory/DefaultHttpClientProvider.java @@ -1,6 +1,7 @@ package group.flyfish.rest.core.factory; import group.flyfish.rest.configuration.RestClientProperties; +import group.flyfish.rest.configuration.configure.PropertiesConfigurable; import org.apache.http.impl.client.CloseableHttpClient; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; @@ -11,7 +12,7 @@ import org.springframework.beans.factory.BeanFactoryAware; * * @author wangyu */ -public class DefaultHttpClientProvider extends PropertiesConfigAdaptor implements HttpClientProvider, BeanFactoryAware { +public class DefaultHttpClientProvider implements HttpClientProvider, BeanFactoryAware, PropertiesConfigurable { private CloseableHttpClient client; diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/core/factory/HttpClientFactoryBean.java b/rest-proxy-core/src/main/java/group/flyfish/rest/core/factory/HttpClientFactoryBean.java index ee19b19..179d708 100644 --- a/rest-proxy-core/src/main/java/group/flyfish/rest/core/factory/HttpClientFactoryBean.java +++ b/rest-proxy-core/src/main/java/group/flyfish/rest/core/factory/HttpClientFactoryBean.java @@ -1,6 +1,7 @@ package group.flyfish.rest.core.factory; import group.flyfish.rest.configuration.RestClientProperties; +import group.flyfish.rest.configuration.configure.PropertiesConfigurable; import group.flyfish.rest.utils.DataUtils; import lombok.extern.slf4j.Slf4j; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; @@ -21,7 +22,7 @@ import java.util.concurrent.locks.ReentrantLock; * @author wangyu */ @Slf4j -public final class HttpClientFactoryBean extends PropertiesConfigAdaptor implements FactoryBean { +public final class HttpClientFactoryBean implements FactoryBean, PropertiesConfigurable { // 使用非公平锁 private final ReentrantLock lock = new ReentrantLock(); diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/core/factory/PropertiesConfigAdaptor.java b/rest-proxy-core/src/main/java/group/flyfish/rest/core/factory/PropertiesConfigAdaptor.java deleted file mode 100644 index 8e0a6b6..0000000 --- a/rest-proxy-core/src/main/java/group/flyfish/rest/core/factory/PropertiesConfigAdaptor.java +++ /dev/null @@ -1,13 +0,0 @@ -package group.flyfish.rest.core.factory; - -/** - * 属性配置适配器 - * - * @author wangyu - */ -public class PropertiesConfigAdaptor implements PropertiesConfigurable { - - protected PropertiesConfigAdaptor() { - PropertiesConfigurator.prepare(this); - } -} diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/core/factory/PropertiesConfigurable.java b/rest-proxy-core/src/main/java/group/flyfish/rest/core/factory/PropertiesConfigurable.java deleted file mode 100644 index 4abfca8..0000000 --- a/rest-proxy-core/src/main/java/group/flyfish/rest/core/factory/PropertiesConfigurable.java +++ /dev/null @@ -1,27 +0,0 @@ -package group.flyfish.rest.core.factory; - -import group.flyfish.rest.configuration.RestClientProperties; - -/** - * 属性感知 - * - * @author wangyu - */ -public interface PropertiesConfigurable { - - /** - * 配置属性,完成初始化 - * - * @param properties 属性 - */ - default void configure(RestClientProperties properties) { - // 默认什么也不做 - } - - /** - * 初始化完成后置动作 - */ - default void afterConfigured(RestClientProperties properties) { - // 默认什么也不做 - } -} diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/core/factory/PropertiesConfigurator.java b/rest-proxy-core/src/main/java/group/flyfish/rest/core/factory/PropertiesConfigurator.java deleted file mode 100644 index 5cceacc..0000000 --- a/rest-proxy-core/src/main/java/group/flyfish/rest/core/factory/PropertiesConfigurator.java +++ /dev/null @@ -1,55 +0,0 @@ -package group.flyfish.rest.core.factory; - -import group.flyfish.rest.configuration.RestClientProperties; - -import java.util.ArrayList; -import java.util.List; - -/** - * 属性配置器 - * 解耦bean依赖,解决属性注入失效的问题 - * - * @author wangyu - */ -public class PropertiesConfigurator implements PropertiesConfigurable { - - private static final PropertiesConfigurator INSTANCE = new PropertiesConfigurator(); - - private final List list = new ArrayList<>(); - - private RestClientProperties properties; - - /** - * 配置属性,完成初始化 - * - * @param properties 属性 - */ - @Override - public void configure(RestClientProperties properties) { - this.properties = properties; - list.forEach(item -> item.configure(properties)); - list.forEach(item -> item.afterConfigured(properties)); - list.clear(); - } - - public void configure(PropertiesConfigurable configurable) { - if (null != properties) { - configurable.configure(properties); - } else { - list.add(configurable); - } - } - - /** - * 预配置 - * - * @param configurable 可配置实例 - */ - public static void prepare(PropertiesConfigurable configurable) { - INSTANCE.configure(configurable); - } - - public static PropertiesConfigurator shared() { - return INSTANCE; - } -} diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/registry/RestApiRegistry.java b/rest-proxy-core/src/main/java/group/flyfish/rest/registry/RestApiRegistry.java index d43e7fa..2aa6ef9 100644 --- a/rest-proxy-core/src/main/java/group/flyfish/rest/registry/RestApiRegistry.java +++ b/rest-proxy-core/src/main/java/group/flyfish/rest/registry/RestApiRegistry.java @@ -88,8 +88,7 @@ public class RestApiRegistry implements BeanDefinitionRegistryPostProcessor, Bea * @return bean定义 */ private BeanDefinition generate(Class clazz) { - return BeanDefinitionBuilder.genericBeanDefinition(clazz, - () -> DataUtils.cast(RestProxyInvoker.produce(clazz, this))) + return BeanDefinitionBuilder.genericBeanDefinition(clazz, () -> RestProxyInvoker.produce(clazz, this)) .setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE).getRawBeanDefinition(); } diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/registry/proxy/RestInvokers.java b/rest-proxy-core/src/main/java/group/flyfish/rest/registry/proxy/RestInvokers.java new file mode 100644 index 0000000..3a1cb00 --- /dev/null +++ b/rest-proxy-core/src/main/java/group/flyfish/rest/registry/proxy/RestInvokers.java @@ -0,0 +1,23 @@ +package group.flyfish.rest.registry.proxy; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +/** + * rest执行器实例集合 + * + * @author wangyu + */ +public class RestInvokers { + + private static final List invokers = new ArrayList<>(); + + public static void add(RestProxyInvoker invoker) { + invokers.add(invoker); + } + + public static void forEach(Consumer handler) { + invokers.forEach(handler); + } +} diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/registry/proxy/RestProxyInvoker.java b/rest-proxy-core/src/main/java/group/flyfish/rest/registry/proxy/RestProxyInvoker.java index e2fd412..01ebb09 100644 --- a/rest-proxy-core/src/main/java/group/flyfish/rest/registry/proxy/RestProxyInvoker.java +++ b/rest-proxy-core/src/main/java/group/flyfish/rest/registry/proxy/RestProxyInvoker.java @@ -5,10 +5,10 @@ import group.flyfish.rest.annotation.AutoMapping; import group.flyfish.rest.annotation.RestApi; import group.flyfish.rest.annotation.RestService; import group.flyfish.rest.configuration.RestClientProperties; +import group.flyfish.rest.configuration.configure.PropertiesConfigurable; import group.flyfish.rest.core.auth.RestAuthProvider; import group.flyfish.rest.core.client.RestClient; import group.flyfish.rest.core.client.RestClientBuilder; -import group.flyfish.rest.core.factory.PropertiesConfigAdaptor; import group.flyfish.rest.mapping.RestResultMapping; import group.flyfish.rest.registry.RestApiRegistry; import group.flyfish.rest.registry.proxy.support.ArgumentResolveContext; @@ -32,7 +32,6 @@ import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.lang.reflect.Type; import java.util.Map; -import java.util.Optional; import java.util.stream.Stream; /** @@ -41,10 +40,10 @@ import java.util.stream.Stream; * @author wangyu */ @Slf4j -public class RestProxyInvoker extends PropertiesConfigAdaptor implements InvocationHandler { +public class RestProxyInvoker implements InvocationHandler, PropertiesConfigurable { // 要代理的目标类 - private final Class targetType; + private final Class targetType; // 服务映射 private final RestService restService; // 配置属性 @@ -66,7 +65,7 @@ public class RestProxyInvoker extends PropertiesConfigAdaptor implements Invo * @param targetType 目标类型 * @param registry 注册器 */ - private RestProxyInvoker(Class targetType, RestApiRegistry registry) { + private RestProxyInvoker(Class targetType, RestApiRegistry registry) { this.targetType = targetType; this.registry = registry; // 注解的优先级高于全局基本路径 @@ -81,8 +80,9 @@ public class RestProxyInvoker extends PropertiesConfigAdaptor implements Invo * @param 泛型 * @return 结果 */ - public static T produce(Class target, RestApiRegistry registry) { - RestProxyInvoker invoker = new RestProxyInvoker<>(target, registry); + public static T produce(Class target, RestApiRegistry registry) { + RestProxyInvoker invoker = new RestProxyInvoker(target, registry); + RestInvokers.add(invoker); return DataUtils.cast(Proxy.newProxyInstance(target.getClassLoader(), new Class[]{target}, invoker)); } @@ -92,7 +92,7 @@ public class RestProxyInvoker extends PropertiesConfigAdaptor implements Invo * @param properties 属性 */ @Override - public void afterConfigured(RestClientProperties properties) { + public void configure(RestClientProperties properties) { this.properties = properties; this.config = RequestConfig.custom().setConnectTimeout((int) properties.getConnectionTimeout().toMillis()).setSocketTimeout(restService.timeout()).build(); this.baseUrl = this.findBaseUrl(); @@ -243,13 +243,13 @@ public class RestProxyInvoker extends PropertiesConfigAdaptor implements Invo url = restApi.url(); } else { // 构建基础url,优先级从小到大依次找。同时尝试取字典值 - Optional baseUrl = Stream.of(restApi.baseUrl(), this.baseUrl).filter(DataUtils::isNotBlank).findFirst().map(found -> found.startsWith("#") ? properties.getDictUrl(found.substring(1)) : found); - // 判定和赋值 - if (baseUrl.isPresent() && DataUtils.isNotBlank(restApi.uri())) { - url = baseUrl.get() + restApi.uri(); - } else { - throw new IllegalArgumentException("【Rest调用】未指定url或baseurl,无法调用远端服务器!"); - } + url = Stream.of(restApi.baseUrl(), this.baseUrl) + .filter(DataUtils::isNotBlank) + .findFirst() + // 判定和赋值 + .map(found -> found.startsWith("#") ? properties.getDictUrl(found.substring(1)) : found) + .map(base -> base + restApi.uri()) + .orElseThrow(() -> new IllegalArgumentException("【Rest调用】未指定url或baseurl,无法调用远端服务器!")); } // 尝试解析路径参数 return context.hasPathParams() ? UrlCompiler.compile(url, context.getPathParams()) : url;