需求,现在有个功能buyBook,需要给buyBook前后添加日志。如
事务开启。。。
买书。。。
事务提交。。。
我们采取动态代理的方法实现
- 创建我们的功能代码,BookService,BookServiceImpl
public interface BookService {
void buyBook();
}
public class BookServiceImpl implements BookService{
@Override
public void buyBook() {
System.out.println("买书。。。");
}
}
- 定义InvocationHandler代理接口和实现TransactionHandler
public interface InvocationHandler {
public void invoke(Object o,Method method);
}
public class TransactionHandler implements InvocationHandler{
private Object target;
public TransactionHandler(Object target) {
this.target = target;
}
@Override
public void invoke(Object o ,Method method) {
System.out.println("事务开启。。。");
try {
method.invoke(target);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println("事务提交。。。");
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
}
target为目标对象
- 代理类
public class BookProxy implements BookService{
private InvocationHandler invocationHandler;
public BookProxy(InvocationHandler invocationHandler) {
this.invocationHandler = invocationHandler;
}
public BookProxy() {
}
@Override
public void buyBook() {
Method m =null;
try {
m = BookService.class.getMethod("buyBook");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
invocationHandler.invoke(this,m);
}
}
- 编写测试类Main
public class Main {
public static void main(String[] args) throws Exception{
BookService bookService = new BookServiceImpl();
InvocationHandler invocationHandler = new TransactionHandler(bookService);
BookService service = new BookProxy(invocationHandler);
service.buyBook();
}
}
结论:其实实现这个功能,我们本来直接BookServiceImpl执行结果是买书,但是我们功能不止于此,所以找到代理对象BookProxy,在BookProxy里面再次调用BookServiceImpl方法就可以实现此功能了。