微信支付分是微信最新推出的一个信用分值,简单的来说跟支付宝的芝麻信用分意义差别不大,那么微信支付分究竟有什么用能干啥呢,下面看看现在微信支付分在哪里哪些商家可以使用。
微信支付分是什么
微信支付分,就是微信平台基于微信支付这个大数据(也会综合其他平台数据,但基础数据以微信支付为主),对你个人的身份、消费、履约等行为特征算出的一个综合分值。
微信支付分有什么用介绍(哪些商家可用)
支付宝芝麻信用分有什么用,这个就有什么用,当然,也不排除微信还会拓展更多的支付场景。
当然了,因为这个支付分,是刚全面上线的,所以呢,有些操作还是不太友好,目前只能通过特定的消费场景开通、使用。
比如:目前仅支持两类场景,一个是免押金场景(现在有共享充电宝),一个是打车平台(高德地图、百度地图、掌上高铁、极速打车等)。
以“极速打车”小程序为例,微信支付分要在550分以上,才可以使用。
不过,小编相信,微信支付分作为腾讯信用分的升级,相信以后的用处,肯定会越来越多,越来越全面,比如扫码乘车、分期还信用卡、免押租借、商户付款等。
怎么提高微信支付分
微信支付分由三个方面构成,身份特征,支付行为、守约历史。
进行实名验证,可增加支付分。
支付行为,使用微信付款、进行理财等,可以增加支付分。
在平台进行租借服务,按时归还、认真守约的历史也可以增加支付分。
日前,有消费者向澎湃质量报告投诉平台(www.thepaper/consumersComplaint.jsp)反映,闲鱼上有卖家疑似以1元销售“洛丽塔”服饰做诱饵,引诱女性买家当面交易,暗示以发生性关系来换取商品。
澎湃新闻(www.thepaper)根据该消费者提供的信息,在阿里巴巴旗下的闲鱼App上以“洛丽塔”为关键词搜索,发现有卖家销售的“洛丽塔”裙子仅标价9.9元、1元甚至几毛钱的低价出售。
而这些卖家的商品销售页面有一个共同特点,均在商品描述中标示只支持在其所在地区“当面交易”。
前述消费者提供的截图显示,有卖家直接打出了“一pao一件”“一炮一件”等暗语。此前有媒体报道,除了闲鱼,转转等二手交易平台亦存在此类情况。
随后,澎湃新闻以买家身份与其中一位网名为“心一点”的卖家私聊,对方直接称衣服可以免费送,并说出“想你穿上这衣服陪陪我,我可以满足你很多”等露骨话语。
澎湃新闻随即将此情况向闲鱼方面进行了反馈。8月13日上午,闲鱼方面向澎湃新闻发来回复表示,针对此事,闲鱼已快速处理涉嫌违规的商品,同时也欢迎广大用户热心支持,主动举报。
截至发稿前,闲鱼、转转等二手交易平台上均已无法搜索到此类疑似涉黄“洛丽塔”服饰商品。
低价售卖“洛丽塔裙”疑引诱买家
8月11日,澎湃质量报告投诉平台收到消费者投诉,反映其在浏览闲鱼网站时,发现有卖家打着9.9元、1元甚至几毛钱低价出售“洛丽塔裙”幌子,引诱女性进行。
闲鱼上疑似涉黄“洛丽塔”服饰页面
根据该消费者提供的截图,一位网名为“a510162727”的卖家以0.99元销售“各种汉服,洛丽塔裙子”,并暗示“一炮一件、一pao一件,简单明了”,要求在“广州范围内”交易。
闲鱼上疑似涉黄“洛丽塔”服饰页面
这些卖家还在商品销售页面中配发了精美的洛丽塔服饰图片,商品描述带有“免费送”“全新”“仅支持当面交易”等字眼。卖家疑似均为男性,一旦买家询价,卖家便要先确认是不是同城交易,是不是本人要买裙子等问题,并询问年龄以确定买家是年轻女性。
11日下午,澎湃新闻以“洛丽塔”为关键词检索,在闲鱼上找到了多个以低价销售“洛丽塔裙”的卖家,但未发现前述含有内容的宣传语。
澎湃新闻以买家的身份联系上了一位名为“心一点”的卖家,其ID显示定位为广东省汕尾市。聊天一开始,卖家就开始反复询问“是不是买来自己穿的”,并多次向澎湃新闻发问:“你是自己穿的可爱的萝莉吗?”
当被问到为什么不要钱免费送裙子时,该卖家声称只是为了“认识可爱的萝莉”,随即又说出“想你穿上这衣服陪陪我,我可以满足你很多”等露骨话语。
澎湃新闻与其中一卖家聊天记录
洛丽塔(Lolita)服饰是源自欧洲国家的一种风格独特、可爱风格裙子,服饰售价动辄上千元一件。“洛丽塔”风格流入我国后,也出现了一批拥趸,他们形成的圈子称为“Lo圈”;这些拥趸中,大部分为年轻少女,她们自称为“萝娘”。
澎湃新闻发现,此前在闲鱼上用“一炮一件”作为关键词,已无法检索到相关“洛丽塔”服饰,但是打出“一炮”两字时,搜索提示中会出现“一炮一件”“一炮一件裙”“一炮一件衣服”等提示词。当使用“洛丽塔裙子免费送”搜索时,还可以搜到此类疑似涉黄交易商品。
据《现代快报》8月2日报道,除了闲鱼,在转转等二手也存在一些卖家以低价出售裙子,诱骗女生甚至是未成年人发生性关系的情况。
8月12日,澎湃新闻将该情况向闲鱼方面进行了反馈。13日上午,闲鱼回复澎湃新闻表示,闲鱼有一套严格的平台日常检查机制,包括机器排查和人工审核,一旦发现涉嫌违规的商品,将严格依照国家法律法规进行处理。此外,监控模型也在不断完善中,以求更精细地剔除不符合网络交易规范的物品。目前针对此事件,闲鱼已快速处理涉嫌违规的商品,同时也欢迎广大用户热心支持,主动举报,一起为净化大家共同的网络社区环境而尽份力。
截至发稿前,闲鱼上已搜索不到前述疑似涉黄“洛丽塔”服饰商品的售卖信息;用“洛丽塔裙一炮一件”“洛丽塔裙免费送”等关键词搜索,在“转转”等平台亦无法搜索出相关商品。
律师:平台对消费者有安全保障的义务
澎湃新闻注意到,一位曾遭遇卖家用低价售卖“洛丽塔”服饰进行言语骚扰的女孩小贝(化名),在闲鱼上挂出“一分钱出售洛丽塔裙”的信息,并在商品介绍处写出自己的遭遇,以提醒其他女孩注意,以免被欺骗。
小贝在商品介绍处写道,今年4月26日,她在闲鱼上看到超低价出售的裙子,出于好奇,她点进去和卖家“y时光又不在”聊了聊,结果卖家要求小贝“五一”假期过去陪他玩几天,并明确提出“上床”要求。小贝这才明白对方企图,连忙结束了对话。
澎湃新闻注意到,在小贝贴出的与卖家的对话截图中,卖家除了要小贝“陪”他几天,还声称自己是在校大学生,“可以加钱”,并向小贝发送了自己半裸上身的肌肉照片。
网友“machray7”也在闲鱼上挂出一元卖裙子的链接,贴上了数张疑似与不法卖家的微信对话截图,以提醒女孩子们不要上当。澎湃新闻尝试联系“machray7”网友,但未获对方回复。
律师丁金坤告诉澎湃新闻,行为人(卖家)在网站上以低价售卖“洛丽塔”衣服为幌子,诱骗女孩发生性关系,属于违法犯罪行为。其中,“一炮一件”等宣传用语,涉嫌违反《广告法》中禁止“含有、、、迷信、恐怖、暴力的内容”规定,应该立即下架,并进行行政处罚。
“如二手交易平台未尽管理义务,导致成为中介,也需要负相应的民事责任。”丁金坤标示,依据《网络安全法》规定,网络运营者应当加强对其用户发布的信息的管理,发现法律、行政法规禁止发布或者传输的信息的,应当立即停止传输该信息,采取消除等处置措施,防止信息扩散,保存有关记录,并向有关主管部门报告。
此外,在《电子商务法》中,对平台内经营者侵害消费者合法权益行为未采取必要措施,或者对平台内经营者未尽到资质资格审核义务,或者对消费者未尽到安全保障义务的,由市场监督管理部门责令限期改正,可以处五万元以上五十万元以下的罚款;情节严重的,责令停业整顿,并处五十万元以上二百万元以下的罚款。
微信支付分是微信最新推出的一个信用分值,简单的来说跟支付宝的芝麻信用分意义差别不大,那么微信支付分究竟有什么用能干啥呢,下面看看现在微信支付分在哪里哪些商家可以使用。
微信支付分是什么
微信支付分,就是微信平台基于微信支付这个大数据(也会综合其他平台数据,但基础数据以微信支付为主),对你个人的身份、消费、履约等行为特征算出的一个综合分值。
微信支付分有什么用介绍(哪些商家可用)
支付宝芝麻信用分有什么用,这个就有什么用,当然,也不排除微信还会拓展更多的支付场景。
当然了,因为这个支付分,是刚全面上线的,所以呢,有些操作还是不太友好,目前只能通过特定的消费场景开通、使用。
比如:目前仅支持两类场景,一个是免押金场景(现在有共享充电宝),一个是打车平台(高德地图、百度地图、掌上高铁、极速打车等)。
以“极速打车”小程序为例,微信支付分要在550分以上,才可以使用。
不过,小编相信,微信支付分作为腾讯信用分的升级,相信以后的用处,肯定会越来越多,越来越全面,比如扫码乘车、分期还信用卡、免押租借、商户付款等。
怎么提高微信支付分
微信支付分由三个方面构成,身份特征,支付行为、守约历史。
进行实名验证,可增加支付分。
支付行为,使用微信付款、进行理财等,可以增加支付分。
在平台进行租借服务,按时归还、认真守约的历史也可以增加支付分。
转转支付中心与多家第三方支付平台、金融机构存在合作,例如微信、支付宝、分期乐、合利宝、平安银行等。
在收单、打款、退款等业务上,大部分接口都需要通过HTTP协议与第三方进行交互。
目前业界上或转转内部都有封装好HttpUtil工具类提供使用,但开发人员在接入三方渠道时,不同渠道方提供的文档有所差异且内部研发人员变动等原因,实现时自然会存在一些问题:
缺少统一的设计流程,代码复杂臃肿、耦合度高开发人员水平参差不齐,不同人的设计风格千差万别抽象程度不够,复用性较低由此,支付中心研发了统一设计风格、注解式的HTTP客户端,建立一套面向“使用HTTP协议与三方渠道交互“的“设计规约”。
图1 转转APP收银台
2. 实践思路2.1 自定义注解目标:
通过自定义注解,将一些通用参数信息直接附加在接口上,达到接口即文档的效果。新增方法时,按文档接口内容,简单配置即可使用。接口代码变得简洁,减少样板代码。图2 注解式HTTP接口
2.2 动态代理增强接口方法目标:
通过动态代理,可以屏蔽这些复杂或存在差异的实现细节,让使用者面向纯接口编程。结合注解,代理类实现无侵入式的代码扩展。图3 代理类增强视图
2.3 将代理类Bean注入到Spring容器目标:
支持Spring IOC特性。保证代理类实现和普通接口实现的调用方式无差别,用户无感知。3. 实现整体流程:
在Spring启动初始化时,通过@Import({HTTPMethodScannerRegistrar.class})来驱动ImportBeanDefinitionRegistrar接口的实现类进行定制化Bean的注册。实现ImportBeanDefinitionRegistrar接口的registerBeanDefinitions方法,主要是获取带有@HTTPController注解的接口,使用这些接口的元数据的注解信息来构建HTTPControllerFactoryBean的Bean,然后注册进Spring容器中。从HTTPControllerFactoryBean中实际获取的Bean,是调用“实现FactoryBean接口的getObject()方法”获取的,该方法就是使用Proxy.newProxyInstance来实例化代理类,从而达到将目标接口的增强Bean注册到Spring容器中。图4 整体实现流程图
3.1 自定义注解HTTPController注解该注解属于运行时的TYPE注解,作用在一个类或接口上。
用途:标识该接口为某个三方渠道的HTTP网关接口,可以配置渠道基础信息、代理类等信息。
@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE})@Documentedpublic @interface HTTPController { // 三方渠道描述 String desc() default ""; // 三方渠道类型 ThirdPartEnum thirdPart(); // 请求Url String baseUrl() default ""; // 代理类 Class<?> invocationHandlerClass();}复制代码HTTPMethod注解
该注解属于运行时的METHOD注解,作用在一个方法上。
用途:标识该方法为三方渠道的某个特定的文档接口,可以配置接口路径、请求方式、重试次数等信息。
@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD})@Documentedpublic @interface HTTPMethod { // 请求路径 String url(); // Http请求方式 HTTPRequestType requestType() default HTTPRequestType.POST; // 重试次数 int retryCount() default 0; // GET、POST请求 enum HTTPRequestType { GET, POST }}复制代码使用示例
@HTTPController(desc = "微信支付" , thirdPart = ThirdPartEnum.WeiXinPay , baseUrl = "https://api.mch.weixin.qq" , invocationHandlerClass = WeiXinPayInvocationHandler.class)public interface WeiXinPayRequestGateway { // 个人用户注册接口 @HTTPMethod(url = "/ea/pCustomerReg.action", requestType = HTTPRequestType.POST, retryCount = 2) ThirdPartResponse<CustomerRegResponse> pCustomerReg(CustomerRegV2Request request); // 转账 @HTTPMethod(url = "/ea/transfer", requestType = HTTPRequestType.POST) ThirdPartResponse<TransferResponse> transfer(TransferRequest request); // 转账查询 @HTTPMethod(url = "/ea/transferQuery", requestType = HTTPRequestType.GET, retryCount = 2) ThirdPartResponse<TransferQueryResponse> transferQuery(TransferQueryRequest request);}复制代码3.2 动态代理增强接口方法
针对“微信支付”渠道,实现HTTP请求的动态代理(使用JDK动态代理)。
以下代码是核心流程代码,细节有所缩减,主要是一些边界判断、特殊处理等,不影响理解。
@Slf4jpublic class WeiXinPayInvocationHandler implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) { WeiXinPayBaseResponse response = null; try { // Http处理逻辑 response = realLogic(method, args[0]); } catch (Exception ex) { // 请求失败处理 return ThirdPartResponse.of(ThirdPartTransferResultEnum.UNCLEAR_FAILURE); } // 请求结果返回 return ThirdPartResponse.of(response); } private WeiXinPayBaseResponse realLogic(Method method, Object args) { // 获取方法注解 HTTPMethod httpMethod = method.getAnnotation(HTTPMethod.class); // 重试参数是网络连接重试 HttpOptions httpOptions = httpOptionsBuild(httpMethod.retryCount()); // 根据url和方法参数构建请求体 HttpRequest httpRequest = httpRequestBuild(httpMethod.url(),(WeiXinPayBaseRequest)args); // 获取请求类型 HTTPMethod.HTTPRequestType httpRequestType = httpMethod.requestType(); // 执行请求 HttpResponse httpResponse = executeHttpRequest(httpOptions, httpRequest, httpRequestType); Type genericReturnType = method.getGenericReturnType(); // 获取返回值的泛型参数 if (genericReturnType instanceof ParameterizedType) { Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments(); genericReturnType = actualTypeArguments[0]; } // 验签+解密resData String decodedData = DecodeUtil.decode(httpResponse.getResult()); return GsonUtil.fromJson(decodedData, genericReturnType); } /** * 构建http 请求参数并且设置签名 * 签名方式 对 data使用signType签名类型进行签名,目前仅支持 SHA256。 */ private HttpRequest httpRequestBuild(String url, WeiXinPayBaseRequest args) { // Apollo配置 WeiXinPayConfig config = WeiXinPayConfig.getConfig(); HttpRequest httpRequest = new HttpRequest(); httpRequest.setUrl(config.getBaseUrl + url); // 加密 + 签名 String data = EncodeUtil.encode(JSON.toJSONString(args)); String sign = SignUtil.sign(data); WeiXinPayCommonRequest weiXinPayCommonRequest = WeiXinPayCommonRequest.builder() .data(data) .sign(sign).build(); httpRequest.setParam(weiXinPayCommonRequest); return httpRequest; } /** * HttpClientUtil工具的httpGet、httpPost是平时大家常见的封装方法,不再赘述。 **/ private HttpResponse executeHttpRequest(HttpOptions httpOptions, HttpRequest httpRequest, HTTPMethod.HTTPRequestType httpRequestType) { HttpResponse httpResponse = null; try { switch (httpRequestType) { case GET: httpResponse = HttpClientUtil.httpGet(httpRequest, httpOptions); break; case POST: httpResponse = HttpClientUtil.httpPost(httpRequest.getUrl(), JSONObject.toJSONString(httpRequest.getParam()), httpOptions); break; default: throw new ThirdPartHttpException(ThirdPartEnum.WeiXinPay, ReturnCodeEnum.HTTP_REQUEST_METHOD_NOT_MATCH); } } catch (Exception e) { throw new RuntimeException("[WeiXinPayInvocationHandler http execute error ]", e); } return httpResponse; }}复制代码3.3 将代理类Bean注入到Spring容器
我们是基于FactoryBean和ImportBeanDefinitionRegistrar的方案将代理类Bean动态注入到Spring容器中。
认识FactoryBean这里通过一个简单的Demo,来说明使用FactoryBean的效果。
public interface Person { public void sayHello ();} @Setterpublic class XiaoMing implements FactoryBean<Object>, Person { private String regards; @Override public Object getObject() { return new ZhangSan(regards); } @Override public Class<?> getObjectType() { return ZhangSan.class; } @Override public void sayHello() { System.out.println("Greetings from XiaoMing: " + regards); }} public class ZhangSan implements Person { String regards; public ZhangSan(String regards) { this.regards = regards; } @Override public void sayHello() { System.out.println("Greetings from ZhangSan: " + regards); }} public class BeanDefinitionBuilderExample { public static void main (String[] args) { // 定义Bean AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(XiaoMing.class).getBeanDefinition(); beanDefinition.getPropertyValues().add("regards", "Hello World"); // 注册Bean DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); beanFactory.registerBeanDefinition("person", beanDefinition); // 获取Bean Person bean = (Person) beanFactory.getBean("person"); bean.sayHello(); }}复制代码
图5 Demo运行结果
上述例子:将实现FactoryBean的XiaoMing类,将其注入到Spring容器中。获取Bean时,调用sayHello方法,输出的是“Greetings from ZhangSan : Hello World”。
结论:根据“person”从BeanFactory中获取的Bean,实际上是FactoryBean的getObeject()返回的对象。
FactoryBean存在意义和使用场景FactoryBean是一个能生产或修饰对象生成的Bean,类似于设计模式中的工厂模式和装饰器模式。
存在意义
通过实现FactoryBean这个接口,用户可以自定义实例化Bean的逻辑,并且在创建时才去实现具体的功能。使用场景
Spring中FactoryBean最典型的应用就是创建AOP代理对象-ProxyFactoryBean。MyBatis中使用MapperFactoryBean来创建Mapper,最终得到是由Proxy.newProxyInstance创建的代理实例。HTTPControllerFactoryBean实现@Setter@Slf4jpublic class HTTPControllerFactoryBean implements FactoryBean<Object> { // 目标接口 private Class<?> targetClass; private ThirdPartEnum thirdPart; private String baseUrl; private Class<InvocationHandler> invocationHandlerClass; // 返回工厂生产的对象,这是 Spring 容器将使用的对象 @Override public Object getObject() { InvocationHandler invocationHandler; try { invocationHandler = invocationHandlerClass.newInstance(); } catch (Exception e) { throw new RuntimeException("[HTTPControllerFactoryBean-invocationHandlerClass-newInstance] error", e); } // 通过Proxy将代理类对象转成目标接口 return Proxy.newProxyInstance(HTTPControllerFactoryBean.class.getClassLoader() , new Class[]{targetClass} , invocationHandler); } // 返回此FactoryBean生成的对象类型 @Override public Class<?> getObjectType() { return targetClass; } // 表示此FactoryBean生成的对象是否为单例 @Override public boolean isSingleton() { return true; }}复制代码HTTPMethodScannerRegistrar实现
在ImportBeanDefinitionRegistrar接口中,有一个registerBeanDefinitions()方法,通过该方法可以向Spring容器中注册Bean实例。
实现该接口的类都会被ConfigurationClassPostProcessor后置处理器,因此在ImportBeanDefinitionRegistrar中注册的Bean可以比依赖它的Bean更早初始化(有兴趣可自行查阅资料)。
public class HTTPMethodScannerRegistrar implements ImportBeanDefinitionRegistrar { /** * 注入对象到Spring * @param annotationMetadata 注解元数据 * @param beanDefinitionRegistry 它定义了关于 BeanDefinition 的注册、移除、查询等一系列的操作 */ @Override public void registerBeanDefinitions(AnnotationMetadata annotationMetadata , BeanDefinitionRegistry beanDefinitionRegistry) { // ClassPathScanningCandidateComponentProvider是Spring提供的工具,可以按自定义的类型,查找classpath下符合要求的class文件。 ClassPathScanningCandidateComponentProvider classScanner = new ClassPathScanningCandidateComponentProvider(false) { @Override protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) { // 只扫描接口,且带有@HTTPController注解 if (beanDefinition.getMetadata().isInterface()) { try { return beanDefinition.getMetadata().hasAnnotatedMethods(HTTPController.class.getName()); } catch (Exception ex) { throw new RuntimeException("[isCandidateComponent error]", ex); } } return false; } }; // 指定扫描的包名,在该包路径下带有@HTTPController注解的接口 Set<BeanDefinition> beanDefinitionSet = classScanner.findCandidateComponents("com.zhuanzhuan.zzpaycore.gateway"); for (BeanDefinition beanDefinition : beanDefinitionSet) { if (beanDefinition instanceof AnnotatedBeanDefinition) { // 注入处理 registerBeanDefinition((AnnotatedBeanDefinition) beanDefinition, beanDefinitionRegistry); } } } // 将扫描到的接口放置DefaultListableBeanFactory的beanDefinitionMap中 private void registerBeanDefinition(AnnotatedBeanDefinition beanDefinition , BeanDefinitionRegistry registry) { // 接口元数据 AnnotationMetadata metadata = beanDefinition.getMetadata(); // 接口全类名,例如:com.zhuanzhuan.zzpayaccount.gateway.WeiXinPayRequestGateway String className = metadata.getClassName(); // 生成一个HTTPControllerFactoryBean的BeanDefinition AbstractBeanDefinition factoryBeanBeanDefinition = BeanDefinitionBuilder.genericBeanDefinition(HTTPControllerFactoryBean.class).getBeanDefinition(); AnnotationAttributes annotationAttributes = AnnotationAttributes .fromMap(metadata.getAnnotationAttributes(HTTPController.class.getName())); // requiredType: javang.Class,convertedValue: "com.zhuanzhuan.zzpayaccount.gateway.WeiXinPayRequestGateway" // FactoryBean的targetClass是Class<?>类型,但这里可以用“类全路径”字符串表示, // 是因为Spring在初始化bean的时候可以根据setTargetClass方法的参数来判断类型,进而将“类全路径”字符串转为Class<?>类型 factoryBeanBeanDefinition.getPropertyValues().add("targetClass", className); factoryBeanBeanDefinition.getPropertyValues().add("baseUrl", annotationAttributes.getString("baseUrl")); factoryBeanBeanDefinition.getPropertyValues().add("thirdPart", annotationAttributes.get("thirdPart")); factoryBeanBeanDefinition.getPropertyValues().add("invocationHandlerClass", annotationAttributes.get("invocationHandlerClass")); // className作为beanName,可以自定义前后缀,如className + "$ByScanner" registry.registerBeanDefinition(className, factoryBeanBeanDefinition); }}复制代码Spring初始化
这里给出的是在SpringBoot启动程序上加上@Impot注解,来驱动HTTPMethodScannerRegistrar的流程逻辑。
转转有自研的SCF框架,初始化工作是自定义一个Init类,然后把该Init类路径写在scfit配置项上。
// 使用@Import注解,配置实现ImportBeanDefinitionRegistrar的类,可以高度配置化加载Bean@Import({HTTPMethodScannerRegistrar.class})@SpringBootApplicationpublic class DemoApplication { public static void main(String[] args) { SpringApplication(DemoApplication.class, args); }}复制代码4. 总结
以上就是注解式HTTP客户端的实现过程,总体思路简单清晰,大致就是“注解+动态代理+Spring的Bean后置处理器”一套公式,可谓常用的轮子式代码。
可以通过本例,延伸一些知识点:
自定义注解、注解处理器、Spring注解驱动开发JDK动态代理、Cglib动态代理FactoryBean和BeanFactory区别、Spring Bean的生命周期和后置处理器研发人员可以通过学习和实践这类“轮子式”代码,举一反三,提高自己的编程水平。