
top.gotoeasy.framework.spring.aop.enhance.generate.Src92EnhanceSuperClassCreater Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of gotoeasy-aop Show documentation
Show all versions of gotoeasy-aop Show documentation
基于JavaCompiler的继承方式AOP实现,在性能优良的基础上,提供更多的简易性,2.x.x版本集成使用Spring容器
The newest version!
package top.gotoeasy.framework.spring.aop.enhance.generate;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.extern.slf4j.Slf4j;
import top.gotoeasy.framework.spring.aop.args.AopContext;
import top.gotoeasy.framework.spring.aop.args.Enhance;
import top.gotoeasy.framework.spring.aop.args.SuperInvoker;
import top.gotoeasy.framework.spring.aop.util.AopUtil;
/**
* 增强中间类代码生成类
*
* @since 2018/01
* @author 青松
*/
@Slf4j
public class Src92EnhanceSuperClassCreater {
private static final String TAB1 = " ";
private DataBuilderVars dataBuilderVars;
private Src00ConstructorCreater src00ConstructorCreater;
private Src21AroundMethodCreater src21AroundMethodCreater;
/**
* 构造方法
*
* @param dataBuilderVars 公用变量
*/
public Src92EnhanceSuperClassCreater(DataBuilderVars dataBuilderVars) {
this.dataBuilderVars = dataBuilderVars;
this.src00ConstructorCreater = new Src00ConstructorCreater(dataBuilderVars);
this.src21AroundMethodCreater = new Src21AroundMethodCreater(dataBuilderVars);
}
/**
* 创建环绕拦截中间类源码
*
* @param max 中间类最大数
* @param seq 中间类序号
* @return 环绕拦截中间类源码
*/
public String createAroundMiddleClassCode(int max, int seq) {
StringBuilder sbMethodField = new StringBuilder();
StringBuilder sbSuperInvokerField = new StringBuilder();
StringBuilder sbAopField = new StringBuilder();
if (seq == 0) {
// protected Method varMethod
dataBuilderVars.methodFieldMap.keySet().forEach(method -> sbMethodField.append(TAB1)
.append("protected Method ").append(dataBuilderVars.methodFieldMap.get(method)).append(";\n"));
// protected SuperInvoker varSuperInvoker
dataBuilderVars.superInvokerFieldMap.keySet()
.forEach(method -> sbSuperInvokerField.append(TAB1).append("protected SuperInvoker ")
.append(dataBuilderVars.superInvokerFieldMap.get(method)).append(";\n"));
// public {aopClass} varAopObj
dataBuilderVars.aopClassFieldMap.keySet()
.forEach(aopClass -> sbAopField.append(TAB1).append("@Autowired\n").append(TAB1).append("public")
.append(" ").append(aopClass.getName()).append(" ")
.append(dataBuilderVars.aopClassFieldMap.get(aopClass)).append(";\n"));
}
// AroundMethod
StringBuilder sbAroundMethod = src21AroundMethodCreater.getAroundMethodSrc(seq);
// SuperInvoker
StringBuilder sbSuperInvoker = src21AroundMethodCreater.getSuperInvokerInitSrc(seq);
// Class
StringBuilder sbClass = new StringBuilder();
// -------------------------------------------------------------------------
// package ....
//
// import ....
// import ....
//
// public class superClass$$gotoeasy$$AroundBase extends superClass implements
// Enhance ...
//
// methodField...
// superInvokerField...
// aopObjField...
//
// method...
// -------------------------------------------------------------------------
sbClass.append("package ").append(dataBuilderVars.targetClass.getPackage().getName()).append(";\n");
sbClass.append("\n");
sbClass.append("import java.lang.reflect.Method;").append("\n");
sbClass.append("import " + AopUtil.class.getName() + ";").append("\n");
sbClass.append("import " + Enhance.class.getName() + ";").append("\n");
sbClass.append("import " + SuperInvoker.class.getName() + ";").append("\n");
sbClass.append("import " + AopContext.class.getName() + ";").append("\n");
sbClass.append("import " + Autowired.class.getName() + ";").append("\n");
sbClass.append("\n");
if (seq == 0) {
sbClass.append("public class ")
.append(AopUtil.getAroundMiddleClassSimpleName(dataBuilderVars.targetClass, max, seq))
.append(" extends ").append(dataBuilderVars.targetClass.getSimpleName())
.append(" implements Enhance {").append("\n");
} else {
sbClass.append("public class ")
.append(AopUtil.getAroundMiddleClassSimpleName(dataBuilderVars.targetClass, max, seq))
.append(" extends ")
.append(AopUtil.getAroundMiddleClassSimpleName(dataBuilderVars.targetClass, max, seq - 1))
.append(" {").append("\n");
}
sbClass.append("\n");
sbClass.append(sbMethodField);
sbClass.append(sbSuperInvokerField);
sbClass.append(sbAopField);
sbClass.append("\n");
sbClass.append(src00ConstructorCreater.getConstructorSrc(max, seq, sbSuperInvoker));
sbClass.append("\n");
sbClass.append(sbAroundMethod);
sbClass.append("}").append("\n");
String srcCode = sbClass.toString();
log.trace("\n{}", srcCode);
return srcCode;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy