
Springで、アスペクト指向について解説させて頂きましたが、「AspectJ」という外部のソフトウェアを使ってもっと楽に、アスペクト指向プログラミングを行うことができるのでご紹介します。
AspectJを入手する。
まずは、AspectJを入手しましょう。
pom.xmlのMavenの依存関係に下記の記述を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.1</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.1</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>1.9.1</version> </dependency> |
※2018/5/13日現在では、Mavenのセントラルレポジトリに上がっているAspectJの最新版が「1.9.1」になっていたので上記の記述にしています。
なお、Mavenのセントラルレポジトリでのソフトウェアのバージョンの確認方法については、下記の記事で解説しています。
依存関係で、追加したAspectJのソフトウェアについて
ソフトウェア | 説明 |
---|---|
aspectjrt | 「アスペクトJ」のランタイムプログラムです。AspectJのコア機能です。 |
aspectjweaver | アスペクト情報を元に、組み込んだコードを生成するユーティリティです。 |
aspectjtools | アスペクト情報を元に、組み込んだコードを生成するユーティリティです。 |
実装してみる。
実装イメージは、クラス図にすると下記です。
Main.java(メインプログラム)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package com.springapp; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { ApplicationContext app = new ClassPathXmlApplicationContext("aopbean.xml"); TestBean bean = (TestBean) app.getBean("testBean"); bean.HelloWorld(); } } |
AspectTest.java(AspectJによる事前事後に注入する処理)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.springapp; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class AspectTest { @Before("execution(* com.springapp.TestBean.*(..))") public void before() { System.out.println("事前処理"); } @After("execution(* com.springapp.TestBean.*(..))") public void after() { System.out.println("事後処理"); } } |
AspectJを使わない場合に比べると、ソースは少しすっきりしていると思います。
「execution」によって、どのメソッドに処理を挿入するか設定しています。AspectJを使わない場合は、設定ファイルに記述していたのでより直感的になりましたね。
使っているアノテーション
アノテーション | 説明 |
---|---|
@Aspect | AspectJで挿入するクラスの頭にはこれをつけます。 |
@Before | 実行前に処理されるメソッドであることを示します。 |
@After | 実行後に処理されるメソッドであることを示します。 |
TestBean.java(AspectJにより注入される処理)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package com.springapp; public class TestBean { private String helloWorld; public TestBean() { super(); this.helloWorld = "Hello World!"; } public void setHelloWorld(String helloWorld) { this.helloWorld = helloWorld; } public TestBean(String helloWorld) { this.helloWorld = helloWorld; } public void HelloWorld() { System.out.println(this.helloWorld); } } |
aopbean.xml(アスペクトJの設定ファイル)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="sampleAspect" class="com.springapp.AspectTest" /> <bean id="testBean" class="com.springapp.TestBean" /> <aop:aspectj-autoproxy /> </beans> |
AspectJを使わない場合に比べると、設定内容は少しすっきりしていると思います。
ポイントは、下記の記述で、処理の挿入を自動生成するための設定内容になります。
1 |
<aop:aspectj-autoproxy /> |
実行結果
最後に
やっていることは、下記の記事の内容と同じですが、「AspectJ」を利用することでより直感的に、簡単に記述できたと思います。
Springに、Aspect指向プログラミングを導入するのであれば、ぜひ「AspectJ」の導入を検討しましょう。
この記事へのコメントはありません。