??xml version="1.0" encoding="utf-8" standalone="yes"?>a级大胆欧美人体大胆666,久久99国产成人小视频,午夜精品久久久久久久久http://www.aygfsteel.com/bily/archive/2006/11/17/81744.htmlC必?/dc:creator>C必?/author>Fri, 17 Nov 2006 04:59:00 GMThttp://www.aygfsteel.com/bily/archive/2006/11/17/81744.htmlhttp://www.aygfsteel.com/bily/comments/81744.htmlhttp://www.aygfsteel.com/bily/archive/2006/11/17/81744.html#Feedback0http://www.aygfsteel.com/bily/comments/commentRss/81744.htmlhttp://www.aygfsteel.com/bily/services/trackbacks/81744.html    面向斚w~程(AOP)是一U新的规范,允许你达C前面对对象方法无法达到的l织和分层你的应用程序的Ҏ. 斚w允许你很明显的把功能性的东西_合hQ所以你可以很方便的ؓE序设计很多的层。AOP可以拦截所有JAVAE序中的事g触发?/p>

    什么是AOPQ?/p>

    一个方面(aspect)是一个共有的Ҏ,h此代表性的有:横向分离的方法,c,对象层次或者实体对象模型。它们看h应该是组合在一LQ但是在AOP里面你不用像以前面对对象QOOQ那hl织它们了?/p>

    在传lJAVA中要加入计算旉的代码到你的应用中,你必L以下方式Q?/p>

public class BankAccountDAO{

 public void withdraw(double amount){

  long startTime = System.currentTimeMillis();

  try  {

    // Actual method body...

  }

  finally  {

    long endTime = System.currentTimeMillis() - startTime;

    System.out.println("withdraw took: "   endTime);

  }

 }

}

    我们可以列Dq里面存在的几个问题Q?/p>

    1。如果你要在每个你的Ҏ中都加入q样的代理,无疑是十分糟p的Q特别是有try/catchq样的语句?/p>

    2。这里有很多代码都不是你真实需要用到的Q这样就使你的程序代码十分臃肿,读v来也十分困难。而且你不得不把你的代码放在try里面......
   
    3。如果你要扩展这D代码,我们可以遇见到那是十分困难的工作?/p>

    所以可见,q样的代码是十分难于l护Q扩展和l承的,因ؓ在这里面有很多东西分散了你对你这D代码真正要实现的东西的注意力。而且q只不过是一D|单的例子Q在真正的OOP中是很难实现对以上代码更好的表现Ҏ的?/p>

    面对斚w~程可以分离你的q些功能性,可以让你增加行ؓ来围l你的功能代码。例如上面的QAOP可以在执行你自己的代码前你可以控制执行其它的功能?/p>

    所有实现AOP的框枉有两U方式:l装x??a programmatic construct(~程实现)

    JBOSS的一个横向切入关注点

01. public class Metrics implements org.jboss.aop.Interceptor

02. {

03.   public Object invoke(Invocation invocation) throws Throwable

04.   {

05.   long startTime = System.currentTimeMillis();

06.   try

07.   {

08.     return invocation.invokeNext();

09.   }

10.   finally

11.   {

12.     long endTime = System.currentTimeMillis() - startTime;

13.     java.lang.reflect.Method m = ((MethodInvocation)invocation).method;

14.     System.out.println("method "   m.toString()   " time: "   endTime   "ms");

15.   }

16.  }

17. }

    真正实现的功能代码是?行调用了Q这是实现了组装关注点Q之成Z一个方面。这让我们在以后扩展实际功能的时候就十分方便了,只需要去修改具体的实现方法,而不用去兛_其它x点了?/p>

    JBOOS中具体应用这个方?/p>

    需要定义一个切入点(pointcuts)Q全部通过政则表达式来实现?/p>

    Listing Three: Defining a pointcut in JBoss AOP

1. <bind pointcut="public void com.mc.BankAccountDAO->withdraw(double amount)">

2.     <interceptor class="com.mc.Metrics"/>

3. </bind >

4. <bind pointcut="* com.mc.billing.*->*(..)">

5.     <interceptor class="com.mc.Metrics"/>

6. </bind >

    1-3定义的一个切入点的方法就?BankAccountDAO->withdraw(double amount)

    4-6定义的是一个通用的,它的切入Ҏ所有的com.mc.billing.下面的类的方法?/p>

]]>
Spring AOP中文教程http://www.aygfsteel.com/bily/archive/2006/11/17/81742.htmlC必?/dc:creator>C必?/author>Fri, 17 Nov 2006 04:56:00 GMThttp://www.aygfsteel.com/bily/archive/2006/11/17/81742.htmlhttp://www.aygfsteel.com/bily/comments/81742.htmlhttp://www.aygfsteel.com/bily/archive/2006/11/17/81742.html#Feedback0http://www.aygfsteel.com/bily/comments/commentRss/81742.htmlhttp://www.aygfsteel.com/bily/services/trackbacks/81742.html    AOP正在成ؓ软g开发的下一个圣杯。用AOPQ你可以处理aspect的代码注入主E序Q通常ȝ序的主要目的q不在于处理q些aspect。AOP可以防止代码混ؕ?br />    Z理解AOP如何做到q点Q考虑一下记日志的工作。日志本w不太可能是你开发的ȝ序的主要d。如果能“不可见的”、通用的日志代码注入主E序中,那该多好啊。AOP可以帮助你做到?br />    Spring framework是很有前途的AOP技术。作ZU非늕性的Q轻型的AOP frameworkQ你无需使用预编译器或其他的元标{,便可以在JavaE序中用它。这意味着开发团队里只需一对付AOP frameworkQ其他hq是象往怸LE?br />    AOP是很多直觉难以理解的术语的根源。幸q的是,你只要理解三个概念,可以编写AOP模块。这三个概念是:adviceQpointcut?advisor。advice是你惛_别的E序内部不同的地Ҏ入的代码。pointcut定义了需要注入advice的位|,通常是某个特定的cȝ一?publicҎ。advisor是pointcut和advice的装配器Q是advice注入ȝ序中预定义位|的代码?/p>

    既然我们知道了需要用advisor向主要代码中注入“不可见的”adviceQ让我们实现一个Spring AOP的例子。在q个例子中,我们实C个before adviceQ这意味着advice的代码在被调用的publicҎ开始前被执行。以下是q个before advice的实C码:

    代码:
package com.company.springaop.test;

import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;

public class TestBeforeAdvice implements MethodBeforeAdvice {

public void before(Method m, Object[] args, Object target)
throws Throwable {
  System.out.println("Hello world! (by "
    + this.getClass().getName()
    + ")");
}
}

    接口MethodBeforeAdvice只有一个方法before需要实玎ͼ它定义了advice的实现。beforeҎq三个参数Q它们提供了相当丰富的信息。参数Method m是advice开始后执行的方法。方法名U可以用作判断是否执行代码的条g。Object[] args是传l被调用的publicҎ的参数数l。当需要记日志Ӟ参数args和被执行Ҏ的名Uͼ都是非常有用的信息。你也可以改变传lm的参敎ͼ但要心使用q个功能Q编写最初主E序的程序员q不知道ȝ序可能会和传入参数的发生冲突。Object target是执行方法m对象的引用?/p>

    在下面的BeanImplcMQ每个publicҎ调用前,都会执行adviceQ?/p>

    代码:
package com.company.springaop.test;

public class BeanImpl implements Bean {

public void theMethod() {
  System.out.println(this.getClass().getName()
    + "." + new Exception().getStackTrace()[0].getMethodName()
    + "()"
    + " says HELLO!");
}
}

    cBeanImpl实现了下面的接口BeanQ?/p>

    代码:
package com.company.springaop.test;

public interface Bean {
public void theMethod();
}

    虽然不是必须使用接口Q但面向接口而不是面向实现编E是良好的编E实践,Spring也鼓p样做?/p>

    pointcut和advice通过配置文g来实玎ͼ因此Q接下来你只需~写L法的Java代码Q?/p>

    代码:

package com.company.springaop.test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Main {

public static void main(String[] args) {

  //Read the configuration file
  ApplicationContext ctx = new FileSystemXmlApplicationContext("springconfig.xml");

  //Instantiate an object
  Bean x = (Bean) ctx.getBean("bean");

  //Execute the public method of the bean (the test)
  x.theMethod();
}
}

    我们从读入和处理配置文g开始,接下来马上要创徏它。这个配|文件将作ؓ_合E序不同部分的“胶水”。读入和处理配置文g后,我们会得C个创建工厂ctx。Q何一个Spring理的对象都必须通过q个工厂来创建。对象通过工厂创徏后便可正怋用?/p>

    仅仅用配|文件便可把E序的每一部分l装h?/p>

    代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "

<beans>
<!--CONFIG-->
<bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean">
  <property name="proxyInterfaces">
    <value>com.company.springaop.test.Bean</value>
  </property>
  <property name="target">
    <ref local="beanTarget"/>
  </property>
  <property name="interceptorNames">
    <list>
    <value>theAdvisor</value>
    </list>
  </property>
</bean>

<!--CLASS-->
<bean id="beanTarget" class="com.company.springaop.test.BeanImpl"/>

<!--ADVISOR-->
<!--Note: An advisor assembles pointcut and advice-->
<bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
  <property name="advice">
    <ref local="theBeforeAdvice"/>
  </property>
  <property name="pattern">
    <value>com\.company\.springaop\.test\.Bean\.theMethod</value>
  </property>
</bean>

<!--ADVICE-->
<bean id="theBeforeAdvice" class="com.company.springaop.test.TestBeforeAdvice"/>
</beans>

    四个bean定义的次序ƈ不重要。我们现在有了一个adviceQ一个包含了正则表达式pointcut的advisorQ一个主E序cd一个配|好的接口,通过工厂ctxQ这个接口返回自己本w实现的一个引用?/p>

    BeanImpl和TestBeforeAdvice都是直接配置。我们用一个唯一的ID创徏一个bean元素Qƈ指定了一个实现类。这是全部的工作?/p>

    advisor通过Spring framework提供的一个RegexMethodPointcutAdvisorcL实现。我们用advisor的一个属性来指定它所需?advice-bean。第二个属性则用正则表辑ּ定义了pointcutQ确保良好的性能和易L?/p>

    最后配|的是beanQ它可以通过一个工厂来创徏。bean的定义看h比实际上要复杂。bean是ProxyFactoryBean的一个实玎ͼ它是Spring framework的一部分。这个bean的行为通过一下的三个属性来定义Q?/p>

      * 属性proxyInterface定义了接口类?br />      * 属性target指向本地配置的一个beanQ这个beanq回一个接口的实现?br />      * 属性interceptorNames是唯一允许定义一个值列表的属性。这个列表包含所有需要在beanTarget上执行的advisor。注意,advisor列表的次序是非常重要的?/p>

    Spring工具

    虽然你可以手工修改Ant构徏脚本Q但使用SpringUIQ译注:SpringUI现在是Spring framework的一部分Qƈ改名为spring-ideQ,使用Spring AOP变得很简单,只要点点鼠标卛_。你可以把SpringUI安装成Eclipse的一个plug-in。然后,你只需在你的project上右击鼠标,q择“add Spring Project Nature”。在project属性中Q你可以在“Spring Project”下dSpring配置文g。在~译前把下面的类库加入projectQaopalliance.jarQcommons- logging.jarQjakarta-oro-2.0.7.jar和spring.jar。运行程序时你会看到下面的信息:

    ... (logging information)
    Hello world! (by com.company.springaop.test.TestBeforeAdvice)
    com.company.springaop.test.BeanImpl.theMethod() says HELLO!


    优点和缺?/p>

    Spring比v其他的framework更有优势Q因为除了AOP以外Q它提供了更多别的功能。作Z个轻型frameworkQ它在J2EE 不同的部分都可以发挥作用。因此,即不想使用Spring AOPQ你可能q是想用Spring。另一个优ҎQSpringq不要求开发团队所有的人员都会用它。学习Spring应该从Spring reference的第一开始。读了本文后Q你应该可以更好地理解Spring reference了。Spring唯一的缺Ҏ~Z更多的文档,但它的mailing list是个很好的补充,而且会不断地出现更多的文档?/p>

]]>
Aspectwerkz动态实现AOPhttp://www.aygfsteel.com/bily/archive/2006/11/15/81313.htmlC必?/dc:creator>C必?/author>Wed, 15 Nov 2006 09:02:00 GMThttp://www.aygfsteel.com/bily/archive/2006/11/15/81313.htmlhttp://www.aygfsteel.com/bily/comments/81313.htmlhttp://www.aygfsteel.com/bily/archive/2006/11/15/81313.html#Feedback0http://www.aygfsteel.com/bily/comments/commentRss/81313.htmlhttp://www.aygfsteel.com/bily/services/trackbacks/81313.html目前最成熟、功能最丰富?span lang="EN-US">AOP框架当数AspectJQ?span lang="EN-US">AspectJ已成为大多数其它框架跟从的标准。但是,AspectJ也走Z非同d的一步,它的实现?span lang="EN-US">Java语言增添了新的关键词。虽然新的语法ƈ不难学,但却意味着我们必须换一个编译器Q还要重新配制编辑器Q只有这h能适应新的语法。在规模较大的开发组中,q些要求可能难以办到Q因为整个开发小l都会受到媄响。由于语a本n的变化,开发小l把AOP技术引入到现有目的学习周期随之gѝ?/font>

   
现在我们需要的是这样一个框Ӟ它可以方便地引入Q且不会对原来的开发和构造过E生Q何媄响。满些要求的框架不止一个,例如JBoss AOP?span lang="EN-US">Nanning?span lang="EN-US">AspectwerkzQ?span lang="EN-US">AWQ。本文选用的是AspectwerkzQ因为它可能是最Ҏ学习的框Ӟ也是最Ҏ集成到现有项目的框架?font face="宋体">

    Aspectwerkz
?span lang="EN-US">Jonas Boner?span lang="EN-US">Alexandre Vasseur创徏Q它是目前最快速、功能最丰富的框架之一。虽然它q缺?span lang="EN-US">AspectJ的某些功能,但己以满大多数开发者在许多情Ş下的需要?font face="宋体">

    Aspectwerkz
最令h感兴的Ҏ之一是它能够以两U不同的模式q行Q联机模式和脱机模式。在联机模式下,AW直接q预属于JVM的底层类装入机制Q截取所有的c装入请求,对字节码实施x转换?span lang="EN-US">AW提供了干预类装入q程的许多选项Q另外还有一个替?span lang="EN-US">bin/java命o的封装脚本,q个脚本能够ҎJava版本?span lang="EN-US">JVM能力自动生成一l可q行的配制。对于开发者,联机模式有许多优点,它能插入CQ何类装入器ƈ在类装入期间生成新的cR也是_我们不必手工修改应用E序的类Q只要按通常的方式部|即可。不q,联机模式要求对应用服务器q行额外的配Ӟ有时q一要求可能很难满?font face="宋体">

   
在脱机模式下Q生成类需要二个步骤。第一步是用标准的~译器编译,W二步是重点—?/span>以脱机模式运?span lang="EN-US">AWcompiler~译器,让它处理新生成的cR编译器修改这些类的字节码Q根据一?span lang="EN-US">XML文g的定义,在适当?span lang="EN-US">point-cut插入advice。脱机模式的优点?span lang="EN-US">AWcompiler生成的类能够在Q?span lang="EN-US">JVM 1.3以上的虚拟机q行Q本文下面要用的是q种模式Q因为它不需要对Tomcat作Q何修改,只要Ҏ造过E稍作修改就可以照搬到大多数现有的项目?span lang="EN-US">

AspectWerkz 主要Ҏ:

    1Q运行时和加载时字节码修正:你可以在q行时或~译时轻杄攚wQ何(旧)应用E序或除?span lang="EN-US">rt.jar以外的外部类?span lang="EN-US">

    2Q支?span lang="EN-US">join point模型

    3Q支?span lang="EN-US">AnnotationQ匹?span lang="EN-US">JavaDoc?span lang="EN-US">JSR-175Q支持用戯定义Annotation

    4Q支持部|多?span lang="EN-US">Aspect定义文g到部|的应用E序Q?span lang="EN-US">WEB-INF/aop.xml?span lang="EN-US">META-INF/aop.xmlQ?span lang="EN-US">

    5Q?span lang="EN-US">Introduction/内类型声明(也称MixinQ,也就是具有添加接口和实现到已存在的类中的能力

    6Q?span lang="EN-US">Annotation定义Q定?span lang="EN-US">Aspect使用的运行时AnnotationJSR-175准备Q?span lang="EN-US">

    7Q?span lang="EN-US">XML定义Q定?span lang="EN-US">Aspect使用?span lang="EN-US">XMLQ?span lang="EN-US">XML可以用来_、改写和解析Annotation定义

    8Q插件式Aspect理器能够和IoC框架Q如Spring?span lang="EN-US">PicoContainerQ一起工?span lang="EN-US">

    9Q四U不同的Advice?span lang="EN-US">Introduction部v模型Q范_Q?span lang="EN-US">perJVMQ单模式Q?span lang="EN-US"> perClass?span lang="EN-US">perInstance ?span lang="EN-US">perThread

    10Q?span lang="EN-US">Advice?span lang="EN-US">Introduction能够动态部|Ӏ反部v或重新部|?span lang="EN-US">

    11Q高性能Q?span lang="EN-US">JIT~译

    12Q?span lang="EN-US">Fine-grained模式语言选择join point

    13Q所?span lang="EN-US">Advice能够和所有的join point和各U؜合类型的pointcut

    14Q脱机变换(可以用作后处理器Q?span lang="EN-US">

    15Q?span lang="EN-US">Aspect?span lang="EN-US">Advice?span lang="EN-US">Introduction使用POJO~码

    16Q目标类可以是正规的POJOQ也是不需要接?span lang="EN-US">

    17Q支持通过定义传递参数给Advice和定义可重用?span lang="EN-US">Advice堆栈

    18Q元数据被加到类?span lang="EN-US">

    19Q简单的用法和配|?span lang="EN-US">

开?span lang="EN-US">AOP

1Q这里我们要在屏q打印出?span lang="EN-US">Hello AOP!”,看如下代码:

//HelloAOP.java

public class HelloAOP {

    public static void main(String args[]) {

        HelloAOP ha = new HelloAOP();

        ha.test();

    }

    public void test() {

        System.out.println("Hello AOP!");

    }

}

~译HelloAOP.java文gQ?span lang="EN-US">javac HelloAOP.java

2Q现在我要在输出?span lang="EN-US">Hello AOP!”前后做一些工作,q些工作在运行时会得到调用机会,如果使用AOP术语Q我们可以说我们要编写我们的aspectQ这?span lang="EN-US">aspect会在q行时被weave into Q织入)HelloAOP class?span lang="EN-US">

//MyAspect.java

import org.codehaus.aspectwerkz.joinpoint.JoinPoint;

public class MyAspect {

    public void beforeTesting(JoinPoint joinPoint) {

        System.out.println("before testing...");

    }

    public void afterTesting(JoinPoint joinPoint) {

        System.out.println("after testing...");

    }

}

javac MyAspect.java

3Q织入过Eƈ不简单,我们需要撰写一个描q文件来?span lang="EN-US">aspect和其l入?span lang="EN-US">class中的信息联系h?span lang="EN-US">

//aop.xml

<aspectwerkz>

    <system id="AspectWerkzExample">

        <aspect class="MyAspect">

                <pointcut name="testMethod" expression="execution(* HelloAOP.test(..))"/>

                <advice name="beforeTesting" type="before" bind-to="testMethod"/>

                <advice name="afterTesting" type="after" bind-to="testMethod"/>

        </aspect>

    </system>

</aspectwerkz>

4)run it

aspectwerkz -Daspectwerkz.definition.file=aop.xml HelloAOP

//output:

before testing...

Hello AOP!

after testing...

Everything is fine!

]]>
վ֩ģ壺 | Ͷ| ˫| ˺| ɽ| | | | ͭ| | | ľ| Ĭ| | ԭ| | | | | ų| | | SHOW| | | | | | | | | ʼ| ɽ| ¡| | İ| | ɽ| | Դ| |