spring利用动态代理模式模拟火车站售票的过程 要求: 添加火车站代售点 添加飞机场代售点 分别用JDK和CGLIB实现动态代理
时间: 2024-10-17 12:08:41 浏览: 27
JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)
5星 · 资源好评率100%
Spring框架利用动态代理模式可以帮助我们创建代理对象,来模拟火车站或飞机场的不同代售点。在这个场景下,我们可以把代理看作是一个中心调度系统,它负责管理和调度各个售票点的工作。
**火车站代售点和飞机场代售点**
首先,我们需要定义一个基础的售票接口`TicketOffice`:
```java
public interface TicketOffice {
void sellTicket(String destination);
}
```
然后创建两个具体的实现类,比如`TrainStationOffice`和`AirPortOffice`:
```java
@Component
public class TrainStationOffice implements TicketOffice {
@Override
public void sellTicket(String destination) {
System.out.println("火车票已售出,目的地:" + destination);
}
}
@Component
public class AirPortOffice implements TicketOffice {
@Override
public void sellTicket(String destination) {
System.out.println("机票已售出,目的地:" + destination);
}
}
```
**JDK动态代理实现**
使用Java的`InvocationHandler`接口可以实现JDK动态代理:
```java
@Component
@Scope("prototype") // 每次请求都生成一个新的代理实例
public class ProxyFactoryBeanJdk implements InvocationHandler {
private Object target;
// ... setter and constructor
public Object getProxy() {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
new Class[]{TicketOffice.class},
this
);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(target, args);
}
}
```
**CGLIB动态代理实现**
CGLIB库提供了一个更底层的方式来创建代理,通过`Enhancer`类:
```java
@Component
@Scope("prototype")
public class ProxyFactoryBeanCglib implements_ticketsOffice {
private Object target;
// ... setter and constructor
public Object createProxy() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(TicketOffice.class);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy mp) throws Throwable {
System.out.println("代理开始");
Object result = mp.invokeSuper(obj, args); // 调用实际方法
System.out.println("代理结束");
return result;
}
}
```
阅读全文