- 浏览: 130783 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (80)
- 常见问题 (14)
- spring (10)
- HttpClient (2)
- 数据库 (4)
- Excel操作 (4)
- FtpClient (3)
- SpringMvc (2)
- Hessian (0)
- JasperReport (0)
- 其他 (5)
- js (4)
- css (4)
- jquery (0)
- Java (4)
- 反射 (1)
- CSV操作 (2)
- freemarker (3)
- hibernate (1)
- mongoDB (1)
- DB2 (2)
- 业务 (1)
- MAVEN (1)
- 权限控制 (1)
- 技术文档 (2)
- 生活琐事 (3)
- 性能问题 (1)
- UML (1)
- 工作总结 (1)
- 安卓 (1)
最新评论
-
菜鸟900101:
真心谢谢,解决了我头疼好几天的问题,谢谢谢谢
使用Ftpclient从FTP上进行下载时文件少一个字节,打不开 -
一生荣耀白:
[u][/u]
Freemarker分页的宏 -
liyang678:
这样不就得要求 被请求一方必须按您的这种XML格式解析吗。
使用HttpClient、注解、动态代理、Spring的Bean后处理器实现Http消息发送 -
liyang678:
可以演示一下如何调用吗。不是很明白呢。
使用HttpClient、注解、动态代理、Spring的Bean后处理器实现Http消息发送 -
hzxlb910:
...
使用TransactionTemplate来完成Spring的编程式事务管理
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd" default-lazy-init="false"> <!-- 加载资源文件 --> <context:property-placeholder location="classpath:jdbc.properties" /> <!-- 配置数据源 dataSource--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!-- 定义事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /> <tx:method name="save*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /> <tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /> <tx:method name="modify*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /> <tx:method name="delete*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /> <tx:method name="find*" propagation="SUPPORTS" /> <tx:method name="get*" propagation="SUPPORTS" /> <tx:method name="select*" propagation="SUPPORTS" /> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="bizMethods" expression="execution(* com.it.springbiz.*.service.*.*(..)) or execution(* com.it.springbiz.*.*.service.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="bizMethods" /> </aop:config> <!-- 编程式事务模板来完成Spring的编程式事务 --> <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager" /> </bean> <!-- jdbcTemplate 用来操作数据库--> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <!-- namedParameterJdbcTemplate支持命名参数特性 简化数据库操作--> <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"> <constructor-arg index="0" ref="dataSource"></constructor-arg> </bean> <!-- Spring 扫描使用注解的包路径 --> <context:component-scan base-package="com.it" /> <!-- 提供注解接口服务的注册功能 --> <bean id="httpServiceProxy" class="com.iteye.http.HttpClientBeanPostProcessor"> </bean> <import resource="classpath*:/bean/*-bean.xml" /> </beans>
package com.iteye.http.annotation; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.Target; /** * 〈一句话功能简述〉<br> * 〈功能详细描述〉 * * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ @Target(ElementType.METHOD) @Retention(RUNTIME) public @interface HttpMethod { String requestUrl(); /** * 操作编码 */ String operation(); /** * 编码 */ String enCode() default "UTF-8"; /** * 连接超时时间 */ int reqConnectTimeout() default 1000; /** * 请求返回超时时间 */ int repTimeout() default 5000; }
package com.iteye.http.annotation; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Retention; import java.lang.annotation.Target; /** * * 〈一句话功能简述〉<br> * 〈功能详细描述〉 * * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ @Target(TYPE) @Retention(RUNTIME) public @interface HttpService { /** * 服务代码 * * @return */ String serviceCode(); /** * 请求方系统代码 * * @return */ String appCode(); }
package com.iteye.http.annotation; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.Target; /** * 在需要注入HttpService的类中的字段或者set方法上添加该注解,后置处理器会处理使用该注解的接口为其生成代理类<br> * 〈功能详细描述〉 * * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ @Target({ ElementType.FIELD, ElementType.METHOD }) @Retention(RUNTIME) public @interface HttpWired { }
package com.iteye.http.dto; /** * 〈一句话功能简述〉<br> * 〈功能详细描述〉 * * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ public class RequestDto { /** * 系统编码 */ private String appCode; /** * 服务编码 */ private String serviceCode; /** * 操作编码 */ private String operation; /** * 编码 */ private String enCode; /** * 连接超时时间 */ private int reqConnectTimeout; /** * 请求返回超时时间 */ private int repTimeout; /** * 报文体内容 */ private String requestBody; public String getRequestBody() { return requestBody; } public void setRequestBody(String requestBody) { this.requestBody = requestBody; } public String getAppCode() { return appCode; } public void setAppCode(String appCode) { this.appCode = appCode; } public String getServiceCode() { return serviceCode; } public void setServiceCode(String serviceCode) { this.serviceCode = serviceCode; } public String getOperation() { return operation; } public void setOperation(String operation) { this.operation = operation; } public String getEnCode() { return enCode; } public void setEnCode(String enCode) { this.enCode = enCode; } public int getReqConnectTimeout() { return reqConnectTimeout; } public void setReqConnectTimeout(int reqConnectTimeout) { this.reqConnectTimeout = reqConnectTimeout; } public int getRepTimeout() { return repTimeout; } public void setRepTimeout(int repTimeout) { this.repTimeout = repTimeout; } }
package com.iteye.http; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import com.iteye.http.annotation.HttpService; import com.iteye.http.annotation.HttpWired; /** * 〈通过BeanPostProcessor后置处理器为代理接口生成代理类〉<br> * 〈功能详细描述〉 * * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ public class HttpClientBeanPostProcessor implements BeanPostProcessor { /** * 服务接口Class与代理对象的关系列表 */ private Map<String, Object> httpServiceProxys = new HashMap<String, Object>(); /** * * 此方法在每个Bean实例化、依赖注入完成之后执行,在调用afterPropertiesSet(实现InitializingBean接口)、init-method方法前执行 <br> * 〈在这里为HttpService代理接口生成代理类,这样调用代理接口的方法其实调用的是代理类的方法,在代理类方法中完成HttpClient发送xml报文的代码封装〉 * * @param bean * @param beanName * @return * @throws BeansException * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { // 为HttpService代理接口生成代理类 wireHttpServiceBean(bean, beanName); return bean; } /** * * 为HttpService代理接口生成代理类 <br> * 〈功能详细描述〉 * * @param bean * @param beanName * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ private void wireHttpServiceBean(Object bean, String beanName) { // 扫描当前处理的Bean中的所有set方法使用了@HttpWired注解属性 Class<?> clazz = bean.getClass(); BeanInfo beanInfo = null; try { beanInfo = java.beans.Introspector.getBeanInfo(clazz); } catch (IntrospectionException e) { throw new RuntimeException("Wiring bean=[" + beanName + "] meet error.", e); } // 获取当前Bean中的所有属性描述列表 PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { // 如果没有提供set方法 Method writeMethod = propertyDescriptor.getWriteMethod(); if (writeMethod == null) { continue; } // 如果set方法上没有使用@HttpWired注解 if (!writeMethod.isAnnotationPresent(HttpWired.class)) { continue; } // 获取注解接口的类型 Class<?> httpServiceClass = propertyDescriptor.getPropertyType(); // 获取代理接口对象 Object httpServiceProxy = getHttpServiceProxy(httpServiceClass); try { // 调用set方法为代理接口注入代理对象 writeMethod.invoke(bean, httpServiceProxy); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } } } /** * * 获取代理接口对象 <br> * 〈功能详细描述〉 * * @param httpServiceClass * @return * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ private Object getHttpServiceProxy(Class<?> httpServiceClass) { // 该接口是否使用了@HttpService注解 if (!httpServiceClass.isAnnotationPresent(HttpService.class)) { throw new RuntimeException(httpServiceClass + "该接口上没有使用@HttpService注解"); } String key = httpServiceClass.hashCode() + httpServiceClass.getName(); Object proxyObject = httpServiceProxys.get(key); // 判断该代理对象是否已经存在,因为不同的Bean中都会注入该@HttpService注解对象,防止重复创建代理对象 if (proxyObject != null) { return proxyObject; } HttpServiceProxy httpServiceProxy = new HttpServiceProxy(); // 设置代理的接口 httpServiceProxy.setHttpServiceClass(httpServiceClass); // 生成代理对象 proxyObject = httpServiceProxy.createHttpServiceProxy(); httpServiceProxys.put(key, proxyObject); return proxyObject; } /** * * 此方法在每个Bean实例化、依赖注入、在调用afterPropertiesSet(实现InitializingBean接口)、init-method方法之后执行: <br> * 〈功能详细描述〉 * * @param bean * @param beanName * @return * @throws BeansException * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } }
package com.iteye.http; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import org.springframework.util.ClassUtils; /** * 〈动态代理实现方式〉<br> * 〈功能详细描述〉 * * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ public class HttpServiceDramaticProxy implements InvocationHandler { /** * 代理的接口类型 */ private Class<?> httpServiceClass; public void setHttpServiceClass(Class<?> httpServiceClass) { this.httpServiceClass = httpServiceClass; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(method); System.out.println(args[0]); return "1111"; } public Object createHttpServiceProxy() { // 实现的接口 Class<?>[] interfaces = { httpServiceClass }; // 通过动态代理为代理接口生成代理对象 Object proxy = Proxy.newProxyInstance(ClassUtils.getDefaultClassLoader(), interfaces, this); return proxy; } }
package com.iteye.http; import java.lang.reflect.Method; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.springframework.aop.framework.ProxyFactory; import org.springframework.util.ClassUtils; import com.iteye.http.annotation.HttpMethod; import com.iteye.http.annotation.HttpService; /** * 〈一句话功能简述〉<br> * 〈功能详细描述〉 * * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ public class HttpServiceProxy implements MethodInterceptor { /** * 代理的接口类型 */ private Class<?> httpServiceClass; public void setHttpServiceClass(Class<?> httpServiceClass) { this.httpServiceClass = httpServiceClass; } @Override public Object invoke(MethodInvocation invocation) throws Throwable { // 获取接口调用的方法 Method method = invocation.getMethod(); // 方法上是否有HttpMethod注解 if (!method.isAnnotationPresent(HttpMethod.class)) { throw new RuntimeException(method + "方法上没有使用HttpMethod注解"); } Object[] args = invocation.getArguments(); if (args == null || args.length != 1 || !(args[0] instanceof String)) { throw new RuntimeException("方法体的参数有且只能有一个,且类型是String"); } String requestBody = (String) args[0]; HttpMethod httpMethod = method.getAnnotation(HttpMethod.class); HttpService httpService = httpServiceClass.getAnnotation(HttpService.class); // 获取请求的报文 String requestXml = getRequestXml(httpService, httpMethod, requestBody); // 以post方式发送请求报文并返回响应信息 String responseXml = HttpClientUtils.postHttpRequest(requestXml, httpMethod.requestUrl(), httpMethod.reqConnectTimeout(), httpMethod.repTimeout(), httpMethod.enCode()); return responseXml; } /** * * 获取请求的报文 <br> * 〈功能详细描述〉 * * @param httpService * @param httpMethod * @return * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ private String getRequestXml(HttpService httpService, HttpMethod httpMethod, String requestBody) { String requestXml="<MbfService>"+ "<input1>"+ "<MbfHeader>"+ "<ServiceCode>"+httpService.serviceCode()+"</ServiceCode>"+ "<Operation>"+httpMethod.operation()+"</Operation>"+ "</MbfHeader>"+ "<MbfBody>"+ requestBody+ "</MbfBody>"+ "</input1>"+ "</MbfService>"; return requestXml; } public Object createHttpServiceProxy() { // proxy是一个实现了serviceInterface接口的代理对象,当调用proxy的某个方法的时候,就会调用this的invoke方法 Object proxy = new ProxyFactory(httpServiceClass, this).getProxy(ClassUtils.getDefaultClassLoader()); return proxy; } }
package com.iteye.http; import java.io.IOException; import java.io.InputStream; import java.net.ConnectException; import java.net.SocketTimeoutException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpVersion; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ConnectTimeoutException; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.CoreConnectionPNames; import org.apache.http.params.CoreProtocolPNames; import org.apache.http.params.HttpParams; /** * 〈一句话功能简述〉<br> * 〈功能详细描述〉 * * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ public class HttpClientUtils { /** * * 以Post方式发送Http请求 <br> * 〈功能详细描述〉 * * @throws IOException * @throws ClientProtocolException * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public static String postHttpRequest(String requestXml, String requestUrl, int reqConnectTimeout, int repTimeout, String enCode) { HttpPost httpPost = null; try { // 定义HttpPost请求 httpPost = new HttpPost(requestUrl); // 定义请求实体 HttpEntity requestEntity = new StringEntity(requestXml, enCode); httpPost.setEntity(requestEntity); // 定义HttpClient HttpClient httpClient = new DefaultHttpClient(); HttpParams httpParams = httpClient.getParams(); // 设置Http协议的版本 httpParams.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); // 设置请求连接超时时间 httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, reqConnectTimeout); // 设置请求响应超时时间 httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, repTimeout); // 以post方式发送Http请求 HttpResponse httpResponse = httpClient.execute(httpPost); // 获取响应实体 HttpEntity responsetEntity = httpResponse.getEntity(); InputStream inputStream = responsetEntity.getContent(); StringBuilder reponseXml = new StringBuilder(); byte[] b = new byte[2048]; int length = 0; while ((length = inputStream.read(b)) != -1) { reponseXml.append(new String(b, 0, length)); } return reponseXml.toString(); } catch (Exception e) { // 释放请求的连接 if (httpPost != null) { httpPost.abort(); } if (SocketTimeoutException.class.isInstance(e)) { throw new RuntimeException("Http请求响应超时", e); } else if (ConnectTimeoutException.class.isInstance(e)) { throw new RuntimeException("Http请求连接超时", e); } else if (ConnectException.class.isInstance(e)) { throw new RuntimeException("Http请求异常", e); } else { throw new RuntimeException(e); } } } }
- Desktop.rar (293.2 KB)
- 下载次数: 13
评论
2 楼
liyang678
2017-12-28
这样不就得要求 被请求一方必须按您的这种XML格式解析吗。
1 楼
liyang678
2017-12-28
可以演示一下如何调用吗。不是很明白呢。
发表评论
-
如何使用spring中的定时任务
2017-10-20 15:00 432<!-- spring 定时任务 begin--&g ... -
spring事务深入理解和案例分析
2017-08-15 19:30 672http://www.cnblogs.com/fjding ... -
MQ消息接收接口
2014-05-23 09:18 1847<beans xmlns="http:// ... -
使用Jmstemplate向队列中发送数据
2014-05-15 16:43 5008<?xml version="1.0&qu ... -
Spring文件上传
2014-04-15 18:25 896文件上传可以使用普通的表单提交,也可以使用AJAX异步提交,如 ... -
Spring文件下载
2014-04-15 15:47 753@Controller public class MyC ... -
Spring定时任务调度
2014-04-14 16:57 786第1种方式: public class PayJob e ... -
对TransactionTemplate进行封装,使用程序调用更加简单
2014-03-19 14:18 3453<!-- DB2 dataSource--> ... -
使用TransactionTemplate来完成Spring的编程式事务管理
2014-03-19 14:14 4220<!-- 资源文件 --> <!-- ...
相关推荐
在项目中,我们可能首先会创建一个Spring Boot启动类,配置相关依赖,并利用`@Component`注解将HttpClient服务注册为Spring Bean,以便在其他组件中注入并使用。然后,我们可以编写一个HTTP客户端服务类,使用...
通过分析这个压缩包中的内容,我们可以学习如何在实际项目中高效地使用HTTPClient,以及如何将其无缝集成到Spring框架中,从而实现更强大的网络通信功能。这对于任何需要与Web服务进行交互的Java开发者来说都是极其...
在Spring配置文件或@Configuration注解的类中,你可以这样创建HttpClient Bean: ```java @Bean public CloseableHttpClient httpClient() { HttpComponentsClientHttpRequestFactory factory = new ...
在描述中提到了"hibernate-validate书籍",这可能是与HttpClient相关的一个补充,因为Hibernate Validate是Hibernate项目的一部分,它是Java Bean Validation规范的实现,用于校验对象的属性值。尽管两者主要关注的...
接着,可以创建一个配置类,使用`@Configuration`和`@Bean`注解,定义HttpClient的实例。这通常涉及设置连接超时、读取超时等参数。 ```java @Configuration public class HttpClientConfig { @Bean public ...
在 Spring Boot 中,我们可以使用 @Bean 注解将 HttpClient 封装成一个 Bean,用于在应用程序中使用。下面是一个示例代码: ```java @Configuration public class HttpClientConfig { @Bean public ...
在 Spring Boot 项目中,我们可以使用 @Configuration 注解创建一个配置类,用于配置 HttpClient。下面是一个简单的示例代码: ```java @Configuration @PropertySource(value="classpath:/properties/httpClient....
本文主要介绍如何使用基于注解的方式构建Spring MVC与Hibernate相结合的应用程序。这种方式不仅简化了配置过程,而且提高了开发效率。我们将通过一个具体的示例项目来了解整个流程。 #### 开发环境与工具 - **开发...
7. **轻量级HTTP客户端**:Spring 2.5引入了`HttpComponentsClientHttpRequestFactory`,这是一个基于Apache HttpClient的HTTP客户端实现,便于执行HTTP请求。 8. **Web应用上下文**:Spring 2.5对Web应用上下文...
本文将深入探讨如何使用注解配置在Spring Boot中设置连接池。 首先,Spring Boot默认集成了多种数据库连接池,如HikariCP、Tomcat JDBC Pool和DBCP2等。其中,HikariCP因其高性能和稳定性而被广泛推荐。我们可以...
6. **轻量级HTTP客户端**:Spring 2.5 添加了一个轻量级的HTTP客户端API,允许开发者方便地发送HTTP请求,而无需依赖其他库,如Apache HttpClient。 7. **Web应用上下文**:在Web应用方面,Spring 2.5提供了更多的...
在这个基于SSM+maven+httpClient+jsoup实现的小说网站项目中,我们主要涉及了四个核心的技术栈,分别是Spring、SpringMVC、MyBatis(SSM)以及HTTP客户端库httpClient和网页抓取库jsoup。下面将详细介绍这些技术及其...
在"lib"目录下,这些jar包可能包含了Spring框架的上述所有或部分模块,以及运行示例代码可能需要的其他库,如JDBC驱动、JSON处理库(如Jackson或Gson)、HTTP客户端库(如Apache HttpClient)等。确保这些jar包正确...
在本文中,我们将探索SpringBoot的基础知识和实践经验,包括SpringBoot的发展历程、Java配置方式、注解的使用、HttpClient的配置等。 一、Spring的发展历程 Spring Framework从1.x时代开始,就已经有了XML配置...
一个简单的示例可能包括创建一个RESTful服务,使用Spring的@Controller注解定义控制器,然后在Spring配置文件中使用CXF的JAX-RS支持暴露该服务。这样,开发者就可以利用Spring的强大功能和CXF的Web服务处理能力,...
工具类数据校验 jsp自定义标签 Spring自定义注解 默认requestMapping 1.1.2 代码生成器 1.1.3 首页修改 dateformat.js 时间参数转换 SpringMVC配置文件集中 快递参数接口 1.1.4 des加解密字符串和文件 1.1.5 redis...
- **spring-aop.jar**: 实现了AOP代理和通知模型,支持切面编程。 3. **MyBatis框架**: - **mybatis.jar**: MyBatis的核心库,提供了SQL映射框架,允许将SQL语句直接写在XML或注解中,简化数据库操作。 - **...
Spring Boot OpenFeign的出现,使得我们可以告别传统的HttpClient方式,实现更加优雅、便捷的服务调用。OpenFeign是一个声明式的Web服务客户端,它允许开发者通过简单的接口定义来调用远程服务,从而降低了服务之间...
5. **spring-beans-3.2.4.RELEASE.jar**:Spring的Bean模块,定义了如何创建、配置和管理对象,是Spring的核心组成部分,支持XML、注解和基于Java的配置。 6. **commons-collections-3.1.jar**:Apache Commons ...
4. 配置Spring XML文件,定义服务的bean,并指定服务的实现类。 5. 部署到Tomcat服务器并测试Web Service服务。 通过以上步骤,开发者可以快速地构建一个基础的Web Service应用,体验到XFire和Spring带来的高效和...