需要增强的服务
假如有以下service,他的功能很简单,打印输入的参数并返回参数。
@Service
public class SimpleService {
public String getName(String name) {
System.out.println("get name is: " + name);
return name;
}
}
定义切面和切点
@Component
@Aspect
public class L
ogAspect {
// 定义切点
@Pointcut("within(com.ydoing.service..*)")
// @Pointcut("execution(* com.ydoing.service.*.*(..))")
public void pointCut() {
}
}
Before增强处理
// 定义Before增强处理
// 在目标方法调用之前执行增强处理
@Before("pointCut()")
public void before(JoinPoint jp) {
// 获取连接点传入参数
// Object args = jp.getArgs();
System.out.println("Before增强处理--execute before target method call");
}
测试输出:
Before增强处理--execute before target method call
get name is: Bob
AfterReturning增强
// 在目标方法调用之后执行增强处理
@AfterReturning(pointcut = "pointCut()", returning = "ret")
public void afterReturning(JoinPoint jp, Object ret) {
System.out.println("AfterReturnin增强处理--execute after target method call, return value is :" + ret);
}
测试输出:
get name is: Bob
AfterReturnin增强处理--execute after target method call, return value is :Bob
Around增强
@Around("pointCut()")
public void around(ProceedingJoinPoint jp) {
System.out.println("Around增强--around start...");
Object[] args = jp.getArgs();
// 修改目标方法传入的参数
args[0] = "around_add_" + args[0];
try {
System.out.println("修改传入参数后执行输出:");
jp.proceed(args);
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Around增强--around end");
}
输出:
Around增强--around start...
修改传入参数后执行输出:
get name is: around_add_Bob
Around增强--around end
After增强
// 无论是否发生异常都会 处理
@After("pointCut()")
public void after() {
System.out.println("After增强--always do no matter what happen");
}
输出:
get name is: Bob
After增强--always do no matter what happen
AfterThrowing增强
@AfterThrowing(pointcut = "pointCut()", throwing = "ex")
public void afterThrowing(JoinPoint jp, Throwable ex) {
System.out.println("error is: " + ex);
}
这里没抛异常,就没有输出了
测试代码如下
@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages = "com.ydoing.service,com.ydoing.aspect")
public class AppConfig {
public static void main(String[] args) {
@SuppressWarnings("resource")
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
SimpleService service = ctx.getBean(SimpleService.class);
service.getName("Bob");
}
}