请使用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);

这样就实现了动态添加事务管理的功能。这是动态代理的一个常见应用场景,可以帮助我们在不修改原有代码的情况下,为方法调用添加额外的行为。

发表评论

后才能评论