请使用JDK编写一个动态代理的实际应用案例代码。
我们将创建一个动态代理来实现事务管理。我们有一个BankService
接口,它定义了一些操作银行账户的方法,我们希望在执行这些方法前后添加事务的开始和提交。
首先,这是我们的BankService
接口:
public interface BankService {
void withdraw(int accountId, double amount);
void deposit(int accountId, double amount);
// other methods...
}
接着,我们实现这个接口:
public class BankServiceImpl implements BankService {
// Implementation of the methods...
@Override
public void withdraw(int accountId, double amount) {
// implementation...
}
@Override
public void deposit(int accountId, double amount) {
// implementation...
}
}
然后我们创建TransactionInvocationHandler
,在方法调用前后添加事务管理的代码:
public class TransactionInvocationHandler implements InvocationHandler {
private Object target;
public TransactionInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Transaction starts");
Object result = method.invoke(target, args);
System.out.println("Transaction commits");
return result;
}
}
最后,我们使用Proxy
类来创建代理对象:
BankService bankService = new BankServiceImpl();
InvocationHandler handler = new TransactionInvocationHandler(bankService);
BankService proxyService = (BankService) Proxy.newProxyInstance(
BankService.class.getClassLoader(),
new Class<?>[] {BankService.class},
handler
);
现在,当我们调用proxyService
的方法时,会自动在方法调用前后添加事务的开始和提交,例如:
proxyService.withdraw(123, 1000.0);
proxyService.deposit(456, 2000.0);
这样就实现了动态添加事务管理的功能。这是动态代理的一个常见应用场景,可以帮助我们在不修改原有代码的情况下,为方法调用添加额外的行为。