Spring 中代理类的创建方法:JDK 动态代理和 CGLIB 代理
在 Spring 中创建代理类,有两种方式:JDK 动态代理和 CGLIB 代理。
- 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 对象封装了当前方法的信息,可以通过它来调用目标方法。
- 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 著作权归作者所有。请勿转载和采集!