- 浏览: 400638 次
- 性别:
- 来自: 南京
最新评论
-
x981114171:
不知大家有没发现,国产书,国人写的书就没几本是给力的,以后国人 ...
《Spring技术内幕》的读者问题交流 -
x981114171:
买了这本书,感觉很不值。来吐槽下,也许你自己是专家,不过写的书 ...
《Spring技术内幕》的读者问题交流 -
851228082:
作者,写的书很好,我觉得幸亏有源码,所以我才能看懂。一边看,一 ...
《Spring技术内幕》的读者问题交流 -
yueshang520:
说的真不错。。学习了
Spring技术内幕——深入解析Spring架构与设计原理(一)IOC实现原理 -
faith789510:
TransactionProxyFactoryBean 什么情 ...
Spring源代码解析(六):Spring声明式事务处理
在应用开发中,常常涉及服务器系统中各种不同进程之间的通信与计算交互,远端调用(RMI)是实现这种计算场景的一种有效方式。此外,还存在着另一种情况,在这种应用场景中,与那些典型的基于HTML的B/S应用不同,客户端程序需要完成对服务器端应用的直接调用,这也是需要远端调用大显身手的场合。
Spring中提供了轻量级的远端调用模块,从而为我们在上面提到的应用场景开发,提供平台支持。根据Spring的既定策略,它依然只是起到一个集成平台的作用,而并不期望在实现方案上,与已有的远端调用方案形成竞争。也就是说,在Spring远端调用架构中,具体的通信协议设计、通信实现,以及在服务器和客户端对远端调用的处理封装,Spring没有将其作为实现重点,在这个技术点上,并不需要重新发明轮子。对Spring来说,它所要完成的工作,是在已有远端调用技术实现的基础上,通过IoC与AOP的封装,让应用更方便地使用这些远端调用服务,并能够更方便灵活地与现有应用系统实现集成。通过Spring封装以后,应用使用远端过程调用非常方便,既不需要改变原来系统的相关实现接口,也不需要为远端调用功能增加新的封装负担。因此,这种使用方式,在某种程度上,可以称为轻量级的远端调用方案。
在实现远端调用的过程中,往往需要涉及客户端和服务器端的相关设置,这些设置通过Spring的IoC容器就可以很好的完成,这是我们已经很熟悉的IoC容器的强项了。同时,Spring为远端调用的实现,提供了许多不同的方案,玲琅满目,任君选择。如RMI、HTTP调用器、第三方远端调用库Hessian/Burlap、基于Java RMI的解决方案,等等。
Spring对不同的远端调用的实现封装,基本上,都采用了类似的模式来完成,比如在客户端,都是通过相关的ProxyFactoryBean和ClientInterceptor来完成的,在服务器端是通过ServiceExporter来导出远端的服务对象的。有了这些统一的命名规则,应用配置和使用远端调用会非常方便,同时,通过对这些Spring远端调用基础设施实现原理的分析,还可以看到一些常用处理方法的技术实现,比如对代理对象的使用、拦截器的使用、通过afterPropertiesSet来启动远端调用基础设施的建立,等等,这些都是在Spring中常用的技术。
HTTP调用器客户端的实现
在HtttpInvokerProxyFactory中,设置了serviceProxy对象作为远端服务的本地代理对象;同时,在依赖注入完成以后,通过afterPropertiesSet来对远端调用完成设置。
可以看到,为这个代理对象配置了一个拦截器HttpInvokerClientInterceptor,在这个拦截器中,拦截了对代理对象的方法调用。如以下代码所示:
远端调用的具体实现过程,是由executeRequest来完成的,也就是在SimpleHttpInvokerRequestExecutor的实现中,封装了整个HTTP调用器客户端实现的基本过程,如下所示:
HTTP调用器服务器端的实现
在服务器端使用Spring HTTP远端调用,需要配置HttpInvokerServiceExporter,作为远端服务的服务导出器,来接收HTTP服务请求。在通过HTTP请求,得到客户端传过来的RemoteInvocation对象以后,就可以进行服务方法的调用了。服务调用需要的基本信息,都封装在RemoteInvocation对象中。这个服务调用过程,是由invokeAndCreateResult方法来实现的,如RemoteInvocationSerializingExporter的invoke实现所示:
看到的invoke方法封装了服务器端调用的主体,这个invoke方法在HttpInvokerServiceExporter的基类RemoteInvocationSerializingExporter中实现,服务对象的方法调用完成之后,会把调用结果,通过HTTP响应和对象序列化,传给HTTP调用器客户端,从而完成整个HTTP调用器的远端调用过程,如以下代码所示:
经过这一系列的处理过程,服务执行结果对象又回到了HTTP的远端调用客户端。在客户端从HTTP响应读取对象之后,它把这个看起来像是在本地实现,其实是由远端服务对象完成的调用结果,交给发起远端调用的客户端调用方法,从而最终完成整个远端调用的过程。这个过程很有特点,它使用了HTTP的请求和响应作为通信通道,在这个通信通道里面,并没有再做进一步的附加的通信协议的封装,而且,在这个处理过程中,使用的都是Java和Spring框架已有的特性,比如,通过IoC的配置,以及代理对象拦截器的封装处理,再加Java的序列化和反序列化,以及在服务器端的Spring MVC框架的使用,通过这些已有的技术实现,让使用者感觉,它的实现风格非常的简洁轻快,整个代码实现,阅读起来,也让人感到非常的赏心悦目。
我觉得对Java要深入的话,一定要找个机会去捣鼓一阵JVM的源码。感觉一定也很不错。
据我了解,已经十几年了,哈哈!
我觉得常常回过头去看看,会有意想不到的收获的:)
在对Spring的理解中,也就是在整个整理过程中,就常常让我有这样的感觉,但觉得还是有许多值得深究的地方没有挖掘到......见谅见谅,海涵海涵...
Spring中提供了轻量级的远端调用模块,从而为我们在上面提到的应用场景开发,提供平台支持。根据Spring的既定策略,它依然只是起到一个集成平台的作用,而并不期望在实现方案上,与已有的远端调用方案形成竞争。也就是说,在Spring远端调用架构中,具体的通信协议设计、通信实现,以及在服务器和客户端对远端调用的处理封装,Spring没有将其作为实现重点,在这个技术点上,并不需要重新发明轮子。对Spring来说,它所要完成的工作,是在已有远端调用技术实现的基础上,通过IoC与AOP的封装,让应用更方便地使用这些远端调用服务,并能够更方便灵活地与现有应用系统实现集成。通过Spring封装以后,应用使用远端过程调用非常方便,既不需要改变原来系统的相关实现接口,也不需要为远端调用功能增加新的封装负担。因此,这种使用方式,在某种程度上,可以称为轻量级的远端调用方案。
在实现远端调用的过程中,往往需要涉及客户端和服务器端的相关设置,这些设置通过Spring的IoC容器就可以很好的完成,这是我们已经很熟悉的IoC容器的强项了。同时,Spring为远端调用的实现,提供了许多不同的方案,玲琅满目,任君选择。如RMI、HTTP调用器、第三方远端调用库Hessian/Burlap、基于Java RMI的解决方案,等等。
Spring对不同的远端调用的实现封装,基本上,都采用了类似的模式来完成,比如在客户端,都是通过相关的ProxyFactoryBean和ClientInterceptor来完成的,在服务器端是通过ServiceExporter来导出远端的服务对象的。有了这些统一的命名规则,应用配置和使用远端调用会非常方便,同时,通过对这些Spring远端调用基础设施实现原理的分析,还可以看到一些常用处理方法的技术实现,比如对代理对象的使用、拦截器的使用、通过afterPropertiesSet来启动远端调用基础设施的建立,等等,这些都是在Spring中常用的技术。
HTTP调用器客户端的实现
在HtttpInvokerProxyFactory中,设置了serviceProxy对象作为远端服务的本地代理对象;同时,在依赖注入完成以后,通过afterPropertiesSet来对远端调用完成设置。
public class HttpInvokerProxyFactoryBean extends HttpInvokerClientInterceptor implements FactoryBean<Object> { //这是远端对象的代理 private Object serviceProxy; @Override //在注入完成之后,设置远端对象代理 public void afterPropertiesSet() { super.afterPropertiesSet(); //需要配置远端调用的接口 if (getServiceInterface() == null) { throw new IllegalArgumentException("Property 'serviceInterface' is required"); }//这里使用ProxyFactory来生成远端代理对象,注意这个this,因为HttpInvokerProxyFactoryBean的基类是HttpInvokerClientInterceptor,所以代理类的拦截器被设置为HttpInvokerClientInterceptor this.serviceProxy = new ProxyFactory(getServiceInterface(), this).getProxy(getBeanClassLoader()); } //FactoryBean生产对象的入口。返回的是serviceProxy对象,这是一个代理对象 public Object getObject() { return this.serviceProxy; } public Class<?> getObjectType() { return getServiceInterface(); } public boolean isSingleton() { return true; }
可以看到,为这个代理对象配置了一个拦截器HttpInvokerClientInterceptor,在这个拦截器中,拦截了对代理对象的方法调用。如以下代码所示:
//对代理对象的方法调用入口 public Object invoke(MethodInvocation methodInvocation) throws Throwable { if (AopUtils.isToStringMethod(methodInvocation.getMethod())) { return "HTTP invoker proxy for service URL [" + getServiceUrl() + "]"; } //创建RemoteInvocation对象,这个对象封装了对远端的调用,这些远端调用通过序列化的机制完成 RemoteInvocation invocation = createRemoteInvocation(methodInvocation); RemoteInvocationResult result = null; try { //这里是对远端调用的入口 result = executeRequest(invocation, methodInvocation); } catch (Throwable ex) { throw convertHttpInvokerAccessException(ex); } try {//返回远端调用的结果 return recreateRemoteInvocationResult(result); } catch (Throwable ex) { if (result.hasInvocationTargetException()) { throw ex; } else { throw new RemoteInvocationFailureException("Invocation of method [" + methodInvocation.getMethod() + "] failed in HTTP invoker remote service at [" + getServiceUrl() + "]", ex); } } }
远端调用的具体实现过程,是由executeRequest来完成的,也就是在SimpleHttpInvokerRequestExecutor的实现中,封装了整个HTTP调用器客户端实现的基本过程,如下所示:
//这是HTTP调用器实现的基本过程,通过HTTP的request和reponse来完成通信,在通信的过程中传输的数据是序列化的对象 protected RemoteInvocationResult doExecuteRequest( HttpInvokerClientConfiguration config, ByteArrayOutputStream baos) throws IOException, ClassNotFoundException { //打开一个标准J2SE HttpURLConnection HttpURLConnection con = openConnection(config); prepareConnection(con, baos.size()); //远端调用封装成RemoteInvocation对象,这个对象通过序列化被写到对应的HttpURLConnection中去 writeRequestBody(config, con, baos); //这里取得远端服务返回的结果,然后把结果转换成RemoteInvocationResult返回 validateResponse(config, con); InputStream responseBody = readResponseBody(config, con); return readRemoteInvocationResult(responseBody, config.getCodebaseUrl()); } //把序列化对象输出到HttpURLConnection去 protected void writeRequestBody( HttpInvokerClientConfiguration config, HttpURLConnection con, ByteArrayOutputStream baos) throws IOException { baos.writeTo(con.getOutputStream()); } //为使用HttpURLConnection完成对象序列化,需要进行一系列的配置 //比如配置请求方式为post,请求属性等等 protected void prepareConnection(HttpURLConnection con, int contentLength) throws IOException { con.setDoOutput(true); con.setRequestMethod(HTTP_METHOD_POST); con.setRequestProperty(HTTP_HEADER_CONTENT_TYPE, getContentType()); con.setRequestProperty(HTTP_HEADER_CONTENT_LENGTH, Integer.toString(contentLength)); LocaleContext locale = LocaleContextHolder.getLocaleContext(); if (locale != null) { con.setRequestProperty(HTTP_HEADER_ACCEPT_LANGUAGE, StringUtils.toLanguageTag(locale.getLocale())); } if (isAcceptGzipEncoding()) { con.setRequestProperty(HTTP_HEADER_ACCEPT_ENCODING, ENCODING_GZIP); } } //获得HTTP响应的IO流 protected InputStream readResponseBody(HttpInvokerClientConfiguration config, HttpURLConnection con) throws IOException { //如果是通过gzip压缩,那么需要先解压 if (isGzipResponse(con)) { // GZIP response found - need to unzip. return new GZIPInputStream(con.getInputStream()); } else { // Plain response found. // 正常的HTTP响应输出 return con.getInputStream(); } }
HTTP调用器服务器端的实现
在服务器端使用Spring HTTP远端调用,需要配置HttpInvokerServiceExporter,作为远端服务的服务导出器,来接收HTTP服务请求。在通过HTTP请求,得到客户端传过来的RemoteInvocation对象以后,就可以进行服务方法的调用了。服务调用需要的基本信息,都封装在RemoteInvocation对象中。这个服务调用过程,是由invokeAndCreateResult方法来实现的,如RemoteInvocationSerializingExporter的invoke实现所示:
protected Object invoke(RemoteInvocation invocation, Object targetObject) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { if (logger.isTraceEnabled()) { logger.trace("Executing " + invocation); } try {//调用RemoteInvocationExecutor,这个执行器是DefaultRemoteInvocationExecutor return getRemoteInvocationExecutor().invoke(invocation, targetObject); } catch (NoSuchMethodException ex) { if (logger.isDebugEnabled()) { logger.warn("Could not find target method for " + invocation, ex); } throw ex; } catch (IllegalAccessException ex) { if (logger.isDebugEnabled()) { logger.warn("Could not access target method for " + invocation, ex); } throw ex; } catch (InvocationTargetException ex) { if (logger.isDebugEnabled()) { logger.debug("Target method failed for " + invocation, ex.getTargetException()); } throw ex; } }
看到的invoke方法封装了服务器端调用的主体,这个invoke方法在HttpInvokerServiceExporter的基类RemoteInvocationSerializingExporter中实现,服务对象的方法调用完成之后,会把调用结果,通过HTTP响应和对象序列化,传给HTTP调用器客户端,从而完成整个HTTP调用器的远端调用过程,如以下代码所示:
protected void writeRemoteInvocationResult( HttpServletRequest request, HttpServletResponse response, RemoteInvocationResult result) throws IOException { //设置Response的ContentType属性,设置为application/x-java-serialized-object response.setContentType(getContentType()); writeRemoteInvocationResult(request, response, result, response.getOutputStream()); } //输出到HTTP的Response,然后把Response关闭 protected void writeRemoteInvocationResult( HttpServletRequest request, HttpServletResponse response, RemoteInvocationResult result, OutputStream os) throws IOException { ObjectOutputStream oos = createObjectOutputStream(decorateOutputStream(request, response, os)); try { doWriteRemoteInvocationResult(result, oos); oos.flush(); } finally { oos.close(); } }
经过这一系列的处理过程,服务执行结果对象又回到了HTTP的远端调用客户端。在客户端从HTTP响应读取对象之后,它把这个看起来像是在本地实现,其实是由远端服务对象完成的调用结果,交给发起远端调用的客户端调用方法,从而最终完成整个远端调用的过程。这个过程很有特点,它使用了HTTP的请求和响应作为通信通道,在这个通信通道里面,并没有再做进一步的附加的通信协议的封装,而且,在这个处理过程中,使用的都是Java和Spring框架已有的特性,比如,通过IoC的配置,以及代理对象拦截器的封装处理,再加Java的序列化和反序列化,以及在服务器端的Spring MVC框架的使用,通过这些已有的技术实现,让使用者感觉,它的实现风格非常的简洁轻快,整个代码实现,阅读起来,也让人感到非常的赏心悦目。
评论
10 楼
beliefer
2013-08-05
楼主好,感谢楼主的文章,让我提升很多认识。关于spring的几种远端调用的实现,究竟都有什么优缺点呢?传输速率,稳定性等
9 楼
raymondwang1314
2013-04-01
不好意思,我刚开始学习spring aop请问一下HttpInvokerClientInterceptor这个类是怎么拦截到method.invoke()方法的?
8 楼
jiwenke
2009-11-20
lydawen 写道
看了下楼主自述经历,看来做开发很多很多年了啊。
我99年开始接触程序,可到现在还是对java不够深入,甚至对 s,s,h 这三个源码都一知半角,惭愧啊
我99年开始接触程序,可到现在还是对java不够深入,甚至对 s,s,h 这三个源码都一知半角,惭愧啊
我觉得对Java要深入的话,一定要找个机会去捣鼓一阵JVM的源码。感觉一定也很不错。
7 楼
linux1689
2009-11-20
lydawen 写道
看了下楼主自述经历,看来做开发很多很多年了啊。
我99年开始接触程序,可到现在还是对java不够深入,甚至对 s,s,h 这三个源码都一知半角,惭愧啊
我99年开始接触程序,可到现在还是对java不够深入,甚至对 s,s,h 这三个源码都一知半角,惭愧啊
据我了解,已经十几年了,哈哈!
6 楼
lydawen
2009-11-19
看了下楼主自述经历,看来做开发很多很多年了啊。
我99年开始接触程序,可到现在还是对java不够深入,甚至对 s,s,h 这三个源码都一知半角,惭愧啊
我99年开始接触程序,可到现在还是对java不够深入,甚至对 s,s,h 这三个源码都一知半角,惭愧啊
5 楼
jiwenke
2009-11-18
zhao_xiao_dong 写道
很好呀,呵呵,我要重新开始Sping之旅了
我觉得常常回过头去看看,会有意想不到的收获的:)
在对Spring的理解中,也就是在整个整理过程中,就常常让我有这样的感觉,但觉得还是有许多值得深究的地方没有挖掘到......见谅见谅,海涵海涵...
4 楼
zhao_xiao_dong
2009-11-18
很好呀,呵呵,我要重新开始Sping之旅了
3 楼
linux1689
2009-11-17
楼主的这系列文章真是没话说,如果看了这系列文章再回过头去审视和使用Spring,肯定又是另外一种境界了。
再次预告一下,楼主的这系列文章马上要出书了,书名就叫做《Spring技术内幕——深入解析Spring架构与设计原理》,预计在12月中旬会与大家见面,届时还请大家多多指教。
再次预告一下,楼主的这系列文章马上要出书了,书名就叫做《Spring技术内幕——深入解析Spring架构与设计原理》,预计在12月中旬会与大家见面,届时还请大家多多指教。
2 楼
whaosoft
2009-11-17
很好,写的很详细
1 楼
guolimin19821118
2009-11-16
楼主的文章一直在看
更新真快
再次赞一个
更新真快
再次赞一个
发表评论
-
开放注册了!我们的任务推客 - 群组任务和流程协同SaaS工具
2010-06-30 20:31 621经过这几天团队的努力,为软件增加了开放注册功能,大家可以自己动 ... -
我们团队研发的SaaS软件产品:应用于群组任务协同和流程管理
2010-06-21 15:39 846任务协同及流程管理SaaS软件:任务推客上线,欢迎大家免费体验 ... -
随笔:Spring与云计算(六)
2009-12-17 18:49 3769这样,就说到国内了, ... -
随笔:Spring与云计算(五)
2009-12-16 19:58 3382那其他呢,我们看看还 ... -
随笔:Spring与云计算(四)
2009-12-15 16:26 4149前面我们提到,Spring被VMWare收购而进入云计算领域, ... -
随笔:Spring与云计算(三)
2009-12-14 14:05 3723在前面的那张图中,可以看到SpringSource产品和云计算 ... -
随笔:Spring与云计算(二)
2009-12-11 14:57 4304这么大的范围的模式转 ... -
随笔:Spring与云计算(一)
2009-12-10 15:19 6962对Spring和云计算的关注 ... -
《Spring技术内幕 - 深入解析Spring架构与设计原理》上市了!
2009-12-09 15:17 9103详细的书本目录和章节节选请见附件!欢迎下载指正。 可以购买到 ... -
Spring技术内幕——深入解析Spring架构与设计原理(六)Spring ACEGI
2009-11-20 12:27 14531Spring ACEGI 作为Spring丰富生态系统中的一个 ... -
Spring技术内幕——深入解析Spring架构与设计原理(四)Web MVC的实现
2009-11-08 08:55 21225以前的欠账,现在补上,欢迎指正和讨论。 Spring Web ... -
Spring技术内幕——深入解析Spring架构与设计原理(三)数据库的操作实现
2009-11-02 17:34 13784最近事情实在是比较多,没有及时更新帖子,还望大家见谅啊。今天, ... -
Spring技术内幕——深入解析Spring架构与设计原理(二)AOP
2009-10-20 08:30 23075关于AOP的个人理解 AOP联盟定义的AOP体系结构把与AO ... -
Spring技术内幕——深入解析Spring架构与设计原理(一)IOC实现原理
2009-10-19 10:47 98948内容较多,新开一贴, ... -
Spring技术内幕——深入解析Spring架构与设计原理(一)引子
2009-10-17 20:31 11245缘起 已经很久没有写 ... -
Hadoop的mapred JobTracker端源码概览
2009-02-18 19:40 5203上一节看到TaskTracker启动新任务的过程,这里接着看看 ... -
Hadoop的mapred TaskTracker端源码概览
2009-02-17 14:39 4111花了许多功夫把Hadoop的mapreduce实现过了一遍,基 ... -
Hadoop的mapred TaskTracker端源码概览
2009-02-17 14:37 1649这篇文章和博客的另一篇重复,删掉了。对不起,请参阅博客的另一篇 ... -
发布用javaeye生成的博客版本 - Spring源代码解析
2008-11-20 08:49 3632呵呵,试试javaeye的新功能。帮助大家阅读,文中的很多错误 ... -
Spring源代码解析(十):Spring Acegi框架授权的实现
2007-08-17 11:01 4903我们从FilterSecurityInterceptor我们从 ...
相关推荐
Spring技术内幕:深入解析Spring架构与设计原理 Spring技术内幕 Spring是一个基于Java的开源框架,旨在简化Java企业应用的开发。Spring的目标是提供一个简洁、灵活、可扩展的框架,以帮助开发者快速构建企业级...
本书《Struts2技术内幕——深入解析Struts2架构设计与实现原理》结合提供的《struts2基础.chm》资料,为我们提供了深入理解Struts2内部机制的机会。 首先,Struts2的核心在于它的拦截器(Interceptor)机制。拦截器...
Spring技术内幕 深入解析Spring架构与设计原理1(完整清晰版),一共两部分,这是第一部分 《Spring技术内幕:深入解析Spring架构与设计原理》是Spring领域的问鼎之作,由业界拥有10余年开发经验的资深Java专家亲自...
Spring技术内幕:深入解析Spring架构与设计原理(第2部分) 《Spring技术内幕:深入解析Spring架构与设计原理》是Spring领域的问鼎之作,由业界拥有10余年开发经验的资深Java专家亲自执笔!Java开发者社区和Spring...
Spring技术内幕 深入解析Spring架构与设计原理1(完整清晰版),一共两部分,这是第一部分 《Spring技术内幕:深入解析Spring架构与设计原理》是Spring领域的问鼎之作,由业界拥有10余年开发经验的资深Java专家亲自...
这本书《Struts2技术内幕——深入解析Struts2架构设计与实现原理》深入探讨了Struts2的核心机制和设计理念,旨在帮助开发者更好地理解和运用这个框架。 首先,Struts2的出现是为了解决Struts1在MVC模式中的局限性,...
《Spring技术内幕-深入解析_Spring架构与设计原理》是一本深入探讨Spring框架核心机制与设计理念的专业书籍,由资深软件开发专家计文柯撰写。本书不仅适合Java开发者、Spring框架使用者,也对平台开发人员、系统架构...
《Spring技术内幕 - 深入解析Spring架构与设计原理》这本书是IT领域的经典之作,专为想要深入了解Spring框架的开发者而准备。Spring作为Java领域最广泛应用的轻量级框架,其设计理念和实现机制一直是广大程序员关注...
下载频道>资源分类>开发技术>Java>Spring技术内幕:深入解析Spring架构与设计原理 1/2 Spring技术内幕:深入解析Spring架构与设计原理 1/2资源大小:59MB 上传日期:2011-11-15 资源积分:5分 下载次数:30 上 传 者...
总的来说,"Struts2 技术内幕——深入解析Struts2架构设计"这本书将带你深入理解Struts2的工作原理,包括其架构设计、核心组件、配置方式、数据绑定、异常处理以及安全性等方面。通过对这些知识点的掌握,开发者能够...
深入解析spring架构原理与设计思想,探究spring成功的奥秘。 揭开spring源代码的神秘面纱,展示系统阅读开源软件源代码的方法和秘诀。 掌握spring的架构原理与设计思想真的能让开发者如虎添翼吗? ioc容器...
深入解析spring架构原理与设计思想,探究spring成功的奥秘。 揭开spring源代码的神秘面纱,展示系统阅读开源软件源代码的方法和秘诀。 掌握spring的架构原理与设计思想真的能让开发者如虎添翼吗? ioc...
### Spring技术内幕:深入解析Spring架构与设计原理(第2版) #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一个开源项目,它最初是为了简化企业级Java应用程序的开发而设计的。随着版本的不断迭代,...
《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》是一本深入探讨Spring框架核心技术的书籍,由计文柯撰写。这本书详细解析了Spring的设计原理和架构细节,是广大Spring开发者和技术人员不可或缺的学习...
### Spring技术内幕:深入解析Spring架构与设计原理 #### Spring框架概述 Spring是一个开源的Java应用框架,由Rod Johnson创建并领导开发。Spring的核心特性包括依赖注入(Dependency Injection, DI)、面向切面...
Spring技术内幕 深入解析Spring架构与设计原理1(完整清晰版),一共两部分,这是第一部分 《Spring技术内幕:深入解析Spring架构与设计原理》是Spring领域的问鼎之作,由业界拥有10余年开发经验的资深Java专家亲自...