??xml version="1.0" encoding="utf-8" standalone="yes"?>成人黄色大片在线免费观看,青青草视频在线免费直播,日日噜噜夜夜狠狠视频欧美人http://www.aygfsteel.com/merek/category/21050.htmlzh-cnTue, 25 Mar 2008 05:14:37 GMTTue, 25 Mar 2008 05:14:37 GMT60AOP学习(一)http://www.aygfsteel.com/merek/articles/188439.html肖麦肖麦Tue, 25 Mar 2008 03:21:00 GMThttp://www.aygfsteel.com/merek/articles/188439.htmlhttp://www.aygfsteel.com/merek/comments/188439.htmlhttp://www.aygfsteel.com/merek/articles/188439.html#Feedback0http://www.aygfsteel.com/merek/comments/commentRss/188439.htmlhttp://www.aygfsteel.com/merek/services/trackbacks/188439.html 1、概q?nbsp;  
 SpringIoC容器能管理和配置应用pȝ对象Q因此我们可以遵行完的面向队象设计Q编写松耦合的代码,利用Spring的反向控制无痛连接协作类。但有时某些功能会在整个pȝ中到处用刎ͼq就不是很适合对象l承关系来解冟뀂这是面向切面QAOPQ的切入炏V?br />     Spring的AOP框架分散在pȝ中的功能块放在一个地方——切面。依赖Spring的强大的切入ҎӞ何时何地在系l中采用切面有很多种选择?nbsp;          
    使用AOPQ可以在一个地方定义通用功能Q可以定义何时何地应用这些功能,而不用在需要新功能的地方修改代码。交叉业务(AOP实际上指的是交叉业务模块化)可以模块化到特定的对象切面中。这样做有两个好处。第一Q现在每个业务逻辑攑֜一个地方,而不是分散到代码的各个角落。第二,我们的服务模块更加清晎ͼ因ؓ他们只包含他们的核心功能Q辅助功能{Ud切面中?nbsp;
    AOP从程序运行的角度考虑E序的结构,提取业务处理q程的切面?br /> AOP面对E序q行中各个步骤,以期待降低各步骤之间的耦合Q从而提高步骤之间的隔离?br />     OOP是静态的抽象Q它对应用中的实体及其属性、行行抽象,从而获得清晰高效的单元划分Q而AOP是动态的抽象Q它对应用执行的q程的步骤进行抽象,从而获得步骤之间的逻辑划分。AOP框架q不与特定的代码耦合Q能处理E序执行中的特定的点Q而不是某个具体的E序?br />
2、术?br /> 切面QAspectQ?/strong>
    切面是你要实现的交叉功能。它是应用系l模块化的一个切面或领域。切面的最常见Q虽然简单)的例子是日志记录。日志记录在pȝ中到处用刎ͼ利用l承来重用日志模块不合适。然而,你可以创Z个日志记录切面,q且使用AOP在系l中应用?br /> q接点(JoinpointQ?/strong>
    q接Ҏ应用E序执行q程中插入的切面的地炏V这个地点可以是Ҏ调用Q异常抛出,或者甚x要修改的字段。切面代码在q些地方插入C的应用系l中Q添加新的行为?br /> 通知QAdviceQ?/strong>
    切面的实际实现。它通知应用pȝ新的行ؓ。在日志的例子中Q日志通知包含了实现实际日志功能的代码Q如向日志文件写日志。通知在连接点插入到应用系l中?br /> 切入点(PointcutQ?br />     切入点定义了通知应该应用在哪些连接点。通知可以应用到AOP框架支持的Q何连接点。当Ӟ你ƈ不希望把所有的切面应用到所有可能的q接点上。切入点让你指定通知应用C么地斏V通常通过指定cd和方法名Q或者匹配类名和Ҏ名式L正则表达式来指定切入炏V一些AOP框架允许动态创建切入点Q在q行时根据条件决定是否应用切面,如方法参数等?br /> 引入QIntroductionQ?/strong>
    引入允许你ؓ已存在类d新方法和属性(哈,是种q觉Q)。例如,你可以创Z个稽查通知来记录对象的最后修Ҏ间。只要用一个方法setLastModifiedQDateQ以及一个保存这个状态的变量。可以在不改变已存在cȝ情况下将q个引入Q给他们新的行ؓ和状态?br /> 目标对象QTargetQ?br />     目标对象是被通知对象Q它可以是你~写的类Q也可以是你定制行ؓ的第三方cR如果没有AOPQ这个类必要包含它的主要逻辑以及交叉业务逻辑。有了AOP,目标对象可以全w心地关注主要业务,忘记应用其上的通知?br /> 代理QProxyQ?/strong>
    代理是将通知应用到目标对象后创徏的对象。对于客户对象来_目标对象Q应用AOP之前的对象)和代理对象(应用AOP之后的对象)是一L。也是_应用pȝ的其他部分不用ؓ了支持代理对象而改变?br /> l入QWeavingQ?/strong>
    l入是将切面应用到目标对象从而创Z个新的代理对象的q程。切面在指定接入点被l入到目标对象中Q织入发生在目标对象生命周期的多个点上:
        ~译器——切面在目标对象~译时织入。这需要一个特D的~译?br />         c装载期——切面在目标对象被蝲入到JVM中时l入。这需要一个特D的c装入器Q它在类载入到应用系l之前增强目标对象的字解码?br />         q行期——切面在应用pȝq行时织入。通常QAOP容器织入切面的时候动态生成委托目标对象的代理对象?br />
3、Spring的AOP实现
    不是所有的AOP框架都按同样的方式实现。他们在能够提供的接入点U类上有所不同。有些允怽在字D修改别上应用通知Q而有些只能在Ҏ调用上暴露连接点。他们在何时如何l入切面上也有所不同。无Z么情况,能够创徏q接点,定义切面在哪些连接点l入是AOP框架的关键?br /> 用Java~写Spring的通知
    在Spring中所有的通知都以Javacȝ形式~写。这意味着你可以像普通Java开发那样在集成环境中开发切面。定义在什么地方应用通用的切入点通常~写在Spring的配|文件中?br /> Spring的运行时通知对象
    代理Bean只有在第一ơ被应用pȝ需要的时候才被创建。如果你使用的是ApplicationContextQ代理对象在BeanFactory载入所有Bean的时候被创徏。因为Spring在运行期创徏代理Q所有用Spring AOP不需要特D编译器 ?br />     Spring有两U代理创建方式。如果目标对象实C一个(或多个)接口暴露的方法,Spring用JDK的java.lang.reflect.ProxycdZ理。这个类让Spring动态生一个新的类Q它实现了所需的接口,l入了通知Qƈ且代理对目标对象的所有请求?br />     如果目标对象没有实现M接口QSpring使用CGLIB库库生成目标对象的子cR在创徏q个子类的时候,Spring通知l入Qƈ且对目标对象的调用委托给q个子类。当使用q种代理生成方式Ӟ需要将Spring发型包中的lib/cglib目录下的JAR文g发布到应用系l中。在使用q种代理生成方式Ӟ需要注意两个要点:
    Ҏ口创Z理优于对cdZ理,因ؓq样会生更加松耦合的系l。对cdZ理是让遗留系l或无法实现接口的第三方cd同样可以得到通知。这U方式应该是备用方式Q而不是第一选择?br />     标记为final的方法不能被通知。记住,Spring是ؓ目标cM生子cRQ何需要被通知的方法都被复写,通知l入。finalҎ是不可能做到的?br /> Spring只支持方法连接点
    q一点和一些其他AOP框架不一P如AspectJ和JBossQ他们还提供了属性接入点Q这样可以防止你常见特别l致的通知Q如Ҏ新对象属性D行拦截?br />     然而,׃Springx于提供一个实现J2EE服务的框Ӟ所以方法拦截可以满_部分需求。加上Spring的观Ҏ属性拦截破坏了装。面向对象的基本概念是对象自己处理工作,其他对象只能通过Ҏ调用得到处理l果。让通知触发在属性值改变而不是方法调用上无疑是破坏了q个概念?br />


肖麦 2008-03-25 11:21 发表评论
]]>
spring实例化beanhttp://www.aygfsteel.com/merek/articles/109333.html肖麦肖麦Mon, 09 Apr 2007 02:33:00 GMThttp://www.aygfsteel.com/merek/articles/109333.htmlhttp://www.aygfsteel.com/merek/comments/109333.htmlhttp://www.aygfsteel.com/merek/articles/109333.html#Feedback0http://www.aygfsteel.com/merek/comments/commentRss/109333.htmlhttp://www.aygfsteel.com/merek/services/trackbacks/109333.html实例化bean
  通常情况?class属性通常是必ȝ(除了实例工厂Ҏ创徏bean和子bean的定?.大多数情况下,BeanFactory直接调用构造函数来"new"一个bean,class属性确定bean实例的实现类.但这q不是创建bean的唯一Ҏ.创徏bean有如下三U方?

  • 调用构造器"new"一个bean实例.
  • BeanFactory调用某个cȝ静态工厂方法创建bean.
  • BeanFactory调用实例工厂Ҏ创徏bean

<1>调用构造器"new"一个bean实例.的执行过E?

  • E序创徏BeanFactory实例.
  • 调用Chinesecȝ默认构造器创徏默认实例.
  • Ҏ配置文g注入依赖关系,先实例化依赖bean,然后依赖bean注入?
  • q回一个完整的JavaBean实例?

<2>BeanFactory调用某个cȝ静态工厂方法创建bean.
  使用静态工厂方法创建bean实例Ӟclass属性确定静态工厂类Q而不是该bean的类。spring需要知道哪个静态工厂方法创建的bean实例Q用factory-method属性来定Ҏ名。Spring调用工厂ҎQ也包含一l参敎ͼQƈq回一个有效的对象。之后,bean实例的用与采用其他Ҏ创徏的完全一栗如果静态工厂方法需要参敎ͼ使用<constructor-arg>元素传入?/p>

  • class元素不再是bean的实现类Q而是静态工厂类;
  • 必需有factory-method属性确定生实例的静态工厂方?
  • 静态工厂方法需要参敎ͼ则?lt;constructor -arg>元素定静态工厂方?

<3>调用实例工厂Ҏ创徏bean
通过实例工厂Ҏ创徏bean?bean元素不能含有class属?因ؓBeanFactory不再直接实例化该bean,BeanFactory仅仅执行工厂的方?工厂的方法返回bean实例.采用实例工厂Ҏ创徏bean应指定如下两个属?

  • 工厂bean的id,该id属性应该对应spring容器中的一个bean
  • 工厂Ҏ?该方法可产生bean实例.
  • 与静态工厂方法相?如果需要在调用工厂Ҏ时传入参?使用<constructor-arg>元素定参数?/li>


肖麦 2007-04-09 10:33 发表评论
]]>
վ֩ģ壺 | | ɽ| ϳ| | | Դ| | Ϫ| | ɽ| ˲| | żҸ| | | н| | | | ɳ| | | | Ͳ| ض| Ǩ| Ҿ| ɽ| | Ͻ| | | ȷɽ| | | | | Ӧ| ɽ| |