load-time weavingで広がるaopの 可能性 · –eclipseで学ぶはじめてのjava...

48
Load-time weavingで広がるAOP可能性 1

Upload: others

Post on 28-May-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

Load-time weavingで広がるAOPの可能性

1

Page 2: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

自己紹介

• 名前:木村 聡(きむら さとし)

• Seasarプロジェクトコミッタ:

– S2Struts

– S2Mai

–舞姫

• 仕事

– (株)フルネス

– フレームワーク

–自動生成ツール2

Page 3: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

これまで書いたものとか

• 書籍:– Eclipseで学ぶはじめてのJava– Seasar入門 ~はじめてのDI&AOP~

• 雑誌、Web記事– CodeZine– DB Magazine– WEB+DB

• 「Seasar2徹底攻略」 (Vol.31)

– JavaWorld• 「開発者にとって“易しく、優しい”軽量コンテナ

Seasar2の実力を探る」 (2005/05)

3

Page 4: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

はじめに

• AOPの乱用禁止

4

Page 5: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

AOPとは• Aspect Oriented Programの略• 日本語では「アスペクト指向プログラム 」

• ソフトウェアの複雑さの低減や再利用性を向上させる

• よく使われる機能– ログ– 例外処理– トランザクション– 認証処理– RPC– 障害対応

• S2プロダクトだと– S2Dao 5

Page 6: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

簡単に言うと

• AOPの仕組みを使うと、

後から機能や処理を挿入することができるようになる

6

Page 7: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

public String hello(String arg) {Strimg message = "Hello " + arg;System.out.println(message);return message;

}

実行

Hello World

7

Page 8: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

public String hello(String arg) {Strimg message = "Hello " + arg;System.out.println(message);return message;

}

AOP使って実行

2009-03-14 17:00.00 BEGIN hello("World")Hello World2009-03-14 17:00.01 END hello("World") : "Hello World"

+設定ファイルなど

8

Page 9: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

AOPのメリット

• 生産性の向上

–共通処理を記述しなくても良い

• 品質の向上

–共通処理の埋め込み忘れが減る

• アノテーションの処理を組み込みやすい

9

Page 10: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

よく見かける文章

• AOPを使って、

アプリケーションのソースコードを一切変更することなく、○○します。

10

Page 11: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

Struts Only

このStrutsで作られたシステムにAOPでTraceを出してくれ

11

Page 12: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

Struts Only

将軍様Seasarで作り直してくださいそうしたら出来ます

12

Page 13: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

AOPは適用が難しい

• クラスの書き換えが必要

– コンパイル時に書き換える

• ツール/文法が難しい

– Java以外の言語、ツールを覚える必要がある

• AspectJとか

13

Page 14: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

これまでの条件

• SeasarなどAOPの仕組みが提供されているフレームワークを使っていれば出来る

• AspectJなどを使う場合、コンパイルし直せば出来る

• AOPとDIコンテナは相性が良い

– DIコンテナのメリット

14

Page 15: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

深いところには手が届かない

• Strutsとかライブラリの中のクラス

– ライブラリもコンパイルしなおせばOK

15

Page 16: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

現在は

• できます

16

Page 17: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

Demo

17

Page 18: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

Demo

18

• S2のUtilクラスのシーケンス図をS2Javelinで出力

Page 19: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

内部的には

• バイトコードエンジニアリング

• Java5から動的にバイトコードを操作するための枠組みが提供されるようになった

– - javaagent

• クラスロード時に操作可能– 実行時、コンパイル時ではなく

• JavaRebel

• Pleiades19

Page 20: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

できること

• メソッドに仕掛ける

– privateも

– final,staticも

• コンストラクタに仕掛ける

20

Page 21: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

基本スペック

• AOP Alliance○ MethodInterceptor

○ ConstructorInterceptor

× FieldInterceptor

• Java標準– javax.interceptor.○ AroundInvoke(AOP AllianceのMethodInterceptor)

○ InvocationContext(AOP AllianceのInvocation)

○ ExcludeClassInterceptors

× Interceptors21

Page 22: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

こんな時に使える

• バグFix

• 深い場所にあるクラスのログなど

• デバッグ時のtoString

–個人の生産性を高める

• Unitテスト

–戻り値や引数を強引に変更

• キャッシュ

22

Page 23: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

こんな時に使える

• バグFix

– ライブラリのバージョンを上げたい

• でも、アプリのコードがコンパイルエラーになるので見送り

• 部分的なパッチを作りAOPで対応• アプリのコードが影響の出ないようにできる 23

Page 24: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

使用方法

1. jarを配置

2. java のオプション指定

java -javaagent:kimu-aop-core.jar foo.bar.Main

3. 設定ファイルを用意

24

Page 25: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

設定ファイル解説• 基本

– ファイル名:aspect.xml

– Seasar2のdiconファイルを意識

<aspect-config><def target="org.apache.struts.Action"><aspect>

new jp.dodododo.aop.interceptors.TraceInterceptor()</aspect>

</def></aspect-config>

対象となるクラスを指定

機能(TraceInterceptorは、ログ)

25

Page 26: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

設定ファイル解説

• 正規表現で指定

<aspect-config><def target="jp.co.foo.bar.*ServiceImpl"><aspect>

new jp.dodododo.aop.interceptors.TraceInterceptor()</aspect>

</def></aspect-config>

正規表現も可能

26

Page 27: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

設定ファイル解説

• メソッドの指定

<aspect-config>

<def target="jp.co.foo.bar.*ServiceImpl">

<aspect pointcut="execute,toString">

new jp.dodododo.aop.interceptors.TraceInterceptor()</aspect>

</def>

</aspect-config>

pointcutで指定

・指定しない場合は、implメソッド・Genericsも対応

27

Page 28: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

設定ファイル解説

• メソッドの指定

<aspect-config>

<def target="jp.co.foo.bar.*ServiceImpl">

<aspect pointcut=".*">

new jp.dodododo.aop.interceptors.TraceInterceptor()</aspect>

</def>

</aspect-config>

正規表現も可能

28

Page 29: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

設定ファイル解説

• メソッドの指定

<aspect-config>

<def target="jp.co.foo.bar.*ServiceImpl">

<aspect pointcut=".*" not="toString,hashCode">

new jp.dodododo.aop.interceptors.TraceInterceptor()</aspect>

</def>

</aspect-config>

notで除外

29

Page 30: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

設定ファイル解説

• アクセス修飾子の指定

<aspect-config>

<def target="jp.co.foo.bar.*ServiceImpl">

<aspect modifier="private">

new jp.dodododo.aop.interceptors.TraceInterceptor()</aspect>

</def>

</aspect-config>

・modifierで指定・指定した修飾子以上

・public(デフォルト)・protected

・package-private

・private30

Page 31: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

設定ファイル解説

• Interceptorの指定

<def target="jp.co.foo.bar.*ActionImpl"><aspect>new jp.dodododo.aop.interceptors.TraceInterceptor()

</aspect></def>

<def target="jp.co.foo.bar.*ServiceImpl"><aspect>jp.dodododo.aop.interceptors.TraceInterceptor.getInstance()

</aspect></def>

Javaのコードを1ステートメントで記述

31

Page 32: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

設定ファイル解説

• 優先度

<aspect-config><def target="jp.co.foo.bar.BazServiceImpl"><aspect>new jp.dodododo.aop.interceptors.SimpleTraceInterceptor()

</aspect></def><def target="jp.co.foo.bar.*ServiceImpl"><aspect>

new jp.dodododo.aop.interceptors.TraceInterceptor()</aspect>

</def></aspect-config>

・上に書いてある方が優先

32

Page 33: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

設定ファイル解説

• 優先度

<aspect-config>

<def target="org.apache.log4j.*" />

<def target="jp.co.foo.bar.*ServiceImpl"><aspect>

new jp.dodododo.aop.interceptors.TraceInterceptor()</aspect>

</def></aspect-config>

・AOP対象外

33

Page 34: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

特定のメソッドを対象外にする

• Seasar2だと

– finalメソッドにする

– Interfaceからメソッドを除く

– pointcutで頑張る

public final String hello(String arg) {Strimg message = "Hello " + arg;System.out.println(message);return message;

}

34

Page 35: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

特定のメソッドを対象外にする

• kimu-aop

– Enhanceアノテーションで指定

– ExcludeClassInterceptorsアノテーションで指定

– (notで指定)

@Enhance(false)public String hello(String arg) {

Strimg message = "Hello " + arg;System.out.println(message);return message;

}

無限ループしないように自作のインターセプタとかに付ける

35

Page 36: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

特定のメソッドを対象外にする

• kimu-aop

– Enhanceアノテーションで指定

– ExcludeClassInterceptorsアノテーションで指定

– (notで指定)

@ExcludeClassInterceptorspublic String hello(String arg) {

Strimg message = "Hello " + arg;System.out.println(message);return message;

}36

Page 37: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

用意しているInterceptor

• お約束(S2AOPと同じ)

–ログ系

• TraceInterceptor

• SimpleTraceInterceptor

• ThrowsInterceptor– TraceThrowsInterceptor

–同期

• SyncInterceptor

37

Page 38: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

用意しているInterceptor

• 独自

– TraceWithCustomLoggerInterceptor

– TakeOverInterceptor

• CommonsBuilderInterceptor

• ToStringInterceptor

• CloneInterceptor

38

Page 39: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

TraceWithCustomLoggerInterceptor• クラス単位でTraceログの設定が可能

– log4j.properties

39

Page 40: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

TakeOverInterceptor

• Interceptorに定義しているメソッドにシグネ

チャが同じメソッドがあれば、そのメソッドを実行

40

Page 41: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

CommonsBuilderInterceptor• Objectクラスメソッドの実装

public class CommonsBuilderInterceptorextends TakeOverInterceptor {

public String toString() {Object target = getThis();return ToStringBuilder.reflectionToString(target);

}public int hashCode() {Object target = getThis();return HashCodeBuilder.reflectionHashCode(target);

}public boolean equals(Object obj) {Object target = getThis();return EqualsBuilder.reflectionEquals(target, obj);

}} 41

Page 42: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

ToStringInterceptor

• 配列などに対応

42

Page 43: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

CloneInterceptor

• シリアライズ、デシリアライズ

43

Page 44: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

S2AOPとの違い

• エンハンスしたクラス

– S2AOP:対象のクラスを継承したクラス

– KimuAop:対象のクラスそのもの• ターゲットのクラス取得の作法が異なる(独自のInterceptorを作る場合に注意かも)

• InterceptorはSingletonでない– 定義時にgetInstance()とか書けばOK

• インターフェースをそのままインスタンス化できない

– ex:S2Dao

44

Page 45: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

今後

• Unitテスト用の仕組みを提供

– (今もあるけど、変更する予定)

45

Page 46: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

プロダクト情報

• 名前

– Kimu-aop

• URL

– http://code.google.com/p/kimu-aop/

46

Page 47: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

まとめ

• AOPの乱用禁止

• kimu-aop

–ほぼ何でも出来る

• いままでリーチできなかったクラスにリーチ

– S2AOPとの違いに注意

47

Page 48: Load-time weavingで広がるAOPの 可能性 · –Eclipseで学ぶはじめてのJava –Seasar入門~はじめてのDI&AOP~ •雑誌、Web記事 –CodeZine –DB Magazine

終わり

• ご清聴ありがとうございました

48