整来整去有点像一个微型openFeign,虽然简陋了点,但在改善代码质量和提高代码复用、可靠性、功能定制方面有着不错的效果。
public abstract class RemotingBean<T> implements ResourceLoaderAware, FactoryBean<T> {private ResourceLoader resourceLoader;public abstract Object doInvoke(Remoting remoting, Method method, Object[] args);@Overridepublic T getObject() {ClassLoader classLoader = resourceLoader.getClassLoader();Class<?> objectType = getObjectType();Class<?>[] interfaceClass = new Class[]{objectType};return (T) Proxy.newProxyInstance(classLoader, interfaceClass, (proxy, method, args) -> {if ("toString".equals(method.getName())) {// 此处会影响调试时那个bean的名字return "proxy--" + objectType.getName();}// 只算理带注解的方法Remoting remoting = method.getAnnotation(Remoting.class);if (null == remoting) {return null;}return doInvoke(remoting, method, args);});}@Overridepublic void setResourceLoader(@NotNull ResourceLoader resourceLoader) {this.resourceLoader = resourceLoader;}@Overridepublic Class<?> getObjectType() {// 直接获取泛型,省去子类再做实现return ZYSpringUtils.findGenericClass(this.getClass());}
}
注解类
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@SuppressWarnings("unused")
public @interface Remoting {String value();// 下面是一些简易的冗余的处理结果集的要素,用于某些特殊方法调用等Class<?>[] returnClass() default {};boolean isCollectResult() default false;boolean isBaseResult() default false;boolean isVoidResult() default false;boolean isJsonModuleResult() default false;
}
示例:
public interface UserV41Service {@Remoting("/user/saveOpenUser")String insertUser(UserV41Po user);@Remoting("/user/editOpenUser")String editUser(UserV41Po user);@Remoting("/user/updatepassword")void editPassword(UserV41PasswordPo passwordPo);
}@Componen
public class UserV41ServiceBean extends RemotingBean<UserV41Service> {@Autowiredprivate FrameworkProperties frameworkProperties;@Overridepublic Object doInvoke(Remoting remoting, Method method, Object[] args) {String token = generateToken();if (null == token) {return null;}Map<String, String> headers = new HashMap<>();headers.put(HttpHeaders.AUTHORIZATION, token);String path = remoting.value();String host = frameworkProperties.getLibraryHost();String targetUrl = host + path;Map<String, Object> params = ZYBeanUtils.beanToMap(args[0]);String result = ZYHttpUtils.sendHttpPost(params, headers, targetUrl);// TODO xxxx}
}