工厂模式和代理模式在项目上的实现
@Slf4j
@Component("carServiceProxy")
public class CarServiceProxyFactoryBean implements FactoryBean<UnifyCarService> {
@Autowired
private List<UnifyCarService> unifyCarServiceList;
@Autowired
private GrayService grayService;
@Override
public UnifyCarService getObject() throws Exception {
Enhancer en = new Enhancer();
en.setSuperclass(UnifyCarService.class);
en.setCallback(new CarServiceProxyImpl(unifyCarServiceList, grayService));
return (UnifyCarService) en.create();
}
@Override
public Class<?> getObjectType() {
return UnifyCarService.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
CarServiceProxyFactoryBean 类实现了 Spring 的 FactoryBean 接口,这是一种工厂模式的体现。工厂模式是一种创建型设计模式,用于创建对象,特别是需要进行一些额外初始化或依赖注入时非常实用。这里通过工厂模式创建 UnifyVehicleService 的一个代理对象.
@Slf4j
public class CarServiceProxyImpl implements MethodInterceptor {
private List<UnifyCarService> unifyCarServiceList;
private GrayService grayService;
public CarServiceProxyImpl (List<UnifyCarService> unifyCarServiceList, GrayService grayService) {
this.unifyCarServiceList= unifyCarServiceList;
this.grayService= grayService;
}
/**
* 按照灰度选择对应试驾车的实现
*
* @param objects 外部调用参数
*/
public UnifyCarService chooseCarService(Object[] objects) {
if (CollectionUtils.isEmpty(unifyCarServiceList)) {
return null;
return CollectionUtils.isNotEmpty(services) ? services.get(0) : null;
}
/**
* 代理方法
*
* @param o 代理对象
* @param method 代理方法
* @param objects 代理方法参数
* @param methodProxy 代理方法
* @return 代理方法返回值
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
UnifyCarService carcService = this.chooseCarService(objects);
return method.invoke(carcService , objects);
}
}
VehicleServiceProxyImpl 类实现了 MethodInterceptor 接口,表明它是一个代理实现。代理模式是一种结构型设计模式,在这个模式中,一个类代表另一个类的功能。这里的 CarServiceProxyImpl 是一个方法拦截器,它用于选择合适的 UnifyCarService 实现,并代理其方法调用。
上述代码中,通过CGLIB的Enhancer来指定要代理的目标对象、实际处理代理逻辑的对象。
最终通过调用create()方法得到代理对象,对这个对象所有非final方法的调用都会转发给MethodInterceptor.intercept()方法。
在intercept()方法里我们可以加入任何逻辑,同JDK代理中的invoke()方法
通过调用MethodProxy.invokeSuper()方法,我们将调用转发给原始对象,具体到本例,就是UnifyCarService的具体方法。CGLIG中MethodInterceptor的作用跟JDK代理中的InvocationHandler很类似,都是方法调用的中转站。