java - 是否为每个类实例创建 Cglib 方法拦截器?
问题描述
我有以下通用 cglib 方法拦截器实现:
public class EntityInterceptor<T, PK> implements MethodInterceptor{
private EntityChangeType changeType;
private T entity;
private GenericCrudMapper<T,PK> mapper;
public EntityInterceptor(T entity, GenericCrudMapper<T, PK> mapper){
this.entity = entity;
this.mapper = mapper;
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
// pass through
return proxy.invoke(entity, args);
}
public void setEntityChangeType(EntityChangeType changeType){
this.changeType = changeType;
}
public void saveChanges(){
// @todo
}
}
使用如下:
@Override
public Airport get(String id) {
Airport airport = airportMapper.findById(id);
if(airport != null){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Airport.class);
enhancer.setCallback(new EntityInterceptor<>(airport, airportMapper));
airport = (Airport) enhancer.create();
return airport;
}
return airport;
}
我可以安全地假设上面创建的方法拦截器将被每个增强的类实例实例化(换句话说,在分配方法拦截器时,它们不会在所有类实例之间共享)?
解决方案
是的,您可以确定这一点。但是,您的解决方案效率很低,因为每个实例都会生成一个新类。相反,您应该根据拦截器类型创建代理:
// Do once
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(realObject.getClass());
enhancer.setCallbackType(Airport.class);
Class classForProxy = enhancer.createClass();
// Do for each instance
Enhancer.registerCallbacks(classForProxy, new Callback[]{new EntityInterceptor<>(airport, airportMapper});
Object createdProxy = classForProxy.newInstance();
这样您就可以为所有代理实例重用一个类。
推荐阅读
- c# - 测试中的 C# 作业我无法理解
- c++ - 在 Xcode 的子目录中包含类文件 c++
- string - Powershell得到没有第二个名字的名字
- docker-swarm - Docker Swarm 是否有可用的 IPVS(IP 故障转移)?
- angular - 使用 Docker 构建 Angular 失败:nginx.conf - 没有这样的文件
- android - Flutter:无法使用 GradleScopeCompileServices.createGeneralCompileCaches() 创建 DefaultGeneralCompileCaches 类型的服务
- networking - 如何获取其他局域网的arp表信息,包括MAC地址?
- npm - 错误 这可能不是 npm 的问题。上面可能有额外的日志输出
- if-statement - AppleScript 中的有限 IF 语句?
- python - 从数组列表中查找唯一代表(元素)的列表