??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲欧美久久精品,99在线视频精品,18国产精品http://www.aygfsteel.com/anduo1989/category/49746.htmlJAVAzh-cnFri, 07 Oct 2011 12:07:01 GMTFri, 07 Oct 2011 12:07:01 GMT60Spring-AOP底层原理-JDK动态代?--转蝲http://www.aygfsteel.com/anduo1989/archive/2011/10/07/360134.html安多安多Fri, 07 Oct 2011 11:29:00 GMThttp://www.aygfsteel.com/anduo1989/archive/2011/10/07/360134.htmlhttp://www.aygfsteel.com/anduo1989/comments/360134.htmlhttp://www.aygfsteel.com/anduo1989/archive/2011/10/07/360134.html#Feedback0http://www.aygfsteel.com/anduo1989/comments/commentRss/360134.htmlhttp://www.aygfsteel.com/anduo1989/services/trackbacks/360134.html原文http://blog.zdnet.com.cn/html/90/289390-838716.htmlJDK动态代?/strong>
   
 1 package com.baobaotao.proxy; 在JDK 1.3以后提供了动态代理的技术,允许开发者在q行期创建接口的代理实例。在Sun刚推出动态代理时Q还很难惌它有多大的实际用途,现在我们l于发现动态代理是实现AOP的绝好底层技术?/font>
    JDK的动态代理主要涉?qing)到java.lang.reflect包中的两个类QProxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑Q在q过反射机制调用目标cȝ代码Q动态将横切逻辑和业务逻辑~织在一赗?/font>
   而Proxy为InvocationHandler实现cd态创Z个符合某一接口的代理实例。这栯一定很抽象Q我们马上着手动用Proxy和InvocationHandlerq两个魔法戒对上一节中的性能监视代码q行AOP式的攚w?/font>
    首先Q我们从业务cForumServiceImpl 中删除性能监视的横切代码,使ForumServiceImpl只负责具体的业务逻辑Q如所C:(x)
代码清单 5 ForumServiceImplQ移除性能监视横切代码
    
 2 
 3 public class ForumServiceImpl implements ForumService {
 4 
 5  public void removeTopic(int topicId) {
 6          ①
 7   System.out.println("模拟删除Topic记录:"+topicId);
 8   try {
 9    Thread.currentThread().sleep(20);
10   } catch (Exception e) {
11    throw new RuntimeException(e);
12   }
13    ②
14  }
15  public void removeForum(int forumId) {
16          ①
17   System.out.println("模拟删除Forum记录:"+forumId);
18   try {
19    Thread.currentThread().sleep(40);
20   } catch (Exception e) {
21    throw new RuntimeException(e);
22   }
23          ②
24  }
25 }
    
在代码清?5中的①?#9313;处,原来的性能监视代码被移除了Q我们只保留了真正的业务逻辑?br style="word-break: break-all; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />    从业务类中移除的横切代码当然q得扑ֈ一个寄居之所QInvocationHandler是横切代码的家园乐土,我们性能监视的代码安|在PerformaceHandler中,如代码清?6所C:(x)
代码清单 6 PerformaceHandler
 1 package com.baobaotao.proxy;
    
 2 import java.lang.reflect.InvocationHandler;
 3 import java.lang.reflect.Method;
 4 
 5 public class PerformaceHandler implements InvocationHandler {
 6     private Object target;
 7  public PerformaceHandler(Object target){//①target为目标的业务c?/span>
 8   this.target = target;
 9  }
10  public Object invoke(Object proxy, Method method, Object[] args)
11    throws Throwable {
12   PerformanceMonitor.begin(target.getClass().getName()+"."+ method.getName());
13   Object bj = method.invoke(target, args);//②通过反射Ҏ(gu)调用目标业务cȝ业务Ҏ(gu)
14   PerformanceMonitor.end();
15   return obj;
16  }
17 }
    
 _体部分的代码ؓ(f)性能监视的横切代码,我们发现Q横切代码只出现一ơ,而不是原来那hz各处。大家注?#9313;处的method.invoke()Q该语句通过反射的机制调用目标对象的Ҏ(gu)Q这样InvocationHandler的invoke(Object proxy, Method method, Object[] args)Ҏ(gu)将横切代码和目标业务类代码~织C起了Q所以我们可以将InvocationHandler看成是业务逻辑和横切逻辑的编l器。下面,我们对这D代码做q一步的说明?br style="word-break: break-all; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />首先Q我们实现InvocationHandler接口Q该接口定义了一?invoke(Object proxy, Method method, Object[] args)的方法,proxy是代理实例,一般不?x)用刎ͼmethod是代理实例上的方法,通过它可以发起对目标cȝ反射调用Qargs是通过代理cM入的Ҏ(gu)参数Q在反射调用时用?br style="word-break: break-all; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />    此外Q我们在构造函数里通过target传入真实的目标对象,?#9312;处所C,在接口方法invoke(Object proxy, Method method, Object[] args)里,目标类实例传给method.invoke()Ҏ(gu)Q通过反射调用目标cL法,?#9313;所C?br style="word-break: break-all; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />    下面Q我们通过Proxyl合PerformaceHandler创徏ForumService接口的代理实例,如代码清?7所C:(x)
代码清单 7 TestForumServiceQ创Z理实?/span> 1 package com.baobaotao.proxy;
    
 2 import java.lang.reflect.Proxy;
 3 public class TestForumService {
 4  public static void main(String[] args) {
 5   ForumService target = new ForumServiceImpl();//①目标业务c?br /> 6 //② 目标业务类和横切代码编l到一?/span>
 7   PerformaceHandler handler = new PerformaceHandler(target);
 8          //③为编l了目标业务c逻辑和性能监视横切逻辑的handler创徏代理c?/span>
 9   ForumService proxy = (ForumService) Proxy.newProxyInstance(
10 target.getClass().getClassLoader(),
11     target.getClass().getInterfaces(),
12  handler);
13          //④ 操作代理实例
14   proxy.removeForum(10);
15   proxy.removeTopic(1012);
16  }
17 }
     
上面的代码完成了业务cM码和横切代码~织和接口代理实例生成的工作Q其中在②处,我们ForumService实例~织Z个包含性能监视逻辑的PerformaceHandler实例Q然后在③处,通过Proxy的静态方法newProxyInstance()合了业务c逻辑和性能监视逻辑的handler创徏一个ForumService接口的代理实例,该方法的W一个入参ؓ(f)cd载器Q第二个入参为创建的代理实例所要实现的一l接口,W三个参数是整合了业务逻辑和横切逻辑的编l器对象?br style="word-break: break-all; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />按照③处的讄方式Q这个代理实例就实现了目标业务类的所有接口,也即ForumServiceImpl的ForumService接口。这P我们可以按照调用ForumService接口的实例相同的方式调用代理实例Q如④所C。运行以上的代码Q输Z下的信息Q?br />    begin monitor
模拟删除Forum记录:10
end monitor
com.baobaotao.proxy.ForumServiceImpl.removeForump47毫秒?br />
begin monitor
模拟删除Topic记录:
1012
end monitor
com.baobaotao.proxy.ForumServiceImpl.removeTopicp26毫秒?/span>
      
我们发现Q程序的q行效果和直接在业务cM~写性能监视逻辑的效果一_(d)但是在这里,原来分散的横切逻辑代码已经被我们抽取到PerformaceHandler中。当其它业务c(如UserService、SystemService{)的业务方法也需要用性能监视Ӟ我们只要按照以上的方式,分别为它们创Z理对象就可以了。下面,我们用时序图描述调用关系Q进一步代理实例的本质Q如?所C:(x)
    

    
  ?1代理实例的时序图
    我们在上图中特别使用虚线阴媄的方式对通过代理器创建的ForumService实例q行凸显Q该实例内部利用PerformaceHandler整合横切逻辑和业务逻辑。调用者调用代理对象的的removeForum()和removeTopic()Ҏ(gu)Ӟ上图的内部调用时序清晰地告诉了我们实际上所发生的一切?/span>


 




安多 2011-10-07 19:29 发表评论
]]>
Hibernate学习(fn)ȝ002-IdGeneratorhttp://www.aygfsteel.com/anduo1989/archive/2011/10/07/360096.html安多安多Fri, 07 Oct 2011 01:27:00 GMThttp://www.aygfsteel.com/anduo1989/archive/2011/10/07/360096.htmlhttp://www.aygfsteel.com/anduo1989/comments/360096.htmlhttp://www.aygfsteel.com/anduo1989/archive/2011/10/07/360096.html#Feedback0http://www.aygfsteel.com/anduo1989/comments/commentRss/360096.htmlhttp://www.aygfsteel.com/anduo1989/services/trackbacks/360096.html 1 package com.andu...  阅读全文

安多 2011-10-07 09:27 发表评论
]]>
Hibernate学习(fn)ȝ001-hibernate概述http://www.aygfsteel.com/anduo1989/archive/2011/10/06/360078.html安多安多Thu, 06 Oct 2011 13:35:00 GMThttp://www.aygfsteel.com/anduo1989/archive/2011/10/06/360078.htmlhttp://www.aygfsteel.com/anduo1989/comments/360078.htmlhttp://www.aygfsteel.com/anduo1989/archive/2011/10/06/360078.html#Feedback0http://www.aygfsteel.com/anduo1989/comments/commentRss/360078.htmlhttp://www.aygfsteel.com/anduo1989/services/trackbacks/360078.html        说到hibernateQ英文意思:(x)冬眠。给我印象最q是孙文琴老师的那本hibernate深入详解分页上的那句?let you java object hibernate in the relation database"。其实后边学完了再回头看q句话的时候就发现其实q句话说的很形象Q它深刻的反映了hibernate在Y件开发中的重要作用:(x)ORMQobject relation mapping 对象关系映射Q,那么要学?fn)hibernate首先需要了解的是ORM?br />        所谓ORM的解释,可以从维基百U中查到Q?br />        对象关系映射QObject Relational MappingQ简UORMQ或O/RMQ或O/R mappingQ,是一U?a class="mw-redirect" title="E式设计" href="/wiki/%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88">E式设计技术,用于实现面向对象~程语言里不?a title="cdpȝ" href="/wiki/%E9%A1%9E%E5%9E%8B%E7%B3%BB%E7%B5%B1">cdpȝ的数据之间的转换。从效果上说Q它其实是创Z一个可在编E语a里用的“虚拟对象数据?/font>”。如今已有很多免费和收费的ORM产品Q而有些程序员更們֐于创q的ORM工具?

        面向对象是从软g工程基本原则Q如耦合、聚合、封装)的基上发展v来的Q而关pL据库则是?a title="数学" href="/wiki/%E6%95%B0%E5%AD%A6">数学理论发展而来的,两套理论存在显著的区别。ؓ(f)了解册个不匚w的现象,对象关系映射技术应q而生?/p>

        单的_(d)(x)ORM相当?a class="new" title="中数据" href="/w/index.php?title=%E4%B8%AD%E7%B9%BC%E8%B3%87%E6%96%99&action=edit&redlink=1">中数据。具体到产品上,例如下边?a title="ADO.NET Entity Framework" href="/wiki/ADO.NET_Entity_Framework">ADO.NET Entity Framework。DLINQ中实体类的属性[Table]q是一U中l数据?/p>

对象关系映射成功q用在不同的面向对象持久层品中Q如Q?a class="new" title="Torque" href="/w/index.php?title=Torque&action=edit&redlink=1">TorqueQ?a class="new" title="OJB" href="/w/index.php?title=OJB&action=edit&redlink=1">OJBQ?a title="Hibernate" href="/wiki/Hibernate">HibernateQ?a title="TopLink" href="/wiki/TopLink">TopLinkQ?a class="new" title="Castor JDO" href="/w/index.php?title=Castor_JDO&action=edit&redlink=1">Castor JDOQ?a class="new" title="TJDO" href="/w/index.php?title=TJDO&action=edit&redlink=1">TJDOQ?a title="Active Record" href="/wiki/Active_Record">Active RecordQ?a title="NHibernate" href="/wiki/NHibernate">NHibernateQ?a title="ADO.NET Entity Framework" href="/wiki/ADO.NET_Entity_Framework">ADO.NET Entity Framework {?br />        以上是维基百U中解释。所的很官僚Q就是说的我们大家一般的Z太能理解。我个h的理解就是:(x)Ҏ(gu)们这些对JDBC常用操作非常厌倦的人来了个装Q然后给我们各种常用的接口,而且让我们感觉不到我们在操纵数据库,而只是在调h家给的接口,q无形中让我们感觉到很舒服,很惬意?br />        hibernate同样是ORM工具Q那么它l我们提供了那些接口呢?让我列D几个Q?br />        Session、负责执行被持久化对象的CRUD操作(CRUD的Q务是完成?a target="_blank">数据?/font>的交,包含了很多常见的SQL语句??br />        SessionFactory、负责初始化Hibernate。它充当数据存储源的代理Qƈ负责创徏Session对象。这里用C工厂模式
        Transaction?nbsp;负责事务相关的操作。它是可选的Q开发h员也可以设计~写自己的底层事务处理代?br />        Query、Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式
        Configuration、负责配|ƈ启动HibernateQ创建SessionFactory对象?br />        



安多 2011-10-06 21:35 发表评论
]]>
վ֩ģ壺 ͬ| | | | | | ˮ| IJ| | ³ľ| ׶| | ں| | | | ½| ո| | | ƽ| ɽ| | ʤ| | | | ٹ| ԭ| ׷| ˻| ʯɽ| Դ| ǹ| ״| | | ֻ| Ӫ| ī| |