需求理解:当我们在对某个方法进行重写的时候,我们不想修改源代码,希望通过读取配置文件,获取标识符,判断是否需要重写,在不修改源代码的基础上实现动态的修改了方法。
在这里我们用到了SpringAOP的Aspect注解,通过添加@Around注解实现拦截指定切点的方法。
下面代码举例:
@Aspect
@Component
public class AroundAop {
//创建标识符
private static String flag;
//在静态代码块中获取配置文件中的标识符值
static {
//封装的通过ResourceLoader实现的读取指定路径下配置文件的工具类
PropertiesLoader propertiesLoader = new PropertiesLoader("classpath:config.properties");
flag = propertiesLoader.getProperty("httpsflag");
}
//指定切点位置
@Around("execution(* getSum(String,String))")
public String aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("从配置文件中获取的标志符为: "+flag);
//获取当前方法的参数
Object[] args = joinPoint.getArgs();
//修改当前方法的参数
args[0] = "在环绕方法中拦截当前方法,并修改的参数一";
args[1] = " success";
//更改参数后执行方法
/*String result = (String) joinPoint.proceed(args);*/
//如果不想执行切点方法就将上面的proceed注释,执行你需要执行的代码
String result = "这是我自定义的方法执行体";
System.out.println("自定义的方法内容: "+result);
return null;
}
}
我们需要理清的思路是:
我们需要拦截切点的方法,然后无论是重写还是修改参数都可以随意操作。
需要做的点:
1、引入约束
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
2、编写AOP类,在里面指定切点与重写的方法
注意:1、这里只能使用@Around注解
2、在方法中的参数为:ProceedingJoinPoint
3、如果需要重写 就调用proceed的方法,否者直接进行替换