SORU
28 Ocak 2011, Cuma


Java özelliğe ek Açıklamalar ile Programlama

Post "AOP Fundamentals" başlıklı bir için sordumKral İngilizceSOP nedir, ne açıklama. Çok yararlı cevaplar ve linkler bana teori üzerinde doldurmak yardımcı makaleler için biraz aldım.

Ama şimdi SOP dikkatimi var, ve tüm bu makaleler ve alıntılar bölüm harika amaher durumdayüce teorisi, belirsiz UML modelleri, ve çok benim sevme için yüksek soyutlama sipariş oluşmaktadır.

Burada SOP teorisi bildiğim kadarıyla, sadece açıklığa kavuşturmak için, çok yanlış görünen bir şey görürseniz, bana haber verin!:

  1. Çapraz kesme Günlüğü, kimlik Doğrulama, Senkronizasyon, Doğrulama, özel Durum İşleme gibi kaygıları vb. -birleştiğinde son derece evrensel olarak neredeyse her bileşen tarafından kullanılan non-SOP sistemleri/bulunanla modül olur.

  2. Servis operatörleri tanımlaryönleri(sınıfları/yöntem) soyut çapraz kesim kullanımı ile endişeleri bunoktaları birleştirmek,tavsiyevepointcuts.

    bir.Tavsiye- Gerçek kod (yöntem bir yönü olabilir mi?) uygulama çapraz kesim endişe (asıl günlüğü, doğrulama, kimlik denetimi yapıyor, vb.)

    b.Bir Birleşim Noktası- Belirli bir yönü tavsiyesi idam neden olan non-SOP kodu tetiklenen bir olay ("" sigara içilmez " / kodu) . dokuma

    c.Pointcut- Aslında, bir eşleme puan (tetiklemek) tavsiye yürütülmesi için Facebook'a katıl

  3. Tüm yönleriyle (LoggingAspect, AuthenticationAspect, vb. ValidationAspect) modüler vardır bileşenlerine ve kayıtlıAspectWeaver. Non-SOP/POJO kodu bir birleşim noktası üzerinde geldiğinde, AspectWeaver "örgüleri" (entegre) etrafında eşlenen tavsiyesi olmayan SOP kodu:

public class LoggingAspect
{
    // ...

    public void log(String msg) { ... }
}

public class ExceptionHandlingAspect
{
    // ..

    public void handle(Exception exc) { ... }
}

public class NonAOPCode
{
    // ...

    @LoggingAspect @ExceptionHandlingAspect
    public void foo()
    {
        // do some stuff...
    }
}

// Now in the driver
public static int main void(String[] args)
{
    NonAOPCode nonAOP = new NonAOPCode();
    nonAOP.foo();
}

// The AspectWeaver *magically* might weave in method calls so main now becomes:
{
    NonAOPCode nonAOP = new NonAOPCode();

    log(someMsg);
    nonAOP.foo();
    handle(someExc);
}

64.000 Dolarlık Soru:Java tabanlı anlayışım hedef, ya da, neden bu şekilde servis operatörleri. Nasıl birdoğruyönlerinin uygulanması, tavsiye, noktaları birleştirmek için ek açıklamalar, pointcuts ve sözde bu yönü weaver kullanmak?

CEVAP
29 Ocak 2011, CUMARTESİ


Hadi o zaman bazı annoted yöntemlerle alınan @LogExecTime bir açıklama kullanarak günlük yapmak istediğiniz düşünün.

Ben ilk 8**: bir açıklama oluşturun

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogExecTime {

}

O zaman ben bir yönünü tanımlayın:

@Component  // For Spring AOP
@Aspect
public class LogTimeAspect {
    @Around(value = "@annotation(annotation)")
    public Object LogExecutionTime(final ProceedingJoinPoint joinPoint, final LogExecTime annotation) throws Throwable {
        final long startMillis = System.currentTimeMillis();
        try {
            System.out.println("Starting timed operation");
            final Object retVal = joinPoint.proceed();
            return retVal;
        } finally {
            final long duration = System.currentTimeMillis() - startMillis;
            System.out.println("Call to "   joinPoint.getSignature()   " took "   duration   " ms");
        }

    }
}

Bir sınıf LogExecTime ile annoted oluşturun:

@Component
public class Operator {

    @LogExecTime
    public void operate() throws InterruptedException {
        System.out.println("Performing operation");
        Thread.sleep(1000);
    }
}

Ve bir ana Bahar SOP kullanarak:

public class SpringMain {

    public static void main(String[] args) throws InterruptedException {
        ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
        final Operator bean = context.getBean(Operator.class);
        bean.operate();
    }
}

Eğer bu sınıf kaçarsam stdout üzerinde aşağıdaki çıktıyı alıyorum:

Starting timed operation
Performing operation
Call to void testaop.Operator.Operate() took 1044 ms

İle şimdisihirli. AspectJ weaver yerine Bahar servis operatörleri kullandım, sihirli zaman proxy gibi mekanizmalar kullanarak, çalışma zamanında gerçekleşiyor. .class dosyalar dokunulmadan kalır. Ben bu programı hata ayıklama ve operate kesme noktası koyarsanız örneğin Bahar büyüsü nasıl performans gösterdiğini görürsünüz.

Debug screen shot

Bahar SOP uygulamasıdırnon-müdahalecive Yay kullanır @Component ek açıklama eklemek ve nesne Bahar bağlam oluşturmak yerine new düz için gereken mekanizmaları.

Diğer tarafta AspectJ .class dosyaları değiştirir. AspectJ ile bu projeyi denedim ve jad ile Operatör sınıfı decompiled. Yol:

public void operate()
    throws InterruptedException
{
    JoinPoint joinpoint = Factory.makeJP(ajc$tjp_0, this, this);
    operate_aroundBody1$advice(this, joinpoint, LogTimeAspect.aspectOf(), (ProceedingJoinPoint)joinpoint, (LogExecTime)(ajc$anno$0 == null && (ajc$anno$0 = testaop/Operator.getDeclaredMethod("operate", new Class[0]).getAnnotation(testaop/LogExecTime)) == null ? ajc$anno$0 : ajc$anno$0));
}

private static final void operate_aroundBody0(Operator ajc$this, JoinPoint joinpoint)
{
    System.out.println("Performing operation");
    Thread.sleep(1000L);
}

private static final Object operate_aroundBody1$advice(Operator ajc$this, JoinPoint thisJoinPoint, LogTimeAspect ajc$aspectInstance, ProceedingJoinPoint joinPoint, LogExecTime annotation)
{
    long startMillis = System.currentTimeMillis();
    Object obj;
    System.out.println("Starting timed operation");
    ProceedingJoinPoint proceedingjoinpoint = joinPoint;
    operate_aroundBody0(ajc$this, proceedingjoinpoint);
    Object retVal = null;
    obj = retVal;
    long duration = System.currentTimeMillis() - startMillis;
    System.out.println((new StringBuilder("Call to ")).append(joinPoint.getSignature()).append(" took ").append(duration).append(" ms").toString());
    return obj;
    Exception exception;
    exception;
    long duration = System.currentTimeMillis() - startMillis;
    System.out.println((new StringBuilder("Call to ")).append(joinPoint.getSignature()).append(" took ").append(duration).append(" ms").toString());
    throw exception;
}

private static void ajc$preClinit()
{
    Factory factory = new Factory("Operator.java", testaop/Operator);
    ajc$tjp_0 = factory.makeSJP("method-execution", factory.makeMethodSig("1", "operate", "testaop.Operator", "", "", "java.lang.InterruptedException", "void"), 5);
}

private static final org.aspectj.lang.JoinPoint.StaticPart ajc$tjp_0; /* synthetic field */
private static Annotation ajc$anno$0; /* synthetic field */

static 
{
    ajc$preClinit();
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • buttheadgsxr1000

    buttheadgsxr

    24 Ocak 2008
  • Jonathan D.

    Jonathan D.

    3 Kasım 2006
  • waterfairy17

    waterfairy17

    9 Aralık 2007