完整的springmvc中动态代理的代码
时间: 2024-04-12 17:31:27 浏览: 158
在Spring MVC中使用动态代理可以实现对方法的增强、事务管理等功能。下面是一个使用动态代理的示例代码:
1. 创建一个接口 `UserService.java`:
```java
public interface UserService {
void addUser(User user);
User getUserById(int userId);
}
```
2. 创建接口的实现类 `UserServiceImpl.java`:
```java
public class UserServiceImpl implements UserService {
@Override
public void addUser(User user) {
// 添加用户的逻辑
System.out.println("Adding user: " + user.getName());
}
@Override
public User getUserById(int userId) {
// 获取用户的逻辑
return new User(userId, "John Doe");
}
}
```
3. 创建动态代理类 `ProxyHandler.java`:
```java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyHandler implements InvocationHandler {
private Object target;
public ProxyHandler(Object target) {
this.target = target;
}
public <T> T getProxy() {
return (T) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this
);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在方法调用前进行处理(例如:事务管理)
System.out.println("Before invoking method: " + method.getName());
Object result = method.invoke(target, args);
// 在方法调用后进行处理(例如:日志记录)
System.out.println("After invoking method: " + method.getName());
return result;
}
}
```
4. 在配置文件中配置动态代理的bean `springmvc-servlet.xml`:
```xml
<bean id="userService" class="com.example.UserServiceImpl"/>
<bean id="userServiceProxy" class="com.example.ProxyHandler">
<constructor-arg ref="userService"/>
</bean>
```
5. 使用动态代理的bean:
```java
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("springmvc-servlet.xml");
UserService userServiceProxy = context.getBean("userServiceProxy", UserService.class);
// 使用动态代理对象调用方法
userServiceProxy.addUser(new User(1, "Alice"));
User user = userServiceProxy.getUserById(1);
System.out.println("User: " + user.getName());
}
}
```
在以上示例中,我们创建了一个接口 `UserService` 和其实现类 `UserServiceImpl`。然后,我们创建了一个动态代理类 `ProxyHandler`,该类实现了 `InvocationHandler` 接口,并通过 `Proxy.newProxyInstance()` 方法创建代理对象。在代理对象的 `invoke()` 方法中,我们可以在方法调用前后进行一些处理。最后,在配置文件中将原始的服务类 `UserServiceImpl` 和动态代理类 `ProxyHandler` 配置为 Spring 的 bean。
在使用动态代理的bean时,我们可以像调用普通的bean一样使用它。在调用方法时,动态代理会自动执行 `invoke()` 方法中定义的处理逻辑,例如事务管理、日志记录等。
请注意,在使用动态代理时,被代理的类必须实现接口。如果被代理的类没有实现接口,可以考虑使用其他的代理方式,如CGLIB代理。
阅读全文