---------------------
作者:ACTIM__
来源:优快云
原文:https://blog.youkuaiyun.com/Activity_Time/article/details/87574699
版权声明:本文为博主原创文章,转载请附上博文链接!
//关于配置文件 可以使用java类进行配置,不做赘述 仅展示AOP的实现
// 需要额外引入的模版
<beans xmlns="
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
//代理方式
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
//注解检测的范围
<context:component-scan base-package="com.actim.advice,com.actim.Demo">
</context:component-scan>
<beans/>
/************************************************************************************************/
// 定义一个切点集
@Component
public class PointcutsDemo {
//定义一个切点
@Pointcut("execution(* com.actim.Demo.Annotation.TargetDemo.*(..))") //Pointcut表达式
public void pointcut01(){} //这是Pointcut签名(id)
}
/************************************************************************************************/
// 定义一个Aspect
@Component @Aspect
public class AspectDemo {
// 定义一个环绕通知,引用切点id(com.actim.Demo.Annotation.PointcutsDemo.pointcut01())
@Around("com.actim.Demo.Annotation.PointcutsDemo.pointcut01()")
public Object process(ProceedingJoinPoint point) throws Throwable {
System.out.println("@Around:执行目标方法之前...");
//访问目标方法的参数:
Object[] args = point.getArgs();
if (args != null && args.length > 0 && args[0].getClass() == String.class) {
args[0] = "改变后的参数0";
}
//用改变后的参数执行目标方法
Object returnValue = point.proceed(args);
System.out.println("@Around:执行目标方法之后...");
System.out.println("@Around:被织入的目标对象为:" + point.getTarget());
return "原返回值:" + returnValue + ",这是返回结果的后缀";
}
//定义一个前置通知,直接使用切点表达式
@Before("execution(* com.actim.Demo.Annotation.TargetDemo.*(..))")
public void permissionCheck(JoinPoint point) {
System.out.println("@Before:模拟权限检查...");
System.out.println("@Before:目标方法为:" +
point.getSignature().getDeclaringTypeName() +
"." + point.getSignature().getName());
System.out.println("@Before:参数为:" + Arrays.toString(point.getArgs()));
System.out.println("@Before:被织入的目标对象为:" + point.getTarget());
}
}
/************************************************************************************************/
//一个被切入的目标
@Component
public class TargetDemo {
// 不需要任何额外注解
public String pointcut1(String arg0, String arg) throws Exception{
System.out.println("pointcut1方法体");
return "pointcut1返回值";
}
}