「springのダイナミックプロキシをどのように実現するか」。
Springのダイナミックプロキシは、JDKのProxyクラスを使用して実装されます。Proxyクラスは、動的プロキシオブジェクトを作成するためのユーティリティクラスであり、指定されたインターフェース配列とInvocationHandlerインターフェースを使用してプロキシクラスのインスタンスを生成します。
Springのダイナミックプロキシの実装手順は次の通りです:
- InvocationHandlerインターフェースの実装クラスを定義し、そのクラスはinvokeメソッドを実装します。このメソッドはプロキシオブジェクトのメソッドが実行される際の処理を担当します。
- ProxyクラスのnewProxyInstanceメソッドを使用し、ClassLoader、インタフェースの配列、およびInvocationHandlerの実装クラスオブジェクトを渡すことで、プロキシオブジェクトを生成できます。
- 使用プロキシオブジェクトを介してメソッドを呼び出すと、まずInvocationHandlerのinvokeメソッドが処理されます。
以下はサンプルコードです:
public interface UserService {
void addUser(String name);
void deleteUser(String name);
}
public class UserServiceImpl implements UserService {
public void addUser(String name) {
System.out.println("Add user: " + name);
}
public void deleteUser(String name) {
System.out.println("Delete user: " + name);
}
}
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before invoking method: " + method.getName());
Object result = method.invoke(target, args);
System.out.println("After invoking method: " + method.getName());
return result;
}
}
public class Main {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
MyInvocationHandler handler = new MyInvocationHandler(userService);
UserService proxy = (UserService) Proxy.newProxyInstance(
userService.getClass().getClassLoader(),
userService.getClass().getInterfaces(),
handler);
proxy.addUser("Alice");
proxy.deleteUser("Bob");
}
}
結果出力:
Before invoking method: addUser
Add user: Alice
After invoking method: addUser
Before invoking method: deleteUser
Delete user: Bob
After invoking method: deleteUser
以上のコードでは、UserServiceインターフェースとその実装クラスUserServiceImplが定義され、MyInvocationHandlerがInvocationHandlerの実装クラスとして使用されて、プロキシオブジェクトのメソッド呼び出しを処理するために使用されています。mainメソッドでは、Proxy.newProxyInstanceメソッドを使用してプロキシオブジェクトproxyを生成し、プロキシオブジェクトを使用してメソッドを呼び出すと、まずMyInvocationHandlerのinvokeメソッドが処理されます。