访问数据库-使用Remoting实现数据库访问-remoting (mysql 授权用户访问数据库)

教程大全 2025-07-20 09:40:41 浏览

在分布式系统中,远程对象通信技术实现了不同计算机上的应用程序进行通信和交互。Remoting就是一种远程对象通信技术。在开发这样的分布式系统时,我们经常需要访问数据库里面的数据并进行操作,那么如何呢?本文将详细介绍如何使用Remoting技术实现数据库访问。

一、什么是Remoting技术?

Remoting技术是一种基于.NET的远程对象通信技术,可以让一个对象在一个应用程序域中向另一个应用程序域中的对象发送消息。这种技术需要至少两个应用程序域之间的通信。

Remoting使用两个对象,一个是客户端对象,一个是 服务器 端对象,客户端对象根据需要创建服务器端对象并向其发送消息,服务器端对象接收消息并响应。这种技术可以在两个应用程序域之间直接传送对象和数据。

二、如何使用Remoting技术访问数据库?

1. 创建Remoting服务

首先需要创建Remoting服务。创建一个Remoting服务的过程包括:

(1)创建远程接口

远程接口是客户端对象将要调用的远程方法的。客户端通过这些方法来访问远程对象。在这个例子中,我们需要一个接口来定义访问数据库的远程方法。

(2)创建远程对象

远程对象是实现远程接口的类的实例。远程对象包含在服务器端应用程序中,它是由客户端对象创建的,然后通过远程接口来访问。

2.使用Remoting访问数据库

接下来,我们需要在服务器端应用程序中使用Remoting来访问数据库。主要包括:

(1)创建数据库连接

在服务器端应用程序中,我们需要使用ADO.NET来创建一个数据库连接。

(2)创建命令对象和处理数据

通过ADO.NET,我们可以使用SqlCommand和SqlDataAdapter类来创建命令对象和处理数据。使用SqlCommand类可以执行SQL语句,并将结果放入DataSet对象中。

(3)返回数据结果

服务器端对象负责执行SQL语句,并将数据结果返回给客户端对象。客户端对象可以使用返回的数据填充数据表格或数据集。

3.在客户端访问Remoting服务

当我们完成上述步骤后,我们可以大致确定如何在服务器端中使用Remoting来访问数据库。接下来需要在客户端中使用Remoting来调用远程方法并获取数据。主要包括以下步骤:

(1)创建一个客户端应用程序

客户端应用程序负责创建远程对象,然后调用远程方法。

(2)创建远程代理对象

创建远程代理对象,然后使用它来调用远程方法。可以使用.Net的Activator来创建远程代理对象。

(3)通过远程对象获取数据

客户端通过远程对象调用远程方法来获取服务器端的数据。

三、

在本文中,我们介绍了的步骤。首先创建一个Remoting服务,包括创建远程接口和远程对象。接下来在服务器端应用程序中使用Remoting访问数据库,并将结果返回给客户端对象。客户端对象可以通过远程代理对象调用远程方法获取服务器端的数据。这样我们就可以使用Remoting技术来实现数据库访问。

相关问题拓展阅读:

要通过webserver访问远程数据库的内容返回数据集,并存到本地数据库。要怎么做呀。

我不知道你的webserver是个什么东西,我暂时把他当做remoting或者webservice吧,在客户端调用webserver,webserver查询数据库,查询结果转换成XML,传回客户端,客户单端处理一下插入数据库就可以了吧,希望我说的对你有帮助

.net Remoting编程-客户端订阅服务端事件

之一步:创建共享库

依次点击“文件”->“新创建”->“工程”,选慎正择创建一个c# library,并将其命名为resumeserverlibrary,然后点击ok按钮。这将创建一个我们的.net remote客户端和服务器端用来通讯的“共享命令集”。

正面是完整的代码,如果要跳过数据库访问部分,可以使用下面的代码替换春孝陵resumeloader对象:

public class resumeloader : system.marshalbyrefobject

public resumeloader()

system.console.writeline(“new referance added!”);

public resume getresumebyuserid(decimal userid)

return new resume(1);

名字空间是对象所需要的。请记住,如果得到system.runtime.remoting.channels.tcp名字空间不存在的信息,请检查是否象上面的代码那样添加了对system.runtime.remoting.dll的引用。

using system;

using system.runtime;

using system.data.sqlclient;

我们为对象使用的名字空间是dotnetremotetest,下面的对象是marshalbyrefobject,在其中我们创建了一个引用和包括服务器端数据库操作全部完成所需要的扒戚所有工作。

namespace dotnetremotetest

public class resumeloader : system.marshalbyrefobject

private sqlconnection dbconnection;

public resumeloader()

this.dbconnection = new system.data.sqlclient.sqlconnection();

this.dbconnection.connectionstring =

”data source=grimsaado2k;initial catalog=underground;integrated security=sspi;pers” +

”ist security info=true;workstation id=grimsaado2k;packet size=4096″;

/*具体的连接字符串会有所不同,这超出了本篇文章的范围。如果不清楚如何创建一个数据库连接,请使用这一对象的另一个版本。*/

system.console.writeline(“new referance added!”);

public resume getresumebyuserid(decimal userid)

resume resume = new resume();

dbconnection.open();

sqlcommand cmd = new sqlcommand(

”select resumeid, userid, title, body From resume as theresume where theresume.userid=”+ userid +””

, dbconnection

sqldatareader areader = cmd.executereader();

if(areader.read())

resume.resumeid=areader.getdecimal(0);

resume.userid=areader.getdecimal(1);

resume.title=areader.getstring(2);

resume.body=areader.getstring(3);

areader.cidc.com/xtywjcwz/37719.html" target="_blank">TPS://www.kuidc.com/xtywjcwz/23192.html" target="_blank">Lose();

dbconnection.close();

catch(exception x) { resume.title=”error:”+x; }

return resume;

resume需要能够被串行化,以便能作为被远程调用的.net remote对象的返回类型,原因是该对象将被转换为通过网络传输的原始数据,然后在网络的另一端再被装配成一个对象。

该对象非常简单,为了使本篇文章看起来更简单,其中的构造器甚至使用缺省的内容初始化其中的一些域。

public class resume

private decimal resumeid, userid;

private string body, title;

public resume(decimal resumeid)

this.resumeid=resumeid;

this.userid=1;

this.body=”this is the default body of the resume”;

this.title=”this is the default title”;

public decimal resumeid

get { return resumeid; }

set { this.resumeid=value; }

public decimal userid

get { return userid; }

set { this.userid=value; }

public string body

get { return body; }

set { this.body=value;}

public string title

get { return title; }

set { this.title=value; }

}//resume对象结束

}//dotnetremotetest名字空间结束

编译创建的工程,就会得到一个dll文件,并可以在其他的工程中使用它。

第二步:创建server对象

有几种方法可以创建server对象,最直观的方法是下面的方法:在visual studio.net中,依次点击“文件”->“新创建”->“工程”,选择创建一个“command line application”(命令行应用程序),并将它命名为resumesuperserver。

最最重要的是,我们需要添加对刚才在之一步中所创建的dll文件的应用,该应用程序才能正确地运行。依次点击“工程”->“添加引用”,然后通过点击“浏览”按钮添加一个对在之一步中所创建的dll文件的引用。

为了使用.net remote功能,必须通过选择“工程”->“添加引用”,添加对dll文件的引用。在.net标签中选择system.runtime.remoting.dll,然后点击“ok”按钮。然后,需要象我们在之一步中那样添加对system.runtime.remoting.dll的引用。

下面的对象相当的简单和直观,我将就真正与.net remoting相关的3行代码中的每一行进行解释。

tcpserverchannel是.net remoting支持的二种信道类型中的一种,它将设置我们希望我们的对象对来自哪一个端口的请求进行回应,channelservices.registerchannel将把该端口号与操作系统中的tcp/ip栈绑定。

tcpserverchannel channel = new tcpserverchannel(9932);

channelservices.registerchannel(channel);

另一种可以设置的信道类型是http,只要简单地使用system.runtime.remoting.channels.http名字空间中的httpserverchannel对象即可搞定。使用http和tcp信道之间的区别可以简单的归结为:如果应用程序是在局域网上运行,则更好使用tcp信道,因为它的性能要好于http信道;如果应用程序是在互联网上运行,则有时候根据防火墙的配置,http是唯一的选择。需要记住的是,如果使用了防火墙软件,则防火墙应该配置成允许tcp数据流量通过你为对象选择的端口。

remotingconfiguration.registerwellknownservicetype(typeof(resumeloader),

”resumeloader”, wellknownobjectmode.singlecall);

这行代码设置了服务中的一些参数和把欲使用的对象名字与远程对象进行绑定,之一个参数是绑定的对象,第二个参数是tcp或http信道中远程对象名字的字符串,第三个参数让容器知道,当有对对象的请求传来时,应该如何处理对象。尽管wellknownobjectmode.single对所有的调用者使用一个对象的实例,但它为每个客户生成这个对象的一个实例。

完整的对象代码如下所示:

using system;

using system.runtime;

using system.runtime.remoting;

using system.runtime.remoting.channels;

using system.runtime.remoting.channels.tcp;

using system.data.sqlclient;

using dotnetremotetest;

namespace resumeserverserver

public class resumesuperserver

public static void main(string args)

tcpserverchannel channel = new tcpserverchannel(9932);

channelservices.registerchannel(channel);

remotingconfiguration.registerwellknownservicetype(typeof(resumeloader),

”resumeloader”, wellknownobjectmode.singlecall);

system.console.writeline(“press any key”);

system.console.readline();

编译这一程序并注意生成的.exe文件的位置。

第三步:创建remote客户端程序

resumeclinet是我们为对在上面创建的resumesuperserver远和对象进行测试而创建的。要创建这一工程,可以依次点击“文件”->“创建”->“工程”,然后选择创建一个console application类型、名字为resumeclient的工程名。象在第二步中那样,我们需要添加对在之一步中创建的dll文件和system.runtime.remoting dll的引用。

下面的代码中有二行对于.net remoting而言是特别重要的。之一行创建了一个tcp客户端信道,该信道并不是绑定在一个端口上的;第二行获取了一个对远程的resumeloader对象的引用。activator.getobject方法返回一个对象类型的值,我们随后会将它返回的值赋予resumeloader。我们传给它的参数与在服务器工程中传递给remotingconfiguration的参数非常地相似,之一个参数是对象类型的,第二个参数是远程对象的uri。

channelservices.registerchannel(new tcpclientchannel());

resumeloader loader = (resumeloader)activator.getobject(

typeof(resumeloader), ”

resumeclient的全部代码如下所示:

using system;

using system.runtime.remoting;

using system.runtime.remoting.channels;

using system.runtime.remoting.channels.tcp;

using dotnetremotetest;

namespace resumeclient

public class resumeclient

public static void main(string args)

channelservices.registerchannel(new tcpclientchannel());

resumeloader loader = (resumeloader)activator.getobject(

typeof(resumeserver), ”

if(rs==null)

{ console.writeline(“unable to get remote referance”); }

resume resume = loader.getresumebyuserid(1);

console.writeline(“resumeid:”+ resume.resumeid);

console.writeline(“userid:”+ resume.userid);

console.writeline(“title:”+ resume.title);

console.writeline(“body:”+ resume.body);

console.readline();//在能够看到结果前不让窗口关闭

}//end of main method

remoting

}//end of resumeclient object

}//end of resumeclientnamespace

测试

在数据库中创建一个具有如下结构的表:

table name-resume

resumeid, numeric (autonumber)

userid, numeric

title, char(30)

双击我们在第二步中创建的server.exe,然后双击在第三步中创建的client可执行文件。如果一切正常的话,我们应该能够看到数据库中resumeid的值为1的记录行。

关于remoting 访问数据库的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。


.net最常用的架构有哪些?

最长用的还是三层架构。 1. UI Tier(User Interface, 用户接口层)表示层完成向用户展示界面,提供进一步操作的“驱动接口”,例如按钮,并显示结果。 2. Business Tier(商业层)完成数据加工,提供加工后的数据给表示层,或者数据层。 又可以分为 BLL(Business Logic Layer, 商业逻辑)和DAL(Data Access Layer, 数据访问)。 DAL负责存取数据,BLL负责对DAL层操作,对数据进行运算和操作。 BLL也负责响应表示层的事件。 3. Data Tier(数据层)完成数据存储功能。 可能是数据库、数据源、XML、文本文件等。 这样就把 数据、业务、显示 分开了。 UI层只负责显示给用户看,至于数据怎么处理运算,由BLL进行并响应,处理完的数据,怎么存取由DAL层进行,数据怎么存在介质上由Data层完成,DAL就不用管。 各层之间相对比较独立,物理依赖性就不那么高了,有时候就只需要编译改动过的层。 一般对开发和设计人员来说,只需要对UI, BLL, DAL 进行设计开发,DATA Tier由OS或者DBMS来进行,你只需要按“格式”来存取数据即可。 “三层结构的程序不是说把项目分成DAL, BLL, WebUI三个模块就叫三层了, 下面几个问题在你的项目里面:1. UILayer里面只有少量(或者没有)的SQL语句或者存储过程调用, 并且这些语句保证不会修改数据?2. 如果把UILayer拿掉, 你的项目还能在Interface/API的层次上提供所有功能吗?3. 你的DAL可以移植到其他类似环境的项目吗?4. 三个模块, 可以分别运行于不同的服务器吗?如果不是所有答案都为YES, 那么你的项目还不能算是严格意义上的三层程序. 三层程序有一些需要约定遵守的规则:1. 最关键的, UI层只能作为一个外壳, 不能包含任何BizLogic的处理过程2. 设计时应该从BLL出发, 而不是UI出发. BLL层在API上应该实现所有BizLogic, 以面向对象的方式3. 不管数据层是一个简单的SqlHelper也好, 还是带有Mapping过的Classes也好, 应该在一定的抽象程度上做到系统无关4. 不管使用COM+(Enterprise Service), 还是Remoting, 还是WebService之类的远程对象技术, 不管部署的时候是不是真的分别部署到不同的服务器上, 最起码在设计的时候要做这样的考虑, 更远的, 还得考虑多台服务器通过负载均衡作集群所以考虑一个项目是不是应该应用三层/多层设计时, 先得考虑下是不是真的需要? 实际上大部分程序就开个WebApplication就足够了, 完全没必要作的这么复杂. 而多层结构, 是用于解决真正复杂的项目需求的.”而且三层之间有时候也不用那么严格,得根据实际业务逻辑来判断使用。 这也是软件开发所以没有一个固定流程的原因。 还有个俺收藏得UI层:浏览器 —— 要考虑一下不同的浏览器、和插件若干js脚本 —— ajax这一类的,数据验证了什么的。 显示数据 —— 放在 页面提供数据 —— 放在 页面逻辑层:业务逻辑 —— 承上启下,但是大多数情况只用一行代码就可以实现了。 数据逻辑 —— 组合SQL语句,存储过程的话就是给参数赋值了数据层:SQLHelp —— 具有类似功能的东东数据库里的存储过程 —— 不用存储过程的话就略掉数据库里的视图 —— 同上,我比较喜欢用数据库里的表 —— 基础的东东了,对于客户来说,里面的数据是最最重要的了。

如何成为系统架构师?

架构师首先必须具有丰富的开发经验,是个技术主管。 因为他必须清楚什么是可以实现的,实现的方式有哪些,相应的难度怎么样,实现出来的系统面对需求变化的适应性等一系列指标。 另外,需要对面向过程、面向对象、面向服务等设计理念有深刻的理解,可以快速的察觉出实现中的问题并提出相应的改进(重构)方案(也就是通常说的反模式)。 这些都需要长期的开发实践才能真正的体会到,单从书本上很难领会到,就算当时理解了也不一定能融会到实践中去。 在技术能力上,软件架构师最重要也是最需要掌握的知识是构件通信机制方面的知识,包括进程内通信(对象访问、函数调用、数据交换、线程同步等)以及进程外(包括跨计算机)的通信(如RMI、DCOM、Web Service)。 在WEB应用大行其道的今天,开发者往往对服务器间的通信关注的比较多,而对进程内的通信较少关注。 进程外跨机器通信是构建分布式应用的基石,它是架构设计中的鸟瞰视图;而进程内的通信是模块实现的骨架,它是基石的基石。 如果具体到一个基于企业级架构设计,首先需要的是语言级别的认识,包括的CLR、继承特性、委托和事件处理等。 然后是常用解决方案的认识,包括 Web Service、 Remoting、企业服务组件等。 总之,丰富的开发实践经验有助于避免架构师纸上谈兵式的高来高去,给代码编写人员带来实实在在的可行性。 其次,具有足够的行业业务知识和商业头脑也是很重要的。 行业业务知识的足够把握可以给架构师更多的拥抱变化的能力,可以在系统设计的时候留出一些扩展的余地来适应可能来临的需求变化。 有经验的设计人员可能都碰到过这样的事,一厢情愿的保留接口在需求变化中的命中率非常低。 也就是说,在系统设计之初为扩展性留下来的系统接口没能在需求变化的洪流中发挥真正的作用,因为需求的变化并没有按照预想的方向进行,到最后还是不得不为变化的业务重新设计系统。 这就是因为对业务知识的理解和对市场或者商业的判断没有达到一个实用的、可以为架构扩展性服务的水平。 再次,架构设计师对人的关注必须提升到架构设计之初来纳入考虑的范围,包括沟通以及对人员素质的判断。 软件过程是团队协作共同构建系统的过程,沟通能力是将整个过程中多条开发线粘合在一起的胶水。 大家都应该碰到过事后说“原来是这样啊,我不知道啊”或者某个开发人员突然高声呼喊“为什么这里的数据没有了”之类的。 沟通的目的就是尽量避免多条开发线的混乱,让系统构建过程可以有条理的高效进行。 另外,对人的关注还表现在对团队成员的素质判断上,比如哪些开发人员对哪些技术更熟悉,或者哪些开发人员容易拖进度等。 只有合理的使用人力资源,让合适的人做合适的事情才能让整个软件过程更加高效。 架构师应时刻注意新软件设计和开发方面的发展情况,并不断探索更有效的新方法、开发语言、设计模式和开发平台不断很快地升级,软件架构师需要吸收这些新技术新知识,并将它们用于软件系统开发工作中。 但对新技术的探索应该在一个理性的范围内进行,不能盲目的跟风。 解决方案提供商永远都希望你能使用它提供的最新技术,而且它们在推广自己的解决方案的时候往往是以自己的产品为中心,容易给人错觉。 比如数据库,往往让人觉得它什么都能做,只要有了它其它什么都不重要了。 但事实上并不是如此,对于小型应用可以将许多业务逻辑用script的方式放入数据库中,但很少看到大型应用采用这样的做法。 对于新东西需要以一种比较的观点来判断,包括横向的比较和纵向的比较,最后得出一些性能、可移植性以及可升级等指标。 另外,新入行的开发人员往往关心新技术动向而忽略了技术的历史,而从DOS时代一路杀过来的开发者就对现在的技术体系有较全面的把握。

puwer-spring

1.1.1 Spring是什么 Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发。 应用程序是由一组相互协作的对象组成。 而在传统应用程序开发中,一个完整的应用是由一组相互协作的对象组成。 所以开发一个应用除了要开发业务逻辑之外,最多的是关注如何使这些对象协作来完成所需功能,而且要低耦合、高内聚。 业务逻辑开发是不可避免的,那如果有个框架出来帮我们来创建对象及管理这些对象之间的依赖关系。 可能有人说了,比如“抽象工厂、工厂方法设计模式”不也可以帮我们创建对象,“生成器模式”帮我们处理对象间的依赖关系,不也能完成这些功能吗?可是这些又需要我们创建另一些工厂类、生成器类,我们又要而外管理这些类,增加了我们的负担,如果能有种通过配置方式来创建对象,管理对象之间依赖关系,我们不需要通过工厂和生成器来创建及管理对象之间的依赖关系,这样我们是不是减少了许多工作,加速了开发,能节省出很多时间来干其他事。 Spring框架刚出来时主要就是来完成这个功能。 Spring框架除了帮我们管理对象及其依赖关系,还提供像通用日志记录、性能统计、安全控制、异常处理等面向切面的能力,还能帮我管理最头疼的数据库事务,本身提供了一套简单的JDBC访问实现,提供与第三方数据访问框架集成(如Hibernate、JPA),与各种Java EE技术整合(如Java Mail、任务调度等等),提供一套自己的web层框架Spring MVC、而且还能非常简单的与第三方web框架集成。 从这里我们可以认为Spring是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力,从而使我们可以更自由的选择到底使用什么技术进行开发。 而且不管是JAVA SE(C/S架构)应用程序还是JAVA EE(B/S架构)应用程序都可以使用这个平台进行开发。 让我们来深入看一下Spring到底能帮我们做些什么? 1.1.2 Spring能帮我们做什么 Spring除了不能帮我们写业务逻辑,其余的几乎什么都能帮助我们简化开发: 一、传统程序开发,创建对象及组装对象间依赖关系由我们在程序内部进行控制,这样会加大各个对象间的耦合,如果我们要修改对象间的依赖关系就必须修改源代码,重新编译、部署;而如果采用Spring,则由Spring根据配置文件来进行创建及组装对象间依赖关系,只需要改配置文件即可,无需重新编译。 所以,Spring能帮我们根据配置文件创建及组装对象之间的依赖关系。 二、当我们要进行一些日志记录、权限控制、性能统计等时,在传统应用程序当中我们可能在需要的对象或方法中进行,而且比如权限控制、性能统计大部分是重复的,这样代码中就存在大量重复代码,即使有人说我把通用部分提取出来,那必然存在调用还是存在重复,像性能统计我们可能只是在必要时才进行,在诊断完毕后要删除这些代码;还有日志记录,比如记录一些方法访问日志、数据访问日志等等,这些都会渗透到各个要访问方法中;还有权限控制,必须在方法执行开始进行审核,想想这些是多么可怕而且是多么无聊的工作。 如果采用Spring,这些日志记录、权限控制、性能统计从业务逻辑中分离出来,通过Spring支持的面向切面编程,在需要这些功能的地方动态添加这些功能,无需渗透到各个需要的方法或对象中;有人可能说了,我们可以使用“代理设计模式”或“包装器设计模式”,你可以使用这些,但还是需要通过编程方式来创建代理对象,还是要耦合这些代理对象,而采用Spring 面向切面编程能提供一种更好的方式来完成上述功能,一般通过配置方式,而且不需要在现有代码中添加任何额外代码,现有代码专注业务逻辑。 所以,Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。 三、在传统应用程序当中,我们如何来完成数据库事务管理?需要一系列“获取连接,执行SQL,提交或回滚事务,关闭连接”,而且还要保证在最后一定要关闭连接,多么可怕的事情,而且也很无聊;如果采用Spring,我们只需获取连接,执行SQL,其他的都交给Spring来管理了,简单吧。 所以,Spring能非常简单的帮我们管理数据库事务。 四、Spring还提供了与第三方数据访问框架(如Hibernate、JPA)无缝集成,而且自己也提供了一套JDBC访问模板,来方便数据库访问。 五、Spring还提供与第三方Web(如Struts、JSF)框架无缝集成,而且自己也提供了一套Spring MVC框架,来方便web层搭建。 六、Spring能方便的与Java EE(如Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)。 Spring能帮我们做这么多事情,提供这么多功能和与那么多主流技术整合,而且是帮我们做了开发中比较头疼和困难的事情,那可能有人会问,难道只有Spring这一个框架,没有其他选择?当然有,比如EJB需要依赖应用服务器、开发效率低、在开发中小型项目是宰鸡拿牛刀,虽然发展到现在EJB比较好用了,但还是比较笨重还需要依赖应用服务器等。 那为何需要使用Spring,而不是其他框架呢?让我们接着往下看。 1.1.3 为何需要Spring 一 首先阐述几个概念 1、应用程序:是能完成我们所需要功能的成品,比如购物网站、OA系统。 2、框架:是能完成一定功能的半成品,比如我们可以使用框架进行购物网站开发;框架做一部分功能,我们自己做一部分功能,这样应用程序就创建出来了。 而且框架规定了你在开发应用程序时的整体架构,提供了一些基础功能,还规定了类和对象的如何创建、如何协作等,从而简化我们开发,让我们专注于业务逻辑开发。 3、非侵入式设计:从框架角度可以这样理解,无需继承框架提供的类,这种设计就可以看作是非侵入式设计,如果继承了这些框架类,就是侵入设计,如果以后想更换框架之前写过的代码几乎无法重用,如果非侵入式设计则之前写过的代码仍然可以继续使用。 4、轻量级及重量级:轻量级是相对于重量级而言的,轻量级一般就是非入侵性的、所依赖的东西非常少、资源占用非常少、部署简单等等,其实就是比较容易使用,而重量级正好相反。 5、POJO:POJO(Plain Old Java Objects)简单的Java对象,它可以包含业务逻辑或持久化逻辑,但不担当任何特殊角色且不继承或不实现任何其它Java框架的类或接口。 6、容器:在日常生活中容器就是一种盛放东西的器具,从程序设计角度看就是装对象的的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期。 7、控制反转:即Inversion of Control,缩写为IoC,控制反转还有一个名字叫做依赖注入(Dependency Injection),就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。 8、Bean:一般指容器管理对象,在Spring中指Spring IoC容器管理对象。 二 为什么需要Spring及Spring的优点 ● 非常轻量级的容器:以集中的、自动化的方式进行应用程序对象创建和装配,负责对象创建和装配,管理对象生命周期,能组合成复杂的应用程序。 Spring容器是非侵入式的(不需要依赖任何Spring特定类),而且完全采用POJOs进行开发,使应用程序更容易测试、更容易管理。 而且核心JAR包非常小,Spring3.0.5不到1M,而且不需要依赖任何应用服务器,可以部署在任何环境(Java SE或Java EE)。 ● AOP:AOP是Aspect Oriented Programming的缩写,意思是面向切面编程,提供从另一个角度来考虑程序结构以完善面向对象编程(相对于OOP),即可以通过在编译期间、装载期间或运行期间实现在不修改源代码的情况下给程序动态添加功能的一种技术。 通俗点说就是把可重用的功能提取出来,然后将这些通用功能在合适的时候织入到应用程序中;比如安全,日记记录,这些都是通用的功能,我们可以把它们提取出来,然后在程序执行的合适地方织入这些代码并执行它们,从而完成需要的功能并复用了这些功能。 ● 简单的数据库事务管理:在使用数据库的应用程序当中,自己管理数据库事务是一项很让人头疼的事,而且很容易出现错误,Spring支持可插入的事务管理支持,而且无需JEE环境支持,通过Spring管理事务可以把我们从事务管理中解放出来来专注业务逻辑。 ● JDBC抽象及ORM框架支持:Spring使JDBC更加容易使用;提供DAO(数据访问对象)支持,非常方便集成第三方ORM框架,比如Hibernate等;并且完全支持Spring事务和使用Spring提供的一致的异常体系。 ● 灵活的Web层支持:Spring本身提供一套非常强大的MVC框架,而且可以非常容易的与第三方MVC框架集成,比如Struts等。 ● 简化各种技术集成:提供对Java Mail、任务调度、JMX、JMS、JNDI、EJB、动态语言、远程访问、Web Service等的集成。 Spring能帮助我们简化应用程序开发,帮助我们创建和组装对象,为我们管理事务,简单的MVC框架,可以把Spring看作是一个超级粘合平台,能把很多技术整合在一起,形成一个整体,使系统结构更优良、性能更出众,从而加速我们程序开发,有如上优点,我们没有理由不考虑使用它。 1.1.4 如何学好Spring 要学好Spring,首先要明确Spring是个什么东西,能帮我们做些什么事情,知道了这些然后做个简单的例子,这样就基本知道怎么使用Spring了。 Spring核心是IoC容器,所以一定要透彻理解什么是IoC容器,以及如何配置及使用容器,其他所有技术都是基于容器实现的;理解好IoC后,接下来是面向切面编程,首先还是明确概念,基本配置,最后是实现原理,接下来就是数据库事务管理,其实Spring管理事务是通过面向切面编程实现的,所以基础很重要,IoC容器和面向切面编程搞定后,其余都是基于这俩东西的实现,学起来就更加轻松了。 要学好Spring不能急,一定要把基础打牢,基础牢固了,这就是磨刀不误砍柴工。 1.2 Spring基础 1.2.1 Spring架构图 图 1-1 Spring架构图 核心容器:包括Core、Beans、Context、EL模块。 ● Core模块:封装了框架依赖的最底层部分,包括资源访问、类型转换及一些常用工具类。 ● Beans模块:提供了框架的基础部分,包括反转控制和依赖注入。 其中Bean Factory是容器核心,本质是“工厂设计模式”的实现,而且无需编程实现“单例设计模式”,单例完全由容器控制,而且提倡面向接口编程,而非面向实现编程;所有应用程序对象及对象间关系由框架管理,从而真正把你从程序逻辑中把维护对象之间的依赖关系提取出来,所有这些依赖关系都由BeanFactory来维护。 ● Context模块:以Core和Beans为基础,集成Beans模块功能并添加资源绑定、数据验证、国际化、Java EE支持、容器生命周期、事件传播等;核心接口是ApplicationContext。 ● EL模块:提供强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从Spring 容器获取Bean,它也支持列表投影、选择和一般的列表聚合等。 AOP、Aspects模块: ● AOP模块:Spring AOP模块提供了符合 AOP Alliance规范的面向方面的编程(aspect-oriented programming)实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中;这样各专其职,降低业务逻辑和通用功能的耦合。 ● Aspects模块:提供了对AspectJ的集成,AspectJ提供了比Spring ASP更强大的功能。 数据访问/集成模块:该模块包括了JDBC、ORM、OXM、JMS和事务管理。 ● 事务模块:该模块用于Spring管理事务,只要是Spring管理对象都能得到Spring管理事务的好处,无需在代码中进行事务控制了,而且支持编程和声明性的事物管理。 ● JDBC模块:提供了一个JBDC的样例模板,使用这些模板能消除传统冗长的JDBC编码还有必须的事务控制,而且能享受到Spring管理事务的好处。 ● ORM模块:提供与流行的“对象-关系”映射框架的无缝集成,包括Hibernate、JPA、Ibatiss等。 而且可以使用Spring事务管理,无需额外控制事务。 ● OXM模块:提供了一个对Object/XML映射实现,将java对象映射成XML数据,或者将XML数据映射成java对象,Object/XML映射实现包括JAXB、Castor、XMLBeans和XStream。 ● JMS模块:用于JMS(Java Messaging Service),提供一套 “消息生产者、消息消费者”模板用于更加简单的使用JMS,JMS用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。 ● Web/Remoting模块:Web/Remoting模块包含了Web、Web-Servlet、Web-Struts、Web-Porlet模块。 ● Web模块:提供了基础的web功能。 例如多文件上传、集成IoC容器、远程过程访问(RMI、Hessian、Burlap)以及Web Service支持,并提供一个RestTemplate类来提供方便的Restful services访问。 ● Web-Servlet模块:提供了一个Spring MVC Web框架实现。 Spring MVC框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的JSP标签,完全无缝与Spring其他技术协作。 ● Web-Struts模块:提供了与Struts无缝集成,Struts1.x 和Struts2.x都支持 Test模块: Spring支持Junit和TestNG测试框架,而且还额外提供了一些基于Spring的测试功能,比如在测试Web框架时,模拟Http请求的功能。 1.2.2 典型应用场景 Spring可以应用到许多场景,从最简单的标准Java SE程序到企业级应用程序都能使用Spring来构建。 以下介绍几个比较流行的应用场景: ● 典型Web应用程序应用场景: 图1-2 web应用程序应用场景 在Web应用程序应用场景中,典型的三层架构:数据模型层实现域对象;数据访问层实现数据访问;逻辑层实现业务逻辑;web层提供页面展示;所有这些层组件都由Spring进行管理,享受到Spring事务管理、AOP等好处,而且请求唯一入口就是DispachterServlet,它通过把请求映射为相应web层组件来实现相应请求功能。 ● 远程访问应用场景: Spring能非常方便的提供暴露RMI服务,远程访问服务如Hessian、Burlap等,实现非常简单只需通过在Spring中配置相应的地址及需要暴露的服务即可轻松实现,后边会有介绍; ● EJB应用场景: Spring也可以与EJB轻松集成,后边会详细介绍。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐