ジュース_そにょ2

Guiceのメモ続き.
いや決してこんなことばっかやってるわけではないんだけど.
他の仕事もちゃんとやってますよ,ええ.


デフォルト実装をInterface側に@ImplementedByタグを使って記述できる.
通常実装されるべき実装が判っている場合はこの方法で実装しておくと良さげ.

@ImplementedBy(OrderServiceImpl.class)
public interface OrderService {
public void addOrder(Order order);
}

public class OrderServiceImpl implements OrderService {
public void addOrder(Order order) {
// 実装を記述
}
}


Module側にAbstractModuleを用いて,Providerを使うと,
Guiceで生成される前処理とか記述できる模様.
DataSourceの生成を隠蔽する場合なんかに使えそうな模様.

package jp.bne.deno.order.common;

import javax.sql.DataSource;

import org.h2.jdbcx.JdbcDataSource;

import com.google.inject.Provider;

/**
* DataSourceプロバイダ
*/
public class DataSourceProvider implements Provider {

public DataSource get() {
JdbcDataSource ds = new JdbcDataSource();
ds.setURL("jdbc:h2:data/order");
ds.setUser("sa");
ds.setPassword("");
return (DataSource) ds;
}
}

同,InterCepterを使って,AOPを使うと,メソッド呼出の前後でログ出力を挟んだり,
例外発生時に,間にAspect噛ましてスタックトレース出力したりできる.
結構便利.

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.log4j.Logger;
import org.apache.log4j.NDC;

public class LoggingIntercepter implements MethodInterceptor {

Logger log = Logger.getLogger(LoggingIntercepter.class);

/**
* 各メソッド実行前後でログ出力する.
*/
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
String className = methodInvocation.getMethod().getDeclaringClass()
.getSimpleName();
String methodName = methodInvocation.getMethod().getName();
NDC.push(className);
NDC.push(methodName);
try {
log.info(":start");
Object obj = methodInvocation.proceed();
log.info(":end");
return obj;
} catch (Throwable e) {
log.error(e);
throw e;
} finally {
NDC.pop();
NDC.pop();
}
}
}