在 Spring 中创建代理类,有两种方式:JDK 动态代理和 CGLIB 代理。

  1. JDK 动态代理

JDK 动态代理是使用 Java 的反射机制,在运行时动态地生成代理类。具体步骤如下:

1)定义接口和实现类

定义一个接口和实现类,比如:

public interface UserService {
    void addUser(String name, String password);
}

public class UserServiceImpl implements UserService {
    public void addUser(String name, String password) {
        // 添加用户
    }
}

2)创建代理对象

使用 Spring 的 ProxyFactoryBean 创建代理对象,如下:

<bean id="userService" class="com.xxx.UserServiceImpl"/>

<bean id="userServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target" ref="userService"/>
    <property name="interceptorNames">
        <list>
            <value>myInterceptor</value>
        </list>
    </property>
</bean>

其中,target 属性指定目标对象(即被代理对象),interceptorNames 属性指定拦截器名称。

3)定义拦截器

定义一个拦截器,实现 org.aopalliance.intercept.MethodInterceptor 接口,如下:

public class MyInterceptor implements MethodInterceptor {
    public Object invoke(MethodInvocation invocation) throws Throwable {
        // 前置处理
        Object result = invocation.proceed();
        // 后置处理
        return result;
    }
}

其中,MethodInvocation 对象封装了当前方法的信息,可以通过它来调用目标方法。

  1. CGLIB 代理

CGLIB 代理是通过继承目标类,生成代理类。具体步骤如下:

1)定义实现类

定义一个实现类,比如:

public class UserServiceImpl {
    public void addUser(String name, String password) {
        // 添加用户
    }
}

2)创建代理对象

使用 Spring 的 ProxyFactoryBean 创建代理对象,如下:

<bean id="userService" class="com.xxx.UserServiceImpl"/>

<bean id="userServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target" ref="userService"/>
    <property name="proxyTargetClass" value="true"/>
    <property name="interceptorNames">
        <list>
            <value>myInterceptor</value>
        </list>
    </property>
</bean>

其中,target 属性指定目标对象(即被代理对象),proxyTargetClass 属性设置为 true,表示使用 CGLIB 代理,interceptorNames 属性指定拦截器名称。

3)定义拦截器

定义一个拦截器,实现 org.aopalliance.intercept.MethodInterceptor 接口,如下:

public class MyInterceptor implements MethodInterceptor {
    public Object invoke(MethodInvocation invocation) throws Throwable {
        // 前置处理
        Object result = invocation.proceed();
        // 后置处理
        return result;
    }
}

其中,MethodInvocation 对象封装了当前方法的信息,可以通过它来调用目标方法。

总结:

JDK 动态代理和 CGLIB 代理都可以在 Spring 中创建代理类,选择哪一种方式,取决于被代理对象是否实现了接口。如果实现了接口,则使用 JDK 动态代理;否则,使用 CGLIB 代理。


原文地址: https://www.cveoy.top/t/topic/nCag 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录