AspectJ’nin en iyi özelliklerinden biri Java kodlarını tam anlamıyla derleme yetkisine sahip olmasıdır. Java karakterine sahip sistemlerde — Android ve JavaFX gibi — AspectJ entegrasyonu bu özellik sayesinde gerçekleşebilmektedir. AspectJ compiler/weaver (ajc
), AspectJ kodlarını, Java kodlarını ve .class
dosyalarını derleyip dokuma işlemi yapmakta ve tanımlanan JVM içerisinde .class
uzantılı dosyalar üretmektedir. Kısaca projeyi çalıştırma aşamasına gelene kadar geçen sürede bu işlemci, tüm derlemeleri ve byte kod dokumalarını birleştirir ve bize çalışan bir program döndürür. Ayrıca, Load-Time Weaving (LTW) ile byte kodları çalışma zamanında da dokuyabiliriz.
Yukarıdaki anlatılanların gerçekleşmesi için maven projelerinde ve ayrıca geliştiricilerin tercih ettikleri diğer geliştirme ortamlarında ajc
uygun bir şekilde konfigüre edilmesi gerekmektedir.
-
Eclipse kullanıcıları için yüklenmesi gereken plug-in: AJDT
-
IntelliJ IDEA kullanıcılarının yüklemesi gereken AspectJ Plug-in: AJ Plug-in.
-
Maven projelerinde de AspectJ Maven Plug-in kullanarak aspect birimleri içerisinde yazılan enine kesen kodların esas kodlarla birlikte derlenmesini ve çalışmasını sağlamaktayız.
AspectJ dilinin tüm Java özelliklerini içerisinde barındırması için Java dilindeki son gelişmeleri takip etmesi gerekmektedir. Bu şartı bünyesinde barındırdığından dolayı AspectJ, Java sürümlerine göre kendini yenilemekte ve kendi içerisinde de yapılan gelişmeleri Java versiyonunu baz alarak ilerletmektedir. Java 8 aramıza katılmasıyla birlikte AspectJ 8’e de merhaba demiş oluyoruz. AspectJ 8 ilk sürümü 1.8.0 ile Java 8 yeteneklerini ilgi birimleri içerisinde kullanma imkanı sağlamaktadır. Şuan çok amaçlı ilgi tabanlı dil en son 1.8.4 sürümüyle kendisini güncellemektedir. İstenen geliştirme ortamlarında — Eclipse, Intellij IDEA — bu sürümü güncelleyerek ilgiye maruz kalan projelerde kullanılabilir. Maven için ise en son 1.8.3 sürümü çalışmaktadır.
AspectJ 8 gelmesiyle Aspect
birimleri içerisinde barındırdığı yetenekler de güçlenmektedir. Yaratılan bir ilgi biriminin içerisinde:
-
Lambda fonksiyonları
-
Default metodlara sahip arayüzler
-
Stream API ve onunla kullanılan yöntemler
-
Diğer Java 8 ile gelen yenilikçi birimler kullanılabilir.
Ayrıca AspectJ 8, yeni bir birleşim noktasına (join point) daha sahip olmaktır: default ve statik metod çağırma/yürütme noktası. Java 8 ile birlikte gelen default metod ve statik metod yapısı ilgiye muhtaç bir nokta olduğu zamanlarda hem bu metodun çağırılmasında hem de yürütülmesinde gerçekleşecek enine kesen ilgileri bağlama imkanına sahip oluyoruz. Dikkate değer bir bilgi olarak; super
anahtar kelimesiyle çağırılan arayüzün kendi varsayılan (default) metodu bir birleşim noktası olarak birlenmemektedir.
Important
|
Java 8 yeniliklerini öğrenmek ve dolayısıyla AspectJ 8 ile kullanmak için Rahman Hocanın hazırlamış olduğu Java 8 E-Kitab sizin için güzel bir başlama noktası olacaktır. |
Maven, codehaus.org projesi yoluyla AspectJ plug-in sağlamaktadır. Bu plug-in ile birlikte AspectJ compiler/weaver tetiklenerek ilgi yönelimli projeleri çalışır hale getirmektedir. pom.xml
dosyasının içerisini konfigüre ederek istenilen maven projelerinde AspectJ desteğini vermiş oluruz. Bunun için ilk yapılması gereken faaliyet AspectJ Runtime (yani aspectjrt
) bağımlılığını projenin içerisine tanıtmaktır.
<dependencies> <dependency> <! -- The aspectjrt needed to execute a program using AspectJ --> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.3</version> </dependency> </dependencies>
Bu bağlılığı tanıttıktan sonra AspectJ Maven Plug-in ayarlanmalıdır:
... <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> (1) <artifactId>aspectj-maven-plugin</artifactId> <version>1.7</version> <configuration> <complianceLevel>1.8</complianceLevel> (2) <outxml>true</outxml> (3) <verbose>true</verbose> (4) <showWeaveInfo>true</showWeaveInfo> (5) <skip>false</skip> (6) <proceedOnError>false</proceedOnError> (7) </configuration> <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> (8) <version>1.8.3</version> </dependency> </dependencies> <executions> <execution> <phase>process-sources</phase> (9) <goals> <goal>compile</goal> </goals> </execution> </executions> </plugin> ... </plugins> </build> ...
-
aspectj-maven-plugin son versiyonu 1.7 ile tanıtılmakta.
-
Derleme uyumluluğunu 1.8 olarak ayarlıyoruz çünkü ilgi birimleri içerisinde Java 8 yeteneklerinden faydalanmaktayız (ör. Lambda fonksiyonları). Varsayılan ayarı 1.4.
-
Opsiyonel olarak derleme sonrasında
META-INF
konumuna load-time weaving içinaop.xml
dosyası yaratılıyor. -
Hata olduğu zaman hatanın oluşumunda meydana gelen yolu tümüyle göstermek amacıyla konulabilir. Opsiyoneldir.
-
Dokuma işlemlerini tamamiyle göstermesi için kullanılan opsiyonel özellik.
-
aspectj plug-in atlanması için koyulan opsiyonel özellik.
-
Hata durumunda derlemeyi durdurmadan tamamlama ve hatanın oluştuğu kısımları belirtmek için kullanılabilir.
-
Versiyon geçişlerinde uyumluluğun sağlanması için aspectj plug-in içerisinde `aspectjtools ` bağlılığını da tanıtmak gerekmektedir.
-
phase
etiketinin kaldırılmasıyla mavencompile:compile
komutunu çalıştıracakaspectj:compile
komutundan önce, yani sistemdeki.aj
uzantılı dosyalar atlanacak bu da bize esas sınıfların ilgiye maruz kaldığı noktalar derlenemeyeceği için hata fırlatıcak. Sistemdeki kodlarjavac
ile çalışmamaktadır. Mavencompile:compile
amacını atlayarakaspectj:compile
(yaniajc
) çalıştırmak içinphase
etiketi ile birlikteprocess-sources
ifadesi getirilmektedir.
Bilinmesi gerekebilecek diğer özellikler:
-
<aspectDirectory> : Varsayılan aspect birimlerinin içinde barınması gereken dizin:
src/main/aspect
-
<forceAjcCompile> : Sistemin
ajc
uyumluluğu için tekrar sorgulama seçeneği. Varsayılan değerifalse
. -
<testAspectDirectory> : Varsayılan test içeriğinin barınacağı dizin :
src/test/aspect
-
<goal>test-compile</goal> : Eğer gerekli test birimleri sistemde mevcut ise onlarında derlenmesi için gereken komut
goals
etiketi içine tanımlanabilir. Bu komutlaaspectj:test-compile
devreye girecektir.
Örnek yapılan çalışır AspectJ 8 desteği olan Maven projesinin hem esas hem de ilgi birimlerine göre düzenlenmiş dizini:
src \---main +---aspect | \---com | \---kodcu | \---app | \---aspects | DataAspect.aj | SoftenedHandlerAspect.aj | SystemStructure.aj | TraceAspect.aj | ValidationAspect.aj | +---java \---com \---kodcu \---app +---data | Brand.java | Data.java | +---devices | Device.java | Mobile.java | NoteBook.java | Tablet.java | +---imp | Printable.java | +---main | Startup.java | \---phones Phone.java SmartPhone.java
Sistemde ilgi birimlerinin amacını kısaca açıklamak gerekirse:
-
DataAspect :
Data.java
sınıfı için oluşturulan bu ilgi biriminde gereken koleksiyonların miktarlarını öğrenmek amacıyla ara tip method ve alan tanımlamaları yapılmıştır. Ayrıca, after tavsiye yapısı içerisinde bu yaratılan alanlara gerekten atama esas ilgiden sonra yapılmaktadır. -
SoftenedHandlerAspect : Yumuşatılmış istisna yapısı
default
olanprintSignature
metodu veTraceAspect
sınıfı içinde tanımlanan parametre almayan, dönüş tipi ve erişim belirleyicisine bakılmaksızın sonuTracing
ile biten metodları kapsamaktadır çünkü bu metodlar potansiyel olarakIOException
fırlatma davranışına sahipler. -
SystemStructure: Sistemin statik yapısı bu ilgi birimi içerisinde düzenlenmektedir.
-
TraceAspect : Sistemin çalışmasıyla birlikte
Startup
sınıfının içerisinde istenen birleşim noktalarında kendi oluşturduğumuz imza deseni ile tüm metod ve yapıcı çağırmalarını izlemekteyiz. Programın sonlanmasıyla projenin ana dizininetrace.txt
dosyası yaratılmış olacak ve birleşim noktalarının izleri bu dosyada yazıyor olacaktır. -
ValidationAspect : Bu ilgi,
Device
sınıfının nesnesi oluşturulurken gerekli parametre değerlerininnull
olmaması gerektiğini kontrol eden bir karaktere sahiptir.
Bu Maven projesine github.com/kodcu üzerinden erişebilirsiniz.