spring代理对象怎么创建

avatar
作者
猴君
阅读量:1

在Spring中,可以使用两种方式来创建代理对象:

  1. 使用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");     } } 
  1. 使用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的实现类,并在其中实现具体的代理逻辑。然后,通过相应的方式创建代理对象,并将代理对象用于执行相应的方法。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!