SpringのAOP @Pointcutの使いどころ
SpringのAOPのアノテーションで、@Pointcutだけ使い方がよくわからなかったのでメモ。
SpringのAOPってなに?
具体的な処理と関係のない処理(ロギングとか)が混じっていると、煩雑になって保守性が下がる。なので、具体的な処理と関係のない処理は別の場所でやりましょうね。という技術。
煩雑なコードの例
public class HogeClass {
private static final Logger logger = LoggerFactory.getLogger(HogeClass.class);
public void methodOne(String arg) {
logger.info("methodOne start" + arg);
//本当にやりたい処理が埋もれて見づらい
...
logger.info("methodOne end" + arg);
}
}
以下のようなクラスを作るとログ処理が挟み込める。(例だから適当)
@Aspect
public class LoggingAspects {
@Around("execution(* methodOne(..))")
public void logging(ProceedingJoinPoint pjp) throws Throwable{
String methodName = pjp.getSignature().getName();
Logger logger = LoggerFactory.getLogger(pjp.getTarget().getClass());
logger.info(methodName + " start " + pjp.getArgs()[0]);
pjp.proceed();
logger.info(methodName + " end " + pjp.getArgs()[0]);
}
}
AOPのクラスかどうか | @Aspect |
どんなタイミングでメソッドを実行するか | @Around ※1 |
どんな条件でメソッドを実行するか | execution(* methodOne(..)) ※2 |
※1 この他に@Before,@After,@AfterThrowing,@AfterReturingがある
※2 executionの他にannotation(..)でannotationがついてるかどうかでチェックできたりする。詳細はリファレンス参照。
本題(@Pointcutの使い道)
@Around(…)などで指定する条件式を使いまわしたいときに使う。
package common;
@Aspect
public class MyPointcuts {
@Pointcut("execution(* methodOne(..))")
public void methodOne(){}
@Aspect
public class LoggingAspects {
@Around("common.MyPointcuts.methodOne()")
public void logging(ProceedingJoinPoint pjp) {
...
}
これからもあんまり使わなさそう。