设为首页 加入收藏

TOP

Spring中AOP实例详解
2015-12-15 23:09:26 来源: 作者: 【 】 浏览:19
Tags:Spring AOP 实例 详解

Spring中AOP实例详解


需要增强的服务


假如有以下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);
? ? }
}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Objective-C语言中nil、Nil、NULL.. 下一篇Python实战之KNN算法实现

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: