spring中动态代理的使用
时间: 2023-06-16 22:02:46 浏览: 67
在Spring中,动态代理主要用于AOP(面向切面编程)的实现。AOP可以让我们在不改变原有代码的情况下,通过代理机制来增强方法的功能,比如日志记录、性能统计、事务处理等。Spring中的动态代理主要使用了JDK的动态代理和CGLIB动态代理两种技术。
1. JDK动态代理
JDK动态代理是通过反射和接口实现的代理,它只能代理实现了接口的类。在Spring中,我们可以使用JDK动态代理来代理Service层的接口,从而实现AOP的功能。
首先定义一个接口:
```
public interface UserService {
void addUser(User user);
void deleteUser(int id);
User getUser(int id);
}
```
然后定义一个切面类:
```
public class LogAspect {
public void before() {
System.out.println("方法执行前...");
}
public void after() {
System.out.println("方法执行后...");
}
}
```
接下来使用JDK动态代理来代理UserService:
```
public class UserServiceProxy implements InvocationHandler {
private UserService target;
private LogAspect logAspect;
public UserServiceProxy(UserService target, LogAspect logAspect) {
this.target = target;
this.logAspect = logAspect;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
logAspect.before();
Object result = method.invoke(target, args);
logAspect.after();
return result;
}
}
```
最后,在Spring配置文件中配置UserService的代理:
```
<bean id="userServiceProxy" class="com.example.UserServiceProxy">
<property name="target" ref="userService"/>
<property name="logAspect" ref="logAspect"/>
</bean>
<bean id="userService" class="com.example.UserServiceImpl"/>
<bean id="logAspect" class="com.example.LogAspect"/>
```
2. CGLIB动态代理
CGLIB动态代理是通过继承实现的代理,它可以代理没有接口的类。在Spring中,我们可以使用CGLIB动态代理来代理Dao层的实现类,从而实现AOP的功能。
首先定义一个实现类:
```
public class UserDaoImpl {
public void addUser(User user) {
System.out.println("添加用户...");
}
public void deleteUser(int id) {
System.out.println("删除用户...");
}
public User getUser(int id) {
System.out.println("获取用户...");
return new User();
}
}
```
然后定义一个切面类:
```
public class LogAspect {
public void before() {
System.out.println("方法执行前...");
}
public void after() {
System.out.println("方法执行后...");
}
}
```
接下来使用CGLIB动态代理来代理UserDaoImpl:
```
public class UserDaoImplProxy implements MethodInterceptor {
private UserDaoImpl target;
private LogAspect logAspect;
public UserDaoImplProxy(UserDaoImpl target, LogAspect logAspect) {
this.target = target;
this.logAspect = logAspect;
}
public UserDaoImpl getProxy() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserDaoImpl.class);
enhancer.setCallback(this);
return (UserDaoImpl) enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
logAspect.before();
Object result = method.invoke(target, args);
logAspect.after();
return result;
}
}
```
最后,在Spring配置文件中配置UserDaoImpl的代理:
```
<bean id="userDaoImplProxy" class="com.example.UserDaoImplProxy">
<property name="target" ref="userDaoImpl"/>
<property name="logAspect" ref="logAspect"/>
</bean>
<bean id="userDaoImpl" class="com.example.UserDaoImpl"/>
<bean id="logAspect" class="com.example.LogAspect"/>
```
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)