资讯

展开

spring攻略 第2版 源码,驱魔觉醒任务 详细

作者:本站作者

1,驱魔觉醒任务 详细

觉醒任务流程:第一步,与npc对话 第二步,400决斗点; 获得 加属性道具两个 第三步,2次遗迹 无难度要求; 获得 加属性道具一个 第四步,2次机械牛 无难度要求; 获得 加属性道具一个 第五步,50个泰拉石; 获得 加属性道具两个 第六步,生产一张图;材料:10个大蓝、30个黑曜石生产的暗影石、200个特级硬化剂、100个特级砥石、45个任务道具(遗迹和机械牛图中获得);获得 20SP最后,觉醒完成。

spring攻略 第2版 源码,驱魔觉醒任务 详细

2,spring源码深度解析第二版高清pdf下载在线阅读全文求百度网盘云

《spring源码深度解析第二版高清》百度网盘pdf最新全集下载:链接: https://pan.baidu.com/s/1k5SzFRYLbqE5Febp-v4bUAspring源码深度解析第二版高清.pdf95.05M 来自:百度网盘提取码: ht4h复制提取码跳转?pwd=ht4h 提取码: ht4h简介:从核心实现和企业应用两个方面,由浅入深、由易到难地对Spring源码展开了系统的讲解,包括Spring的设计理念和整体架构、容器的基本实现等内容都有介绍。

spring攻略 第2版 源码,驱魔觉醒任务 详细

3,求The Mystery of the Crimson Manor 手机游戏攻略急急急

恐怖庄园的秘密攻略: 打开盒子 点击照片,游戏开始。 1.石头阶梯旁边有松动的砖,点击得到大门钥匙,进门 2.进门是楼梯间,调查壁画得到半张纸条。进入左边房间,得到火柴 3.上2楼,右边第一间房间得到蝴蝶宝石,记录旁边壁画车子轮子白色的位置。 4.2楼右边第二间房间,拿鱼缸,床下面得到象棋。 5.回到一楼,进入右边第一间房,桌子上放入象棋,得到2楼左边第一道门的钥匙 6.上到2楼左边第一间房,点箱子玩拼图,很简单,完成后放入蝴蝶宝石,打开箱子得到磁铁,记录箱子底下图案的形状。 7.回到楼梯间,掀开地毯,使

spring攻略 第2版 源码,驱魔觉醒任务 详细

4,spring源码要怎么讲

《SPRING技术内幕——深入解析SPRING架构与设计原理》该书讲了spring的ioc容器原理,在xml的spring配置文件中,对象是如何解析并生成的。spring的aop,面向切面编程。这两块是比较重要的,属于核心部分。其他的如spring mvc ,spring jdbc与hibernate,ibatise集成,spring事务,spring security,spring 任务调度都有介绍。大体来说,属于跟着代码走向,一个类一个类介绍了一下。其实代码都是有英文注释的。跟着作都的思路看过来也还是可以的,最好是对照类图分析。

5,三国群英传2春天版秘籍

size=4][color=navy]步骤如下: 1、双击游戏启动器,会出现玩家认可协议,等几秒,单击“同意”,会跳出熟悉的“春天三国启动器”[/color][/size][size=4][color=navy]界面; 2、然后按Ctrl+Alt+Del键,单击“任务管理器”,单击该界面“进程”里的“春天之三国风...”,单[/color][/size][size=4][color=navy]击“结束进程”会出现“任务管理器警告”提示,先[color=red][b]不要[/b][/color]选择“是”; 3、换至“春天三国启动器”界面,将“任务管理器警告”窗口拖至启动器中“开始”的正上方(利于鼠[/color][/size][size=4][color=navy]标操作),在点击启动器“开始”后马上点击“任务管理器警告”中的“是”,然后就进入游戏了。 现在按Alt+Tab键,已经可以切出游戏界面了,喜欢无限搜索的人已经OK了
春天三国,如果是0505版,则还有KKON可以开启秘籍(开启后操作与DALL相同,不过不能使用R***来施放武将技) 如果是0507版本,则连KKON也被屏蔽了 祝你玩得愉快!!!
size=4][color=navy]步骤如下: 1、双击游戏启动器,会出现玩家认可协议,等几秒,单击“同意”,会跳出熟悉的“春天三国启动器”[/color][/size][size=4][color=navy]界面; 2、然后按Ctrl+Alt+Del键,单击“任务管理器”,单击该界面“进程”里的“春天之三国风...”,单[/color][/size][size=4][color=navy]击“结束进程”会出现“任务管理器警告”提示,先[color=red][b]不要[/b][/color]选择“是”; 3、换至“春天三国启动器”界面,将“任务管理器警告”窗口拖至启动器中“开始”的正上方(利于鼠[/color][/size][size=4][color=navy]标操作),在点击启动器“开始”后马上点击“任务管理器警告”中的“是”,然后就进入游戏了。 现在按Alt+Tab键,已经可以切出游戏界面了,喜欢无限搜索的人已经OK了
这个应该没有了 春天版修改EXE文件了 你可以去春天版官网去看看 你可以用修改器 最简单的金山游侠3即可改

6,如何评价spring源码深度解析

《SPRING技术内幕——深入解析SPRING架构与设计原理》该书讲了spring的ioc容器原理,在xml的spring配置文件中,对象是如何解析并生成的。spring的aop,面向切面编程。这两块是比较重要的,属于核心部分。其他的如spring mvc ,spring jdbc与hibernate,ibatise集成,spring事务,spring security,spring 任务调度都有介绍。大体来说,属于跟着代码走向,一个类一个类介绍了一下。其实代码都是有英文注释的。跟着作都的思路看过来也还是可以的,最好是对照类图分析。

7,赛尔号哈默咋打

  80级 血3000滴,常用绝招:龙王灭碎阵,龙爪闪空破,龙王波,龙之意志(这个很BT,所有能力全上升1等级,体力除外)   哈莫雷特:   属性:龙   身高:4000 cm   体重:80000 kg   方法:   哈莫雷特只吃水,火,草属性的招,并且每种属性只能打一次,打完就要换(如草系打完立即换水系的,水系打完换火系,火系打完换草系..............车轮战)但哈莫叔叔不是吃素的,也许换上另一只精灵时可能已经挂了。所以耗完它技能再说。   我的方法:   第一步:上一只能顶哈莫雷特一招龙王波,速度超过200的尤纳斯(也可以是180,但你一定是第一次去打)。拼老命的用暗影屏障(暗影屏障用完,也就是20次后,哈莫雷特就会用龙王波了,这时候补PP,也就是尤纳斯不能用暗影屏障了,所以前面要你们一定要顶得住它一招龙王波)。就这样,哈莫雷特没技能时,尤纳斯自杀!(也就是用灵魂附体,可以不用,因为自杀之后会帮下一只精灵提升特功和特防的)   第二步:轮到我们欺负它了!先上依依,用浓缩汁液(因为哈莫雷特没技能前会用很多招龙之意志,用浓缩汁液消掉他的增强效果)然后上水系(推荐用BLKK,鲁斯王也不错哦,我就是用鲁斯王的),强化技能使3次,水天一色1次,浪打千击1次,换火系(里奥斯),强化技能使3次,降他防的也用3次,大招1次,在上草系,依然强化3次,大招1次......就这样车轮战,总会成功的!   还有其他方法,我从网上的攻略中摘录了一些:   方法一:1.先上两只尼尔,用“空间跳跃”和“精神控制”耗哈莫雷特boss绝招,没有尼尔巴拉龟也可以,或用迪鲁卡的“精神控制”,也可以巴鲁斯“虚张声势”加防御,耗boss绝招。   2.如果哈莫雷特boss用了“龙之意志”防御特防超好,可用悠悠的“悠悠光线”解决。   3.现在开打,先上水系,然后上火系,接着上草系,就这样轮回,一定要按顺序,否则技能无效。这步要有点耐心,一般三只100级的十几分钟便解决了。   注意:1.悠悠不必升级很高,因为boss绝招没了,会“悠悠光线”即可。   2.中毒、寄生、冻伤、烧伤等附加情况皆没有用。   3.备足药,加血,加PP值。   方法二:1.先上派鲁基达,用钢铁意志,3次,之后哈莫雷特打你一次你就一次100或150和体力药,如果它用龙之意志你就用派派光线,慢慢的它就没招了。   2.上布鲁克克用蓝光水泵或者其他水系精灵水系技能,再上里奥斯用烈火燎原或者其他火系精灵火系技能,在上布布花用飞叶风暴或者其他草系精灵草系技能,没招了就用活力药,慢慢打,最后就把哈莫雷特给打死。   进化:哈莫-哈莫雷特   难度:极难,几乎不可能   综合评分:200分

8,spring源码深度解析这本书怎么样

您好,希望以下回答能帮助您《SPRING技术内幕——深入解析SPRING架构与设计原理》该书讲了spring的ioc容器原理,在xml的spring配置文件中,对象是如何解析并生成的。spring的aop,面向切面编程。这两块是比较重要的,属于核心部分。其他的如spring mvc ,spring jdbc与hibernate,ibatise集成,spring事务,spring security,spring 任务调度都有介绍。大体来说,属于跟着代码走向,一个类一个类介绍了一下。其实代码都是有英文注释的。跟着作都的思路看过来也还是可以的,最好是对照类图分析。如您还有疑问可继续追问。

9,爱普生打印机错误代码0x9a解决方法

根据您的描述,可能因为打印机内部有异物造成打印头无法归位。请您进行以下操作:1. 如果是新购买的产品,请确保产品内外部的蓝色胶带已全部去除;2. 关闭打印机电源,打开打印机盖,从走纸通道中取出打印纸或其他阻塞物。3.检查墨盒舱盖是否盖紧:打开墨盒舱盖,向下推墨盒直到锁定到位(发出咔嗒声),并合上墨盒舱盖直到发出咔嗒声4. 重新打开打印机电源,检查指示灯状态是否恢复正常。如果故障仍旧存在,请您与爱普生授权服务中心联系对打印机进行进一步检测。您可浏览以下网址查看就近的服务中心:http://www.epson.com.cn/apps/tech_support/InstitutesSearch.aspx提示:冬季注意工作环境温度,打印机工作环境温度是10-35度之间,温度过低时打印机字车导轨的润滑剂凝固,也会影响字车移动,请将打印机放置在正常温度1个小时后再使用。若以上方案仍无法解决您的问题,请您登陆爱普生官网的“在线工程师”:点击以下链接https://www.epson.com.cn/apps/tech_support/,进入爱普生官方网站,滑动到中间位置,最左方,点击“工程师在线”实时与爱普生工程师在线交流,以便问题得到及时解决。(爱普生“在线工程师”服务时间:周一至周五8:30-18:00)
根据您的描述,可能因为打印机内部有异物造成打印头无法归位。解决方法如下:1. 如果是新购买的产品,请确保产品内外部的蓝色胶带已全部去除;2. 关闭打印机电源,打开打印机盖,从走纸通道中取出打印纸或其他阻塞物。3.检查墨盒舱盖是否盖紧:打开墨盒舱盖,向下推墨盒直到锁定到位(发出咔嗒声),并合上墨盒舱盖直到发出咔嗒声。4. 重新打开打印机电源,检查指示灯状态是否恢复正常。提示:冬季注意工作环境温度,打印机工作环境温度是10-35度之间,温度过低时打印机字车导轨的润滑剂凝固,也会影响字车移动,请将打印机放置在正常温度1个小时后再使用。
Ox9A代码:一是打印头感应器坏了。二是主板上的F1或F2保险管烧了(此件很细小,一般很难发现)。三是打印头真的坏了。
不同品牌的打印机,安装驱动程序也不太一致,但大同小异,互为借鉴,以EPSON LQ—1600K4为例,看打印机驱动程序安装步骤。 一、使用系统自带的驱动程序 1、“开始”—“打印机和传真”,点击左边窗格中“添加打印机”, 打开“欢迎添加打印机向导”对话框,点击“下一步”,打开“本地或网络打印机”选择连接对话框; 2、选择第一项“连接到此计算机的本地打印机”,勾选“自动检测并安装即插即用打印机”,点“下一步”,打开“新打印机检测”对话框; 3、检测后,打“下一步”,打开“选择打印机端口”对话框; 4、点选“使用以下端口”,在右边的下拉列表中 选择推荐的打印机端口“LPT1:”,点击“下一步”,打开“安装打印机软件”对话框; 5、在“厂商”列表中,点击厂商名,在“打印机”列表中,点击打印机名,点击“下一步”,打开“命名打印机”对话框; 6、在“打印机名”文本框中输入打印机名,点击“下一步”,打开“打印机共享”对话框; 7、点选“不共享这台打印机”,打“下一步”,打开“打印测试页”对话框; 8、选否“否”,打“下一步”,统即日自动搜索电脑自带打印机软件进行安装; 9、点击完成。 二、使用打印机带的驱动程序 如果系统没有适合该打印机驱动程序,可用打印机附带的软盘、光盘软件安装驱动程序方法是: 将打印机驱动光盘放入光驱,打开光盘,点击安装,按向导要求一步一步进行,其步骤大大致是:选出择安装语言、本地打印机、安装方式、打印机型 号、端口、驱动程序位置、配置信息、正在进行安装、安装结束。 三、下载的驱动文件进行安装 系统内没有打印机驱动程序,又没有驱动光盘,可到“驱动之家”下载,下载后备用(有的需要解压)。安装方法可参照上边一、进行:在“安装打印机软件”对话框中(参照上边一、4、),选择“从磁盘安装”,打开“从磁盘安装”对话框,在“厂商文件复制来源”下拉列表中指定文件路径(如,A:\ ,D:\……\……)击“确定”对话框,系统即自动搜索装。
根据您的描述,可能因为打印机内部有异物造成打印头无法归位。请您进行以下操作:1. 如果是新购买的产品,请确保产品内外部的蓝色胶带已全部去除;2. 关闭打印机电源,打开打印机盖,从走纸通道中取出打印纸或其他阻塞物。3.检查墨盒舱盖是否盖紧:打开墨盒舱盖,向下推墨盒直到锁定到位(发出咔嗒声),并合上墨盒舱盖直到发出咔嗒声4. 重新打开打印机电源,检查指示灯状态是否恢复正常。

10,Spring技术内幕第2版深入解析Spring架构与设计原理epub下载在线

《Spring技术内幕(第2版)》(计文柯)电子书网盘下载免费在线阅读资源链接:链接: https://pan.baidu.com/s/1OtJibxtQOrIrxKHgHIiI-QSpring技术内幕_深入解析Spring架构与设计原理_第2版.epub9.43M 来自:百度网盘提取码: xwfa复制提取码跳转 提取码: xwfa 书名:Spring技术内幕(第2版)作者:计文柯豆瓣评分:6.0出版社:机械工业出版社出版年份:2012-2页数:399内容简介:《spring技术内幕:深入解析spring架构与计原理(第2版)》是国内唯一一本系统分析spring源代码的著作,也是spring领域的问鼎之作,由业界拥有10余年开发经验的资深java专家亲自执笔,java开发者社区和spring开发者社区联袂推荐。本书第1版不仅在内容上获得了读者的广泛好评,而且在销量上也摘取了同类书的桂冠,曾经一度掀起java类图书的销售热潮。第2版不仅继承了第1版在内容组织和写作方式上的优点,而且还根据广大读者的反馈改进了若干细节上的不足。更为重要的是,结合spring的最新版本对过时的内容进行了更新,并增加了大量新内容,使本书更趋近于完美。《spring技术内幕:深入解析spring架构与计原理(第2版)》从源代码的角度对spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从本书中参透spring框架的优秀架构和设计思想,还能从spring优雅的实现源码中一窥java语言的精髓。本书在开篇之前对spring的设计理念和整体架构进行了全面的介绍,能让读者从宏观上厘清spring各个功能模块之间的关系;第一部分详细分析了spring的核心:ioc容器和aop的实现,能帮助读者了解spring的运行机制;第二部分深入阐述了各种基于ioc容器和aop的java ee组件在spring中的实现原理;第三部分讲述了acegi安全框架、dm模块以及flex模块等基于spring的典型应用的设计与实现。无论你是java程序员、spring开发者,还是平台开发人员、系统架构师,抑或是对开源软件源代码着迷的代码狂人,都能从本书中受益。作者简介:计文柯,资深软件开发专家和项目经理,拥有10余年开发经验,对Spring等开源软件的应用和实现原理有深入研究和独到见解。产品研发和项目管理经验丰富,曾任职于华为技术、摩托罗拉等知名企业和硅谷移动互联网创业公司,在软件工程和项目管理方面积累了大量最佳实践。现在正在学习云计算,准备迎接即将爆发的计算革命。闲暇之余,他非常享受历史书籍带给他的快乐!

11,sqlsessiontemplate有几个方法

SqlSessionDaoSupport是一个抽象的支持类,用来为你提供SqlSession。调用getSqlSession()方法你会得到一个SqlSessionTemplate,这然后可以用于执行SQL方法,
首先, 通过翻阅源码,我们来整理一下mybatis进行持久化操作时重要的几个类:sqlsessionfactorybuilder:build方法创建sqlsessionfactory实例。sqlsessionfactory:创建sqlsession实例的工厂。sqlsession:用于执行持久化操作的对象,类似于jdbc中的connection。sqlsessiontemplate:mybatis提供的持久层访问模板化的工具,线程安全,可通过构造参数或依赖注入sqlsessionfactory实例。hibernate是与mybatis类似的orm框架,这里与hibernate进行一下对比,hibernate中对于connection的管理,是通过以下几个重要的类:sessionfactory:创建session实例的工厂,类似于mybatis中的sqlsessionfactory。session:用来执行持久化操作的对象,类似于jdbc中的connection。hibernatetemplate:hibernate提供的持久层访问模板化的工具,线程安全,可通过构造参数或依赖注入sessionfactory实例。在日常的开发中,我们经常需要这样对mybatis和spring进行集成,把sqlsessionfactory交给spring管理,通常情况下,我们这样配置:?123通过上面的配置,spring将自动创建一个sqlsessionfactory对象,其中使用到了org.mybatis.spring.sqlsessionfactorybean,其 是mybatis为spring提供的用于创建sqlsessionfactory的类,将在spring应用程序的上下文建议一下可共享的 mybatis sqlsessionfactory实例,我们可以通过依赖注入将sqlsessionfactory传递给mybatis的一些接口。 如果通过spring进行事务的管理,我们需要增加spring注解的事务管理机制,如下配置:?12345这样,我们就可以使用spring @transactional注解,进行事务的控制,表明所注释的方法应该在一个事务中运行。 spring将在事务成功完成后提交事务,在事务发生错误时进行异常回滚,而且,spring会将产生的mybatis异常转换成适当的 dataaccessexceptions,从而提供具体的异常信息。 下面,我们通过分析sqlsessionutils中getsession的源码,来详细的了解一下sqlsession的产生过程,源码如下:public static sqlsession getsqlsession(sqlsessionfactory sessionfactory, executortype executortype, persistenceexceptiontranslator exceptiontranslator) notnull(sessionfactory, "no sqlsessionfactory specified"); notnull(executortype, "no executortype specified"); sqlsessionholder holder = (sqlsessionholder) getresource(sessionfactory); if (holder != null && holder.issynchronizedwithtransaction()) if (holder.getexecutortype() != executortype) throw new transientdataaccessresourceexception("cannot change the executortype when there is an existing transaction"); } holder.requested(); if (logger.isdebugenabled()) logger.debug("fetched sqlsession [" + holder.getsqlsession() + "] from current transaction"); } return holder.getsqlsession(); } if (logger.isdebugenabled()) logger.debug("creating a new sqlsession"); } sqlsession session = sessionfactory.opensession(executortype); // register session holder if synchronization is active (i.e. a spring tx is active) // // note: the datasource used by the environment should be synchronized with the // transaction either through datasourcetxmgr or another tx synchronization. // further assume that if an exception is thrown, whatever started the transaction will // handle closing / rolling back the connection associated with the sqlsession. if (issynchronizationactive()) environment environment = sessionfactory.getconfiguration().getenvironment(); if (environment.gettransactionfactory() instanceof springmanagedtransactionfactory) if (logger.isdebugenabled()) logger.debug("registering transaction synchronization for sqlsession [" + session + "]"); } holder = new sqlsessionholder(session, executortype, exceptiontranslator); bindresource(sessionfactory, holder); registersynchronization(new sqlsessionsynchronization(holder, sessionfactory)); holder.setsynchronizedwithtransaction(true); holder.requested(); } else if (getresource(environment.getdatasource()) == null) if (logger.isdebugenabled()) logger.debug("sqlsession [" + session + "] was not registered for synchronization because datasource is not transactional"); } } else throw new transientdataaccessresourceexception( "sqlsessionfactory must be using a springmanagedtransactionfactory in order to use spring transaction synchronization"); } } } else if (logger.isdebugenabled()) logger.debug("sqlsession [" + session + "] was not registered for synchronization because synchronization is not active"); } } return session;}上面的getsession方法,会从spring的事务管理器中获取一个sqlsession或创建一个新的sqlsession,将试图从当前事务中得到一个sqlsession,然后,如果配置有事务管理器的工厂并且spring 的事务管理器是活跃的,它将会锁定当前事务的sqlsession,保证同步。主要是通过以下几个步骤进行sqlsession的创建:它会首先获取sqlsessionholder,sqlsessionholder用于在transactionsynchronizationmanager中保持当前的sqlsession。如果holder不为空,并且holder被事务锁定,则可以通过holder.getsqlsession()方法,从当前事务中获取sqlsession,即 fetched sqlsession from current transaction。如果不存在holder或没有被事务锁定,则会创建新的sqlsession,即 creating a new sqlsession,通过sessionfactory.opensession()方法。如果当前线程的事务是活跃的,将会为sqlsession注册事务同步,即 registering transaction synchronization for sqlsession。

12,如何查看spring源码

1.准备工作:在官网上下载了Spring源代码之后,导入Eclipse,以方便查询。2.打开我们使用Spring的项目工程,找到Web.xml这个网站系统配置文件,在其中找到Spring的初始化信息:<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>由配置信息可知,我们开始的入口就这里ContextLoaderListener这个监听器。在源代码中我们找到了这个类,它的定义是:public class ContextLoaderListener extends ContextLoaderimplements ServletContextListener …/*** Initialize the root web application context.*/public void contextInitialized(ServletContextEvent event) this.contextLoader = createContextLoader();if (this.contextLoader == null) this.contextLoader = this;}this.contextLoader.initWebApplicationContext(event.getServletContext());}...}该类继续了ContextLoader并实现了监听器,关于Spring的信息载入配置、初始化便是从这里开始了,具体其他阅读另外写文章来深入了解。二、关于IOC和AOP关于Spring IOC 网上很多相关的文章可以阅读,那么我们从中了解到的知识点是什么?1)IOC容器和AOP切面依赖注入是Spring是核心。IOC容器为开发者管理对象之间的依赖关系提供了便利和基础服务,其中Bean工厂(BeanFactory)和上下文(ApplicationContext)就是IOC的表现形式。BeanFactory是个接口类,只是对容器提供的最基本服务提供了定义,而DefaultListTableBeanFactory、XmlBeanFactory、ApplicationContext等都是具体的实现。接口:public interface BeanFactory //这里是对工厂Bean的转义定义,因为如果使用bean的名字检索IOC容器得到的对象是工厂Bean生成的对象,//如果需要得到工厂Bean本身,需要使用转义的名字来向IOC容器检索String FACTORY_BEAN_PREFIX = "&";//这里根据bean的名字,在IOC容器中得到bean实例,这个IOC容器就象一个大的抽象工厂,用户可以根据名字得到需要的bean//在Spring中,Bean和普通的JAVA对象不同在于://Bean已经包含了我们在Bean定义信息中的依赖关系的处理,同时Bean是已经被放到IOC容器中进行管理了,有它自己的生命周期Object getBean(String name) throws BeansException;//这里根据bean的名字和Class类型来得到bean实例,和上面的方法不同在于它会抛出异常:如果根名字取得的bean实例的Class类型和需要的不同的话。Object getBean(String name, Class requiredType) throws BeansException;//这里提供对bean的检索,看看是否在IOC容器有这个名字的beanboolean containsBean(String name);//这里根据bean名字得到bean实例,并同时判断这个bean是不是单件,在配置的时候,默认的Bean被配置成单件形式,如果不需要单件形式,需要用户在Bean定义信息中标注出来,这样IOC容器在每次接受到用户的getBean要求的时候,会生成一个新的Bean返回给客户使用 - 这就是Prototype形式boolean isSingleton(String name) throws NoSuchBeanDefinitionException;//这里对得到bean实例的Class类型Class getType(String name) throws NoSuchBeanDefinitionException;//这里得到bean的别名,如果根据别名检索,那么其原名也会被检索出来String[] getAliases(String name);}实现:XmlBeanFactory的实现是这样的:public class XmlBeanFactory extends DefaultListableBeanFactory //这里为容器定义了一个默认使用的bean定义读取器,在Spring的使用中,Bean定义信息的读取是容器初始化的一部分,但是在实现上是和容器的注册以及依赖的注入是分开的,这样可以使用灵活的 bean定义读取机制。private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);//这里需要一个Resource类型的Bean定义信息,实际上的定位过程是由Resource的构建过程来完成的。public XmlBeanFactory(Resource resource) throws BeansException this(resource, null);}//在初始化函数中使用读取器来对资源进行读取,得到bean定义信息。这里完成整个IOC容器对Bean定义信息的载入和注册过程public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throwsBeansException super(parentBeanFactory);this.reader.loadBeanDefinitions(resource);}

13,如何使用SqlSessionTemplate

工作中,需要学习一下MyBatis sqlSession的产生过程,翻看了mybatis-spring的源码,阅读了一些mybatis的相关doc,对mybatis sqlSession有了一些认知和理解,这里简单的总结和整理一下。 首先, 通过翻阅源码,我们来整理一下mybatis进行持久化操作时重要的几个类: SqlSessionFactoryBuilder:build方法创建SqlSessionFactory实例。 SqlSessionFactory:创建SqlSession实例的工厂。 SqlSession:用于执行持久化操作的对象,类似于jdbc中的Connection。 SqlSessionTemplate:MyBatis提供的持久层访问模板化的工具,线程安全,可通过构造参数或依赖注入SqlSessionFactory实例。 Hibernate是与MyBatis类似的orm框架,这里与Hibernate进行一下对比,Hibernate中对于connection的管理,是通过以下几个重要的类: SessionFactory:创建Session实例的工厂,类似于MyBatis中的SqlSessionFactory。 Session:用来执行持久化操作的对象,类似于jdbc中的Connection。 HibernateTemplate:Hibernate提供的持久层访问模板化的工具,线程安全,可通过构造参数或依赖注入SessionFactory实例。 在日常的开发中,我们经常需要这样对MyBatis和Spring进行集成,把sqlSessionFactory交给Spring管理,通常情况下,我们这样配置: ? 1 2 3 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> </bean> 通过上面的配置,Spring将自动创建一个SqlSessionFactory对象,其中使用到了org.mybatis.spring.SqlSessionFactoryBean,其 是MyBatis为Spring提供的用于创建SqlSessionFactory的类,将在Spring应用程序的上下文建议一下可共享的 MyBatis SqlSessionFactory实例,我们可以通过依赖注入将SqlSessionFactory传递给MyBatis的一些接口。 如果通过Spring进行事务的管理,我们需要增加Spring注解的事务管理机制,如下配置: ? 1 2 3 4 5 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <tx:annotation-driven/> 这样,我们就可以使用Spring @Transactional注解,进行事务的控制,表明所注释的方法应该在一个事务中运行。 Spring将在事务成功完成后提交事务,在事务发生错误时进行异常回滚,而且,Spring会将产生的MyBatis异常转换成适当的 DataAccessExceptions,从而提供具体的异常信息。 下面,我们通过分析SqlSessionUtils中getSession的源码,来详细的了解一下sqlSession的产生过程,源码如下: public static SqlSession getSqlSession(SqlSessionFactory sessionFactory, ExecutorType executorType, PersistenceExceptionTranslator exceptionTranslator) { notNull(sessionFactory, "No SqlSessionFactory specified"); notNull(executorType, "No ExecutorType specified"); SqlSessionHolder holder = (SqlSessionHolder) getResource(sessionFactory); if (holder != null && holder.isSynchronizedWithTransaction()) { if (holder.getExecutorType() != executorType) { throw new TransientDataAccessResourceException("Cannot change the ExecutorType when there is an existing transaction"); } holder.requested(); if (logger.isDebugEnabled()) { logger.debug("Fetched SqlSession [" + holder.getSqlSession() + "] from current transaction"); } return holder.getSqlSession(); } if (logger.isDebugEnabled()) { logger.debug("Creating a new SqlSession"); } SqlSession session = sessionFactory.openSession(executorType); // Register session holder if synchronization is active (i.e. a Spring TX is active) // // Note: The DataSource used by the Environment should be synchronized with the // transaction either through DataSourceTxMgr or another tx synchronization. // Further assume that if an exception is thrown, whatever started the transaction will // handle closing / rolling back the Connection associated with the SqlSession. if (isSynchronizationActive()) { Environment environment = sessionFactory.getConfiguration().getEnvironment(); if (environment.getTransactionFactory() instanceof SpringManagedTransactionFactory) { if (logger.isDebugEnabled()) { logger.debug("Registering transaction synchronization for SqlSession [" + session + "]"); } holder = new SqlSessionHolder(session, executorType, exceptionTranslator); bindResource(sessionFactory, holder); registerSynchronization(new SqlSessionSynchronization(holder, sessionFactory)); holder.setSynchronizedWithTransaction(true); holder.requested(); } else { if (getResource(environment.getDataSource()) == null) { if (logger.isDebugEnabled()) { logger.debug("SqlSession [" + session + "] was not registered for synchronization because DataSource is not transactional"); } } else { throw new TransientDataAccessResourceException( "SqlSessionFactory must be using a SpringManagedTransactionFactory in order to use Spring transaction synchronization"); } } } else { if (logger.isDebugEnabled()) { logger.debug("SqlSession [" + session + "] was not registered for synchronization because synchronization is not active"); } } return session; } 上面的getSession方法,会从Spring的事务管理器中获取一个SqlSession或创建一个新的SqlSession,将试图从当前事务中得到一个SqlSession,然后,如果配置有事务管理器的工厂并且Spring 的事务管理器是活跃的,它将会锁定当前事务的SqlSession,保证同步。主要是通过以下几个步骤进行SqlSession的创建: 它会首先获取SqlSessionHolder,SqlSessionHolder用于在TransactionSynchronizationManager中保持当前的SqlSession。 如果holder不为空,并且holder被事务锁定,则可以通过holder.getSqlSession()方法,从当前事务中获取sqlSession,即 Fetched SqlSession from current transaction。 如果不存在holder或没有被事务锁定,则会创建新的sqlSession,即 Creating a new SqlSession,通过sessionFactory.openSession()方法。 如果当前线程的事务是活跃的,将会为SqlSession注册事务同步,即 Registering transaction synchronization for SqlSession。
文章TAG:spring攻略  第2版  源码  驱魔觉醒任务  详细  Spring  攻略  第2  
相关教程
猜你喜欢