2011-11-15 54 views
3

想象一下,你有一個方面:簡單使用的AspectJ

@Aspect 
public class MyAspect { 
    @Pointcut("whatever") 
    public void anyAnnotation() {} 

    @Before("anyAnnotation()") 
    public void anyComponentAdvice(JoinPoint joinPoint) { 
     System.out.println("DONE"); 
    } 
} 

而且你有一個簡單的應用程序:

public class MyClass { 
    public static void main(String[] args) { 
     // ASPECTJ INITIALIZATION BLOCK 
     // rest of the code 
    } 
} 

你需要什麼代碼放入「AspectJ的初始化阻止「應用程序自動識別和應用方面?使用Spring AOP等一些框架,你可以使用<aop:aspectj-autoproxy/>,但是我不知道如何在沒有Spring的情況下做同樣的事情。

編輯:其他更簡單的方法來攔截執行時方法調用,沒有方面,是值得歡迎的。

+1

我不認爲這就是AspectJ的工作原理。根據我的記憶,它通過修改字節碼作爲構建步驟或加載類時將各個方面「編織」到現有代碼中。這兩者都不能以直接的方式從'main()'方法完成。 – millimoose

+1

(非直截了當的方式涉及使用文檔中提到的自定義類加載器加載應用程序代碼:http://www.eclipse.org/aspectj/doc/released/devguide/ltw-configuration.html#d0e2867) – millimoose

+0

@Inerdia感謝您的評論,您是否知道任何其他方式/庫來攔截方法調用? (任何類型的代理...)在執行時? –

回答

1

從我記得的AspectJ中,它通過修改字節碼作爲構建步驟或加載類時,將各個方面「編織」到現有代碼中。這兩者都不能以直接的方式從main()方法完成。

非直接的方式涉及使用文檔中提到的a custom classloader加載您的應用程序代碼。

對於獨立的應用程序,AspectJ可能仍然是最好的方法來做你想做的事 - 但使用建造時編織。你的IDE,Ant和Maven都應該支持這一點。官方文檔包括how to use the Ant tasks。 Maven插件的文檔是here。如果使用shell腳本構建,也可以使用ajc命令。至於IDE插件,我只知道他們在身邊,不熟悉他們的使用。