Springプロキシオブジェクトの作成方法
Springでは、2通りの方法で、プロキシオブジェクトを作成できる
- JDKの動的プロキシを用いた方法。JDK動的プロキシでは、インターフェースを介してプロキシを作成します。まず、インターフェースを定義し、そのインターフェースを実装する実装クラスを作成して、具体的なビジネスロジックを実装します。次に、InvocationHandlerインターフェースの実装を作成します。このクラスでinvokeメソッドを実装し、プロキシオブジェクトのメソッドが呼び出されたときに処理を行います。最後に、Proxyクラスの静的メソッドであるnewProxyInstanceを使用して、プロキシオブジェクトを作成します。
public interface UserService {
void addUser(String name);
}
public class UserServiceImpl implements UserService {
@Override
public void addUser(String name) {
System.out.println("Add user: " + name);
}
}
public class UserServiceInvocationHandler implements InvocationHandler {
private Object target;
public UserServiceInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method: " + method.getName());
Object result = method.invoke(target, args);
System.out.println("After method: " + method.getName());
return result;
}
}
public class Main {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
UserServiceInvocationHandler handler = new UserServiceInvocationHandler(userService);
UserService proxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(),
userService.getClass().getInterfaces(), handler);
proxy.addUser("John");
}
}
- CGLIBによる動的プロキシ:CGLIB動的プロキシは継承を利用してプロキシを実現する方法です。まず、クラスを定義し、次にこのクラスを継承するサブクラスを作成し、さらに親クラスのメソッドを上書きして具体的なビジネスロジックを実装します。次に、MethodInterceptorインターフェイスの実装クラスを作成し、ここでinterceptメソッドを実装し、プロキシオブジェクトのメソッドが呼び出されたときに処理を行うようにします。最後に、Enhancerクラスのcreateメソッドを使用して、プロキシオブジェクトを作成します。
public class UserService {
public void addUser(String name) {
System.out.println("Add user: " + name);
}
}
public class UserServiceInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("Before method: " + method.getName());
Object result = proxy.invokeSuper(obj, args);
System.out.println("After method: " + method.getName());
return result;
}
}
public class Main {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserService.class);
enhancer.setCallback(new UserServiceInterceptor());
UserService proxy = (UserService) enhancer.create();
proxy.addUser("John");
}
}
JDK動的プロキシ、CGLIB動的プロキシを問わず、InvocationHandlerまたはMethodInterceptorの実装クラスを作成して、具体的なプロキシロジックを実装する必要があります。次に、適切な方法で代理オブジェクトを作成して、対応するメソッドを実行するために代理オブジェクトを使用します。