??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲福利电影在线观看,亚洲精品国产高清不卡在线,久久亚洲国产精品五月天http://www.tkk7.com/James-Wei/Warning:This site contains ADULT content, ensure that you've been 18 years old! If NOT,please leave immediately. zh-cnMon, 12 May 2025 07:02:09 GMTMon, 12 May 2025 07:02:09 GMT60EJB3学习ȝQ?Q?/title><link>http://www.tkk7.com/James-Wei/archive/2009/06/06/280366.html</link><dc:creator>J@mes</dc:creator><author>J@mes</author><pubDate>Sat, 06 Jun 2009 13:11:00 GMT</pubDate><guid>http://www.tkk7.com/James-Wei/archive/2009/06/06/280366.html</guid><wfw:comment>http://www.tkk7.com/James-Wei/comments/280366.html</wfw:comment><comments>http://www.tkk7.com/James-Wei/archive/2009/06/06/280366.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/James-Wei/comments/commentRss/280366.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/James-Wei/services/trackbacks/280366.html</trackback:ping><description><![CDATA[ȝQ?Q是针对EJB3的事务和安全中的容器理事务QCMTQ,BMT及安全部分放在ȝQ?Q中?br /> 完全是自己学习的心得Q还请前辈们指点?br /> <br />   <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco">EJB3</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: 'Times New Roman'">的事务与安全</span><span lang="EN-US" style="font-family: Monaco; mso-hansi-font-family: 'Times New Roman'"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco">EJB3</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">的是事务也符?/span><span lang="EN-US" style="font-family: Monaco">ACID</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q即原子性、一致性、隔d、持久性。这些特性与数据库事务一_需要强调的是一致性,在事务开始前Q系l是处于一U遵守业务规则和U束的一致状态下Q那么在事务提交或回滚之后,pȝ也必ȝ持这U一致性状态。在事务q行q程中不必处于不一致性状态,事务在这里就像一个沙(</span><span lang="EN-US" style="font-family: Monaco">sand-box</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco">EJB</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">中,事务也具有隔ȝ别的控制Q但一般不用通过</span><span lang="EN-US" style="font-family: Monaco">EJB</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">容器来控Ӟ而是在数据库资源q一U别来进行控制?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco"><o:p> </o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">要知道在</span><span lang="EN-US" style="font-family: Monaco">EJB</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">容器中,代码层面的所有操作最l都是{化ؓ两的数据库操作Q比如锁定和解锁数据库中的某行或某张表。事务日志来反映事务的变化,开始事务日志代表事务的开始,应用日志代表以提交该事务来结束,相反攑ּ日志׃表回滚事务而结束?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco"><o:p> </o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">资源理器(</span><span lang="EN-US" style="font-family: Monaco">Resource Manager</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q的概念是管理特定某U资源的事务的组件。这个概念不仅包括关pL据库pȝQ也可以使消息服务器或其他业务系l?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco"><o:p> </o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">如果只涉及一U单一资源的事务就UCؓ</span><span lang="EN-US" style="font-family: Monaco">local transaction</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">本地事务Q相反大多数企业应用都是需要涉及多U不同的资源。这时候就需要一U类型的lg来管理事务中多种资源Q这个组件称Z务管理器Q?/span><span lang="EN-US" style="font-family: Monaco">Transaction Manager</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q,它在多个理各自资源事务的资源管理之间进行协调和控制?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco"><o:p> </o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">分布式的事务理是通过一U称ZD式提交Q?/span><span lang="EN-US" style="font-family: Monaco">two-phase commit</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q的机制来完成。现在最为流行的分布式事务协议是</span><span lang="EN-US" style="font-family: Monaco">XA</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">协议Q?/span><span lang="EN-US" style="font-family: Monaco">XA Protocol</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q,</span><span lang="EN-US" style="font-family: Monaco">JavaEE</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">是通过该协议来完成分布式应用中的事务管理?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco"><o:p> </o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">事务理</span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco">JavaEE</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">中事务?/span><span lang="EN-US" style="font-family: Monaco">JTA</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q?/span><span lang="EN-US" style="font-family: Monaco">Java Transaction API</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q是建立?/span><span lang="EN-US" style="font-family: Monaco">Java Transaction Service</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">之上的服务)Q即</span><span lang="EN-US" style="font-family: Monaco">javax.tranaction.UserTransaction</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">接口Q容器在后台会自动管理大多数事务l节Q?/span><span lang="EN-US" style="font-family: Monaco">EJB</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">开发者只需控制开始和停止事务、徏立事务边界(</span><span lang="EN-US" style="font-family: Monaco">transaction boundary</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q以及是否提?/span><span lang="EN-US" style="font-family: Monaco">/</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">回滚业务卛_?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco">EJB3</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">中提供了两种具体的事务方式,卛_器管理的事务Q?/span><span lang="EN-US" style="font-family: Monaco">Container-managed transaction</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q?/span><span lang="EN-US" style="font-family: Monaco">CMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q和</span><span lang="EN-US" style="font-family: Monaco">bean</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">理的事务(</span><span lang="EN-US" style="font-family: Monaco">Bean-managed transaction</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q?/span><span lang="EN-US" style="font-family: Monaco">BMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q。其中前者是使用声明式地或通过部v描述W来理事务Q后者需要以昑ּ~码的方式来理。但需要注意的是在</span><span lang="EN-US" style="font-family: Monaco">EJB3</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">中,只有</span><span lang="EN-US" style="font-family: Monaco">SessionBean</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco">MessageDrivenBean</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">才支?/span><span lang="EN-US" style="font-family: Monaco">CMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco">BMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q?/span><span lang="EN-US" style="font-family: Monaco">JPA</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">中ƈ不直接依?/span><span lang="EN-US" style="font-family: Monaco">CMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco">BMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">。但是当Ӟ在Q?/span><span lang="EN-US" style="font-family: Monaco">JavaEE</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">容器中都可透明得插?/span><span lang="EN-US" style="font-family: Monaco">CMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco">BMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">的事务环境?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco">EJB3</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">中管理事务最单灵zȝ方式是采用容器管理事务,?/span><span lang="EN-US" style="font-family: Monaco">CMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco"><o:p> </o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">容器理的事务,֐思义Q容器来?#8220;事务开始、事务提交或回滚”。容器在调用Ҏ前开?/span><span lang="EN-US" style="font-family: Monaco">JTA</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">事务Q接着会调用业务方法,最后根据调用中发生的情况去军_是提交事务还是回滚事务。?/span><span lang="EN-US" style="font-family: Monaco">CMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">事务理Q只需x</span><span lang="EN-US" style="font-family: Monaco">@TransactionManagement</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco">@TransactionAttribute</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">注解Q同旉过</span><span lang="EN-US" style="font-family: Monaco">EJBContext</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">的方法来回滚事务?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco"><o:p> </o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco">1</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q?/span><span lang="EN-US" style="font-family: Monaco">@TransactionMangement</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">注解用于向容器标识该</span><span lang="EN-US" style="font-family: Monaco">bean</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">的事务管理是使用</span><span lang="EN-US" style="font-family: Monaco">CMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">q是</span><span lang="EN-US" style="font-family: Monaco">BMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q是通过该标{中?/span><span lang="EN-US" style="font-family: Monaco">value</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">属性来指明</span><span lang="EN-US" style="font-family: Monaco">TransactionManagementType</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">的枚丑ր{?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco"><o:p> </o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco">2</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q?/span><span lang="EN-US" style="font-family: Monaco">@TransactionAttribute</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">注解Q尽由容器为我们来理事务的各U细节,但是仍然需要通过该注解来告知容器如何去自动管理?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco">CMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">对事务的理可以在包?/span><span lang="EN-US" style="font-family: Monaco">bean</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">的方法时开始,也可以从调用者的事务中进?/span><span lang="EN-US" style="font-family: Monaco">join</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">开始?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco">TransactionAttributeType</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">有几个枚丑ր|</span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt; mso-list: l0 level1 lfo1"><span lang="EN-US" style="font-family: Monaco; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore">Q?Q?span style="font: 7pt 'Times New Roman'">      </span></span></span><span lang="EN-US" style="font-family: Monaco">REQUIRED</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q如果调用者没有事务,容器则创建新事务Q如果调用者具有事务,容器则连?/span><span lang="EN-US" style="font-family: Monaco">join</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">调用者事务?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt; mso-list: l0 level1 lfo1"><span lang="EN-US" style="font-family: Monaco; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore">Q?Q?span style="font: 7pt 'Times New Roman'">      </span></span></span><span lang="EN-US" style="font-family: Monaco">REQUIRED_NEW</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q如果调用者没有事务,容器创建新事务Q如果调用者有事务Q容器暂停原来事务,q创建新的事务?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt; mso-list: l0 level1 lfo1"><span lang="EN-US" style="font-family: Monaco; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore">Q?Q?span style="font: 7pt 'Times New Roman'">      </span></span></span><span lang="EN-US" style="font-family: Monaco">SUPPORTS</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q如果调用者没有事务,容器׃创徏事务Q反之则</span><span lang="EN-US" style="font-family: Monaco">join</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">q用调用者的事务?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt; mso-list: l0 level1 lfo1"><span lang="EN-US" style="font-family: Monaco; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore">Q?Q?span style="font: 7pt 'Times New Roman'">      </span></span></span><span lang="EN-US" style="font-family: Monaco">MANDATORY</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q如果调用者没有事务,容器抛出</span><span lang="EN-US" style="font-family: Monaco">javax.ejb.EJBTransactionRequiredException</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">异常Q反之则q接q用调用者的事务?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt; mso-list: l0 level1 lfo1"><span lang="EN-US" style="font-family: Monaco; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore">Q?Q?span style="font: 7pt 'Times New Roman'">      </span></span></span><span lang="EN-US" style="font-family: Monaco">NOT_SUPPORTED</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q如果调用者没有事务,容器便不使用事务调用ҎQ反之则暂停调用者事务以</span><span lang="EN-US" style="font-family: Monaco">non-transactional</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">的方式调用方法?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt; mso-list: l0 level1 lfo1"><span lang="EN-US" style="font-family: Monaco; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore">Q?Q?span style="font: 7pt 'Times New Roman'">      </span></span></span><span lang="EN-US" style="font-family: Monaco">NEVER</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q如果调用者没有事务,容器直接调用ҎQ反正抛?/span><span lang="EN-US" style="font-family: Monaco">javax.ejb.EJBException</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">异常?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco"><o:p> </o:p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt; mso-list: l1 level1 lfo2"><span lang="EN-US" style="font-family: Monaco; mso-fareast-font-family: Monaco; mso-bidi-font-family: Monaco"><span style="mso-list: Ignore">a.<span style="font: 7pt 'Times New Roman'">    </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">对于W?/span><span lang="EN-US" style="font-family: Monaco">1</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">U情况,适合的场景是?/span><span lang="EN-US" style="font-family: Monaco">non-transactional</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco">Web</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">层调?/span><span lang="EN-US" style="font-family: Monaco">bean</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">ҎQ如果方法调用出现异常,那么容器不仅?/span><span lang="EN-US" style="font-family: Monaco">rollback</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">整个事务Q同时也会向调用者抛?/span><span lang="EN-US" style="font-family: Monaco">javax.transaction.RollbackException</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">异常Q以通知调用者事务已被回滚了?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt; mso-list: l1 level1 lfo2"><span lang="EN-US" style="font-family: Monaco; mso-fareast-font-family: Monaco; mso-bidi-font-family: Monaco"><span style="mso-list: Ignore">b.<span style="font: 7pt 'Times New Roman'">    </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">W?/span><span lang="EN-US" style="font-family: Monaco">2</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">U情况中Q始l需要容器去创徏新的事务Q对于调用者原有的事物Q容器就会暂停它Q直到方法调用返回ؓ止就恢复原有事务。这Ll果是Ҏ调用所创徏的新事务无论成功与否Q都不会对调用者原有的事务造成影响?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt; mso-list: l1 level1 lfo2"><span lang="EN-US" style="font-family: Monaco; mso-fareast-font-family: Monaco; mso-bidi-font-family: Monaco"><span style="mso-list: Ignore">c.<span style="font: 7pt 'Times New Roman'">    </span></span></span><span lang="EN-US" style="font-family: Monaco">SUPPORT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">选项表示本质上容器将会按照调用者的事务情况来处理,通常的场景是用于一些只d的操作,比如索数据记录等?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt; mso-list: l1 level1 lfo2"><span lang="EN-US" style="font-family: Monaco; mso-fareast-font-family: Monaco; mso-bidi-font-family: Monaco"><span style="mso-list: Ignore">d.<span style="font: 7pt 'Times New Roman'">    </span></span></span><span lang="EN-US" style="font-family: Monaco">MANDATORY</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">表示对容器对事务的强制性要求,如果调用者存在事务,容器?/span><span lang="EN-US" style="font-family: Monaco">join</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">q用调用者事务;但如果调用者没有事务环境,׃抛出</span><span lang="EN-US" style="font-family: Monaco">EJBTransactionRequiredException</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">异常。这U选项适合于如果方法调用失败进行回滚时也保证调用者环境的p|?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt; mso-list: l1 level1 lfo2"><span lang="EN-US" style="font-family: Monaco; mso-fareast-font-family: Monaco; mso-bidi-font-family: Monaco"><span style="mso-list: Ignore">e.<span style="font: 7pt 'Times New Roman'">    </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">对于</span><span lang="EN-US" style="font-family: Monaco">NOT_SUPPORT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q容器处理的本质是要求不能在事务环境下调?/span><span lang="EN-US" style="font-family: Monaco">bean</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Ҏ。如果调用者存在事务,容器会先暂停它,然后开始方法调用,在返回后恢复调用者的事务?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt; mso-list: l1 level1 lfo2"><span lang="EN-US" style="font-family: Monaco; mso-fareast-font-family: Monaco; mso-bidi-font-family: Monaco"><span style="mso-list: Ignore">f.<span style="font: 7pt 'Times New Roman'">    </span></span></span><span lang="EN-US" style="font-family: Monaco">NEVER</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">表明?/span><span lang="EN-US" style="font-family: Monaco">CMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">中,容器不能允许从事务性环境中调用</span><span lang="EN-US" style="font-family: Monaco">bean</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">ҎQ否则会抛出</span><span lang="EN-US" style="font-family: Monaco">EJBException</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">异常?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco"><o:p> </o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">对于前面q六U?/span><span lang="EN-US" style="font-family: Monaco">TransactionAttributeType</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q?/span><span lang="EN-US" style="font-family: Monaco">MDB</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">q不是全部都支持Q它支持</span><span lang="EN-US" style="font-family: Monaco">REQUIRED</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco">NOT_SUPPORT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">两种。这一点与</span><span lang="EN-US" style="font-family: Monaco">MDB</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">的特性有养I客户端无法直接调?/span><span lang="EN-US" style="font-family: Monaco">MDB</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q所以事务属性中?/span><span lang="EN-US" style="font-family: Monaco">SUPPORT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco">REQUIRED_NEW</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco">MANDATORY</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">没有意义?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco">CMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">事务理的真正机?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">很重要的一点:</span><span lang="EN-US" style="font-family: Monaco">CMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Ҏ要求容器回滚事务q不是立卌行的Q而是向容器设|回滚标识,在事务结束的时候,容器查该标志Q如果不需回滚则提交该事务Q如果需要回滚则q行?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">通过</span><span lang="EN-US" style="font-family: Monaco">EJBContext</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">或其子类Q?/span><span lang="EN-US" style="font-family: Monaco">SessionContext</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco">MessageDrivenContext</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco">setRollbackOnly()</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">ҎQ将回滚标志位置?/span><span lang="EN-US" style="font-family: Monaco">true</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q当Ҏ调用l束Ӟ容器查该状态以判断是否提交事务或是回滚事务?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">需要注意的一ҎQ本质上Q?/span><span lang="EN-US" style="font-family: Monaco">EJBContext</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">q行讄标志位时Q它是作为底层事务的一个上层抽象代理。所以用时Q必M证有底层事务存在Q也是说必d</span><span lang="EN-US" style="font-family: Monaco">REQUIRED,REQUIRED_NEW,MADATORY</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">q三U事务属性下使用Q因三种事务属性都可以使容器保证底层事务的存在Q即无论Ҏ调用者是否存在事务环境,容器都会创徏C务?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco">setRollbackOnly()</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Ҏ对应的是</span><span lang="EN-US" style="font-family: Monaco">getRollbackOnly()</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">ҎQ该Ҏq回当前</span><span lang="EN-US" style="font-family: Monaco">EJBContext</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">中回滚标志位的状态。该Ҏ在业务处理中十分有用Q考虑q样一个场景:</span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">在进行一D非帔R的资源密集型操作前如果前事务的前部分已经p|Q那是在一个注定要回滚的事务上付出很多代h。所以在q类操作之前应该?/span><span lang="EN-US" style="font-family: Monaco">check</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">一?/span><span lang="EN-US" style="font-family: Monaco">rollbackOnly</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">是否已经|ؓ</span><span lang="EN-US" style="font-family: Monaco">true</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">此外Q处理该标志位状态的代码l常分布在业务逻辑?/span><span lang="EN-US" style="font-family: Monaco">catch</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">块中Q如?/span><span lang="EN-US" style="font-family: Monaco">catch</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">了某U?/span><span lang="EN-US" style="font-family: Monaco">exception</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q则一边记录进</span><span lang="EN-US" style="font-family: Monaco">log</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q一辚w过</span><span lang="EN-US" style="font-family: Monaco">set</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Ҏ|状态位。在</span><span lang="EN-US" style="font-family: Monaco">EJB3</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">中,可以通过</span><span lang="EN-US" style="font-family: Monaco">@ApplicationException</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">注解使得“捕获异常转化Z务回?#8221;变成透明的机制?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco">@AplicationException</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">注解</span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco">@javax.ejb.ApplicationException</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">该注解可以用来控制事务性输出,要抛出的异常类型在定义时加上该标签Q同时设|该标签?/span><span lang="EN-US" style="font-family: Monaco">rollback</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">属性,?/span><span lang="EN-US" style="font-family: Monaco">@ApplicationException(rollback=true/false)</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">。应用异常(</span><span lang="EN-US" style="font-family: Monaco">ApplicationException</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q是希望调用者或客户端处理的Q一般认为除?/span><span lang="EN-US" style="font-family: Monaco">java.rmi.RemoteException</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco">java.lang.RuntimeException</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">之外都是应用异常。而从上述两种异常l承出的子类异常都被认ؓ是系l异常,q种异常不会传递给调用者或客户端而是</span><span lang="EN-US" style="font-family: Monaco">wrapped</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco">EJBException</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">中?/span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">d此注解的异常无论?/span><span lang="EN-US" style="font-family: Monaco">checked exception</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">q是</span><span lang="EN-US" style="font-family: Monaco">unchecked exception</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q比如运行时异常Q,都会被认为是应用异常Q?/span><span lang="EN-US" style="font-family: Monaco">application exception</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q,从而传递给Ҏ调用者或客户端?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">默认情况下,所?/span><span lang="EN-US" style="font-family: Monaco">checked exception</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">或所有被注解为应用异常的</span><span lang="EN-US" style="font-family: Monaco">checked/unchecked exception</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q都不会?/span><span lang="EN-US" style="font-family: Monaco">CMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">的方式回滚,如果?/span><span lang="EN-US" style="font-family: Monaco">rollback</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">属性设|ؓ</span><span lang="EN-US" style="font-family: Monaco">true</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q则会通知容器p|时进行事务回滚,q且是在把应用异怼递给调用者或客户端之前进行的?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco"><o:p><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">如果有未预料?/span><span lang="EN-US" style="font-family: Monaco">unchecked exception</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q比?/span><span lang="EN-US" style="font-family: Monaco">ArrayOutOfBoundsException</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">?/span><span lang="EN-US" style="font-family: Monaco">NullPointerException</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q容器仍然会回滚</span><span lang="EN-US" style="font-family: Monaco">CMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">事务Q但是在q种情况下,容器会认?/span><span lang="EN-US" style="font-family: Monaco">bean</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">处在了一U?/span><span lang="EN-US" style="font-family: Monaco">inconsistent</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">的情况下Q会q而销?/span><span lang="EN-US" style="font-family: Monaco">bean</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">实例Q这是十分消耗资源的Q所?/span><span lang="EN-US" style="font-family: Monaco">you should never delibrately use system exceptions.<o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco"><o:p> </o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: Monaco">CMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">使开发h员不必关?/span><span lang="EN-US" style="font-family: Monaco">EJB</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">事务中的大部分细节,当然同时</span><span lang="EN-US" style="font-family: Monaco">CMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">能提供对事务的控制别也更少Q这一?/span><span lang="EN-US" style="font-family: Monaco">Bean</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">理的事务(</span><span lang="EN-US" style="font-family: Monaco">BMT</span><span style="font-family: 宋体; mso-ascii-font-family: Monaco; mso-hansi-font-family: Monaco">Q更适合?/span><span lang="EN-US" style="font-family: Monaco"><o:p></o:p></span></p> <p class="MsoNormal"> </o:p></span></p> <img src ="http://www.tkk7.com/James-Wei/aggbug/280366.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/James-Wei/" target="_blank">J@mes</a> 2009-06-06 21:11 <a href="http://www.tkk7.com/James-Wei/archive/2009/06/06/280366.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB3学习ȝQ?Q?/title><link>http://www.tkk7.com/James-Wei/archive/2009/05/29/278953.html</link><dc:creator>J@mes</dc:creator><author>J@mes</author><pubDate>Fri, 29 May 2009 14:28:00 GMT</pubDate><guid>http://www.tkk7.com/James-Wei/archive/2009/05/29/278953.html</guid><wfw:comment>http://www.tkk7.com/James-Wei/comments/278953.html</wfw:comment><comments>http://www.tkk7.com/James-Wei/archive/2009/05/29/278953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/James-Wei/comments/commentRss/278953.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/James-Wei/services/trackbacks/278953.html</trackback:ping><description><![CDATA[作ؓq期学习EJB3  的一些心得和ȝQ完全是自己的理解和白话Q前辈们请多指教<br /> <p>EJB3学习<span style="font-family: 宋体">ȝQ?Q?/span></p> <p><span style="font-family: 宋体">现状</span></p> <p>EJB2<span style="font-family: 宋体">得到了较q泛的应用,但真正用对场合的目不多Q那些强调分布式Q即业务逻辑?/span>Web<span style="font-family: 宋体">是在分布在不同物理层的大型项目。更多得是用在中小?/span>web<span style="font-family: 宋体">应用之上?/span></p> <p>EJB3<span style="font-family: 宋体">?/span>Spring<span style="font-family: 宋体">?/span>Hibernate<span style="font-family: 宋体">{一pd轻量U框架运动的发展后现w了Q?/span>EJB3<span style="font-family: 宋体">是基?/span>POJO<span style="font-family: 宋体">lg的,同时提供了事务、安全?/span>ORM<span style="font-family: 宋体">和分布式{诸多特点,同时</span>AOP<span style="font-family: 宋体">?/span>DI<span style="font-family: 宋体">?/span>Annotation<span style="font-family: 宋体">{特性也q一步提高了</span>EJB3<span style="font-family: 宋体">的易用性?/span></p> <p>EJB3<span style="font-family: 宋体">规范</span></p> <p>EJB3<span style="font-family: 宋体">规范包含</span>3<span style="font-family: 宋体">个技术文档:</span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">1.<span style="font: 7pt 'Times New Roman'">       </span>EJB3 Simplified API</p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">2.<span style="font: 7pt 'Times New Roman'">       </span>EJB3 Core Contracts & Requirement</p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">3.<span style="font: 7pt 'Times New Roman'">       </span>Java Persistence API</p> <p>EJB3<span style="font-family: 宋体">lg模型</span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">1.<span style="font: 7pt 'Times New Roman'">       </span>Session Bean<span style="font-family: 宋体">Q执行业务服务、控制事务及资源讉K</span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">2.<span style="font: 7pt 'Times New Roman'">       </span>Message Driven Bean<span style="font-family: 宋体">Q异步调用,通过</span>JMS<span style="font-family: 宋体">兌消息队列Q?/span>Queue<span style="font-family: 宋体">Q及</span>Topic<span style="font-family: 宋体">来响应外部事?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">3.<span style="font: 7pt 'Times New Roman'">       </span>Entity<span style="font-family: 宋体">Q具有唯一标示的实体,是持久化的基?/span></p> <p>SessionBean<span style="font-family: 宋体">?/span>MDBean<span style="font-family: 宋体">l称?/span>Enterprise Bean<span style="font-family: 宋体">Q这点不同于</span>EJB2<span style="font-family: 宋体">规范?/span>EntityBean<span style="font-family: 宋体">已经划分由持久化</span>Provider<span style="font-family: 宋体">ȝ理和控制Q不再由</span>EJB<span style="font-family: 宋体">容器理?/span></p> <p>EJB3<span style="font-family: 宋体">框架</span></p> <p><span style="font-family: 宋体">它提供了?/span>EJB3<span style="font-family: 宋体">lg的各U支持,包括容器事务、安全服务、资源池的管理(包括U程池、连接池、实例池Q以及组件生命周期的理、ƈ发支持等?/span></p> <p>EJB3<span style="font-family: 宋体">的核?/span>features</p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">1.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-family: 宋体">声明式的元数据:通过</span>Java5<span style="font-family: 宋体">?/span>Annotation<span style="font-family: 宋体">?/span>XML<span style="font-family: 宋体">来声明式地去指定</span>Enterprise Bean<span style="font-family: 宋体">?/span>Entity Bean<span style="font-family: 宋体">的行为和Ҏ。如果同时用两U方式时Q?/span>XML<span style="font-family: 宋体">描述h更高的优先?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">2.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-family: 宋体">按异帔R|:对于大量可?/span>default<span style="font-family: 宋体">配置的地斚w可以省去J琐的配|,只有需要不按默认行为的才需要显式得通过注解?/span>XML<span style="font-family: 宋体">来进行描q。强调用户只有需要配|时才进行配|,可以使代码更为简z?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">3.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-family: 宋体">良好的可伸羃性:</span>EJB3<span style="font-family: 宋体">的实C在三个方面保证了良好的׾~性,Q?/span>1<span style="font-family: 宋体">Q通过资源池最大程度上寚w新对象的重用Q(</span>2<span style="font-family: 宋体">Q用持久化及缓存避免重复查询和重复创徏实体Q(</span>3<span style="font-family: 宋体">Q优化的锁定{略Q避免对</span>DB<span style="font-family: 宋体">的ƈ发锁定?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">4.<span style="font: 7pt 'Times New Roman'">       </span>JTA<span style="font-family: 宋体">Q?/span>Java Transaction API<span style="font-family: 宋体">Q定义了分布式事务的标准</span>API<span style="font-family: 宋体">?/span>EJB<span style="font-family: 宋体">容器作ؓ</span>JTA<span style="font-family: 宋体">的事务管理器?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">5.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-family: 宋体">通过声明的方式来控制ҎU别的访问控Ӟ辑ֈ多层安全性?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">6.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-family: 宋体">实体</span>Bean<span style="font-family: 宋体">被替换成</span>POJO<span style="font-family: 宋体">Q简单、轻量,不用再去实现专门的接口,同时可以q</span>EJB<span style="font-family: 宋体">容器?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">7.<span style="font: 7pt 'Times New Roman'">       </span>SessionBean<span style="font-family: 宋体">也更加灵z,不再需要主接口Q?/span>Home Interface<span style="font-family: 宋体">Q?/span>.</p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">8.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-family: 宋体">依赖注入Q?/span>dependency injection<span style="font-family: 宋体">Q,可以通过</span>Annotation<span style="font-family: 宋体">?/span>XML<span style="font-family: 宋体">的方式将依赖数据“推(</span>push<span style="font-family: 宋体">Q?#8221;?/span>bean<span style="font-family: 宋体">。例如:?/span>EntityManager<span style="font-family: 宋体">注入?/span>SessionBean<span style="font-family: 宋体">中,以会话可以与持久化单元q行交互?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">9.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-family: 宋体">拦截器和回调Q?/span>Call-back<span style="font-family: 宋体">Q:通过拦截器来完成某些回调Ҏ?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">10.<span style="font: 7pt 'Times New Roman'">   </span><span style="font-family: 宋体">对于</span>SessionBean<span style="font-family: 宋体">?/span>MDB<span style="font-family: 宋体">Q不在需要主ҎQ?/span>ejbCreate()<span style="font-family: 宋体">Q,使用默认构造器来替代。同时也不需要再扩展专有接口?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">11.<span style="font: 7pt 'Times New Roman'">   </span><span style="font-family: 宋体">对于</span>EntityBean<span style="font-family: 宋体">Q主接口Q?/span>Home interface<span style="font-family: 宋体">Q也被替换成</span>EntityManager<span style="font-family: 宋体">Q后者是一个单例实例工厂,可以理实体</span>Bean<span style="font-family: 宋体">的生命周期?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">12.<span style="font: 7pt 'Times New Roman'">   </span>EJB3<span style="font-family: 宋体">的分布式计算模型Q?/span>EJB3<span style="font-family: 宋体">也基?/span>RMI<span style="font-family: 宋体">q程服务Q远E接口方法按g递以提供_粒度的模型?/span></p> <p>EJB3<span style="font-family: 宋体">角色</span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">1.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-family: 宋体">定义</span>Enterprise Bean<span style="font-family: 宋体">及相?/span>meta-data<span style="font-family: 宋体">的三U角Ԍ</span></p> <p style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt">Q?Q?span style="font: 7pt 'Times New Roman'">       </span><span style="font-family: 宋体">企业</span>Bean<span style="font-family: 宋体">提供者(</span>Enterprise Bean provider<span style="font-family: 宋体">Q,负责d义和实现业务逻辑和结构;负责定义实体的持久化l构及互相关pR?/span></p> <p style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt">Q?Q?span style="font: 7pt 'Times New Roman'">       </span><span style="font-family: 宋体">应用装配者(</span>Application assembler<span style="font-family: 宋体">Q?/span></p> <p>EJB3<span style="font-family: 宋体">的会?/span>Bean</p> <p>EJB3<span style="font-family: 宋体">中,</span>SessionBean<span style="font-family: 宋体">包括两种cdQ?/span>Stateful SessionBean<span style="font-family: 宋体">?/span>Stateless SessionBean<span style="font-family: 宋体">?/span></p> <p><span style="font-family: 宋体">֐思义Q?/span>Stateless SessionBean<span style="font-family: 宋体">不需l持客户h的会话状态;?/span>Stateful SessionBean<span style="font-family: 宋体">则需要维持特定客戯求的会话状态,同时</span>bean<span style="font-family: 宋体">实例也是用客戯求绑定的?/span></p> <p>Stateless SessionBean</p> <p><span style="font-family: 宋体">无状态会?/span>Bean<span style="font-family: 宋体">׃个元素组成:业务接口Q用来定义所提供的服务;</span>bean<span style="font-family: 宋体">c,是对服务接口的实现。注意此处,不需?/span>EJB2.x<span style="font-family: 宋体">中分别实?/span>EJBObject<span style="font-family: 宋体">?/span>SessionBean<span style="font-family: 宋体">接口?/span></p> <p><span style="font-family: 宋体">通过CZQ通过定义本地接口和(或)q程接口来定义业务接口,q里</span>Local<span style="font-family: 宋体">接口?/span>Remote<span style="font-family: 宋体">接口的选择遵@一个原则:如果业务的请求者与</span>SessionBean<span style="font-family: 宋体">处在同一?/span>JVM<span style="font-family: 宋体">中,则可以用本地接口,反之则必M用远E接口?/span></p> <p><span style="font-family: 宋体">原则上,如果同时使用了本地接口和q程接口Q则必须保证二者定义的接口一_同时由实现的</span>Bean<span style="font-family: 宋体">实现q些Ҏ?/span></p> <p><span style="font-family: 宋体">无状态会?/span>Bean<span style="font-family: 宋体">无需实现</span>EJB<span style="font-family: 宋体">特定的接口或扩展c,只需在类U别使用注解—?/span>@Stateless<span style="font-family: 宋体">卛_。同时也在本地接口及q程接口的类U别d注解—?/span>@Local<span style="font-family: 宋体">?/span>@Remote<span style="font-family: 宋体">?/span></p> <p><span style="font-family: 宋体">通过前面?/span>EJB3<span style="font-family: 宋体">Ҏ的介绍Q可以知?/span>EJB3<span style="font-family: 宋体">?/span>DI<span style="font-family: 宋体">Q?/span>Dependency Injection<span style="font-family: 宋体">Q的良好支持Q在</span>EJB3<span style="font-family: 宋体">中,可以各c资源注入到会话</span>Bean<span style="font-family: 宋体">中,q些资源可以是其他的会话</span>Bean<span style="font-family: 宋体">、数据源或者是</span>JMS<span style="font-family: 宋体">中的队列Q?/span>Queue<span style="font-family: 宋体">Q等。要实现依赖注入可以通过d注解Q也可以?/span>XML<span style="font-family: 宋体">配置文g中进行描qͼ但需注意的是Q如果二者都q行的配|则?/span>XML<span style="font-family: 宋体">文g中的描述为准?/span></p> <p><span style="font-family: 宋体">以注解的方式ZQ只需d</span>@Resource<span style="font-family: 宋体">注解卛_Q注入可以通过两种方式Q实例变量和</span>setter<span style="font-family: 宋体">Ҏ上?/span></p> <p><span style="font-family: 宋体">回调Q?/span>Call-back<span style="font-family: 宋体">Q,通过回调Q可以对</span>Bean<span style="font-family: 宋体">在其生命周期内各个阶D进行更l粒度的控制和管理。用回调方法也很简单,回调Ҏ没有多余的限Ӟ只需d正确的注解即可?/span></p> <p><span style="font-family: 宋体">无状态会?/span>Bean<span style="font-family: 宋体">两个主要的用于回调方法的注解分别是:</span>@PostConstruct<span style="font-family: 宋体">?/span>@PreDestroy<span style="font-family: 宋体">。其?/span>@PostConstruct<span style="font-family: 宋体">的方法会在该</span>bean<span style="font-family: 宋体">被实例化后回调执行,但需要注意的是,如果?/span>bean<span style="font-family: 宋体">有配|了需要注入的资源Q那该回调方法则会紧跟着资源的注入之后而执行?/span></p> <p>@PreDestroy<span style="font-family: 宋体">的回调方法则是在容器卛_销?/span>bean<span style="font-family: 宋体">实例之前被调用,主要用来做一些善后的工作Q比如对资源的关闭和清理。(补充Q在有状态会?/span>Bean<span style="font-family: 宋体">中,该方法是在最后一个带?/span>@Remove<span style="font-family: 宋体">注解的方法调用后才被调用Q之后容器销?/span>bean<span style="font-family: 宋体">实例。)</span></p> <p><span style="font-family: 宋体">另一个关键的元素是拦截器Q?/span>Interceptor<span style="font-family: 宋体">Q,拦截器的使用也很便捷Q通过d正确的注解即可。拦截器的概念与其他</span>JavaEE<span style="font-family: 宋体">的框架或规范中的一_x截业务方法的调用Q可以在拦截炚w加新的业务逻辑Q结合依赖注入特性,可以充分得做到关注点分离Q?/span>Separation of Concerns<span style="font-family: 宋体">Q?/span>Enterprise Bean<span style="font-family: 宋体">中会?/span>Bean<span style="font-family: 宋体">和消息驱?/span>Bean<span style="font-family: 宋体">可以定义拦截器方法?/span></p> <p><span style="font-family: 宋体">拦截器注解可以添加到ҎU别Q也可以d到类U别。被标注的方法在被调用时会被拦截器类拦截Qƈ插队式的先去调用拦截器的Ҏ。对于用到的拦截器类需要添?/span>@Interceptor<span style="font-family: 宋体">注解Q如果有多个拦截器则使用</span>@Interceptors<span style="font-family: 宋体">?/span></p> <p><span style="font-family: 宋体">?/span>@AroundInvoke<span style="font-family: 宋体">注解ZQ拦截器Ҏ需要关?/span>InvocationContext<span style="font-family: 宋体">接口Q通过它可以获得被拦截?/span>bean<span style="font-family: 宋体">c(</span>Class<span style="font-family: 宋体">Q?/span>bean<span style="font-family: 宋体">中的ҎQ?/span>Method<span style="font-family: 宋体">Q等Q需要强调的是其中的</span>proceed()<span style="font-family: 宋体">ҎQ通过它将拦截h往后传递,或者到拦截器链中的下一个,或者是l束拦截调用真正?/span>bean<span style="font-family: 宋体">Ҏ?/span></p> <p>EJB3<span style="font-family: 宋体">规范中定义了两种cd的异常,分别是应用异常和pȝ异常。应用异常是业务逻辑中生的</span>checked exception<span style="font-family: 宋体">Q而系l异常则?/span>EJB<span style="font-family: 宋体">pȝU生的异常Q同时系l异帔R?/span>RemoteException<span style="font-family: 宋体">?/span>RuntimeException<span style="font-family: 宋体">的子c,?/span>unchecked exception<span style="font-family: 宋体">?/span></p> <p><span style="font-family: 宋体">有状态会?/span>Bean<span style="font-family: 宋体">Q?/span>Stateful SessionBean<span style="font-family: 宋体">Q在Ҏ及l节上与无状态会?/span>Bean<span style="font-family: 宋体">很相伹{?/span></p> <p><span style="font-family: 宋体">会话</span>Bean<span style="font-family: 宋体">的用戯?/span></p> <p><span style="font-family: 宋体">讉K会话</span>Bean<span style="font-family: 宋体">的用戯囑֏以有三种形式Q?/span></p> <p style="margin-left: 39pt; text-indent: -18pt; tab-stops: list 39.0pt">1.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-family: 宋体">通过</span>Remote<span style="font-family: 宋体">接口Q远E客户具有位|无x?/span></p> <p style="margin-left: 39pt; text-indent: -18pt; tab-stops: list 39.0pt">2.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-family: 宋体">通过</span>Local<span style="font-family: 宋体">接口Q这两种方式中请求方可以是其他的</span>EJB<span style="font-family: 宋体">lgQ可以是</span>Servlet<span style="font-family: 宋体">?/span>JSP<span style="font-family: 宋体">{。需要注意的是,本地客户h位置依赖性?/span></p> <p style="margin-left: 39pt; text-indent: -18pt; tab-stops: list 39.0pt">3.<span style="font: 7pt 'Times New Roman'">       </span>WebService<span style="font-family: 宋体">方式Q可以将会话</span>Bean<span style="font-family: 宋体">发布成ؓ一?/span>WebService<span style="font-family: 宋体">Q供客户调用?/span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体">客户h会话</span>Bean<span style="font-family: 宋体">Ӟ或者通过依赖注入或者通过查找</span>JNDI<span style="font-family: 宋体">Q来获得会话</span>Bean<span style="font-family: 宋体">?/span>stub<span style="font-family: 宋体">对象Q请求是通过</span>stub<span style="font-family: 宋体">来进行调用的。对于无状态会?/span>Bean<span style="font-family: 宋体">Q每ơ请求将获得新的</span>stub<span style="font-family: 宋体">Q而有状态会?/span>Bean<span style="font-family: 宋体">Q则在请求方~存</span>stub<span style="font-family: 宋体">Q这h能容器知道该返回哪个与客户相关联的</span>bean<span style="font-family: 宋体">实例?/span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体">通过依赖注入获得会话</span>Bean<span style="font-family: 宋体">业务接口的方式是d注解</span>@EJB<span style="font-family: 宋体">Q注意要?/span>@Resource<span style="font-family: 宋体">区分开?/span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体">相比查找</span>JNDI<span style="font-family: 宋体">Q用注入的方式会更加简z,通常对于q程h使用</span>JNDI<span style="font-family: 宋体">更适合?/span></p> <p><span style="font-family: 宋体">有状态会?/span>Bean<span style="font-family: 宋体">Q?/span>Stateful SessionBean<span style="font-family: 宋体">Q?/span></p> <p><span style="font-family: 宋体">通过实现</span>SessionSynchronization<span style="font-family: 宋体">接口Q可以在事务点上获得</span>EJB<span style="font-family: 宋体">容器的通知Q?/span>afterBegin<span style="font-family: 宋体">Q在C物开始时Q?/span>beforeCompletion<span style="font-family: 宋体">Q在事物提交前;</span>afterCompletion<span style="font-family: 宋体">Q在事物执行完之后?/span></p> <p><span style="font-family: 宋体">有状态会?/span>Bean<span style="font-family: 宋体">中的回调Ҏ除了</span>PostConstruct<span style="font-family: 宋体">?/span>PreDestroy<span style="font-family: 宋体">外,q有</span>PreActivate<span style="font-family: 宋体">?/span>PrePassivate<span style="font-family: 宋体">Q分别?/span>@PreActivate<span style="font-family: 宋体">?/span>@PrePassivate<span style="font-family: 宋体">来注解?/span></p> <p><span style="font-family: 宋体">前两个回调方法的l节与无状态会?/span>Bean<span style="font-family: 宋体">一_分别在(</span>1<span style="font-family: 宋体">Q实例化</span>Bean<span style="font-family: 宋体">之后q执行完资源注入后执行;Q?/span>2<span style="font-family: 宋体">Q?/span>@Remove<span style="font-family: 宋体">Ҏ执行完毕之后?/span></p> <p><span style="font-family: 宋体">对于有状态会?/span>Bean<span style="font-family: 宋体">中的</span>@Remove<span style="font-family: 宋体">ҎQ也是一个管?/span>bean<span style="font-family: 宋体">生命周期的方法,调用该方法后Q容器将会从实例池中该</span>bean<span style="font-family: 宋体">删除?/span></p> <p><span style="font-family: 宋体">带有</span>@PrePassivate<span style="font-family: 宋体">注解的方法会?/span>EJB<span style="font-family: 宋体">容器调用Q当某个有状态会?/span>Bean<span style="font-family: 宋体">实例长时间空Ԍ则容器调用该Ҏ此</span>bean<span style="font-family: 宋体">实例钝化Qƈ状态缓存v来?/span></p> <p><span style="font-family: 宋体">当客戯求再ơ需要用被钝化的某</span>bean<span style="font-family: 宋体">实例Ӟ容器调用?/span>bean<span style="font-family: 宋体">?/span>@PreActivate<span style="font-family: 宋体">ҎQ返回一个创建好的ƈ带有状态的新实例?/span></p> <p><span style="font-family: 宋体">有状态会?/span>Bean<span style="font-family: 宋体">的拦截器Ҏ需要注意的是,如果实现</span>SessionSynchronization<span style="font-family: 宋体">接口?/span>bean<span style="font-family: 宋体">Q?/span>afterBegin<span style="font-family: 宋体">始终发生?/span>@AroundInvoke<span style="font-family: 宋体">的Q何方法前?/span></p> <img src ="http://www.tkk7.com/James-Wei/aggbug/278953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/James-Wei/" target="_blank">J@mes</a> 2009-05-29 22:28 <a href="http://www.tkk7.com/James-Wei/archive/2009/05/29/278953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://8953y.com" target="_blank">avɫ㽶һ </a>| <a href="http://fdhkauto.com" target="_blank">ƷƵѹۿ</a>| <a href="http://www04ggg.com" target="_blank">aaaƵѹۿ</a>| <a href="http://koukoub.com" target="_blank">˳ɵӰ߹ۿ</a>| <a href="http://tiantangapp.com" target="_blank">2020ΪĻѹۿȫ</a>| <a href="http://ldcatv.com" target="_blank">Aר߹ۿq</a>| <a href="http://83k5.com" target="_blank">еİjŽŮƵ</a>| <a href="http://siminglighting.com" target="_blank">AѼ</a>| <a href="http://zuche001.com" target="_blank">һþAþѾƷ </a>| <a href="http://www9k832.com" target="_blank">޾Ʒxxx</a>| <a href="http://hztkw.com" target="_blank">þþWWWѾƷ</a>| <a href="http://ziguang1688.com" target="_blank">ۺϹƷһҳ</a>| <a href="http://rushiruhua.com" target="_blank">һƵ</a>| <a href="http://fenglufzjx.com" target="_blank">þþþþ޾Ʒ</a>| <a href="http://guilinsix.com" target="_blank">xxxxxxձƬѿ</a>| <a href="http://chinahongfeng.com" target="_blank">ۺɫ¶</a>| <a href="http://zuche001.com" target="_blank">պӰ߹ۿ</a>| <a href="http://szzdjl.com" target="_blank">ۺϼƵ</a>| <a href="http://46339cc.com" target="_blank">AVַ߹ۿ</a>| <a href="http://zhuguangbaoyu.com" target="_blank">99͵ͼ</a>| <a href="http://tlyihong.com" target="_blank">׾Ʒһ</a>| <a href="http://222xx8.com" target="_blank">j8ֳִӲˬƵ</a>| <a href="http://fenglibin.com" target="_blank">츾avһ</a>| <a href="http://mt569.com" target="_blank">޾ƷƵ</a>| <a href="http://minliusoft.com" target="_blank">AVۺɫ͵ </a>| <a href="http://123470c.com" target="_blank">av벻߹ۿ</a>| <a href="http://zbr555sina.com" target="_blank">޹ۺϾƷĵһ</a>| <a href="http://zs0451.com" target="_blank">ѹ˸߹ۿ鶹 </a>| <a href="http://ddm88888.com" target="_blank">˳ӰԺ77777</a>| <a href="http://27simnjingmiguan.com" target="_blank">ѹۿƬëƬ</a>| <a href="http://caicpa.com" target="_blank">һѹۿ</a>| <a href="http://cykj-tech.com" target="_blank">þþƷav鶹ɫ</a>| <a href="http://51xinshiji.com" target="_blank">պһ</a>| <a href="http://q2c6.com" target="_blank">ձ߿ѹۿ</a>| <a href="http://0330196.com" target="_blank">޾Ʒ͵Բ</a>| <a href="http://zhuanjiao521.com" target="_blank">ѻɫַ</a>| <a href="http://ytshdiping.com" target="_blank">Ƶ߹ۿ</a>| <a href="http://sdyzzs.com" target="_blank">޹պһ</a>| <a href="http://0755host.com" target="_blank">۲ӰԺѹۿ</a>| <a href="http://dyj696.com" target="_blank">йͽxxxxxѿ</a>| <a href="http://499k.com" target="_blank">˳ɵӰ߹ۿ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>