Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1296|回复: 0

(整理)Spring的AOP模块(一)

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2011-6-6 15:57:59 | 显示全部楼层 |阅读模式

    AOP(Aspect Oriented Programming,面向切面编程)Spring框架的另一个重要特征。AOP把一个业务流程分成几部分,例如权限检查,业务处理,日志记录,每个部分单独处理,然后把它们组装成完整的业务流程。每个部分被称为切面(Aspect)或者关注点。
    实例:使用拦截器拦截方法
      AOP有一些重要的概念,包括切面,连接点(Joinpoint),通知(Advice),切入点(Pointcut),引用(Introduction)等。这些概念非常抽象,往往很难理解。
      抛开这些抽象的概念,先来看一个AOP例子。前面的章节中层介绍了一个AOP的例子。下面看一下稍微复杂的例子。本例中,AOP的规则要稍微复杂一些。
    (一)  Service接口
      Spring推荐使用接口编程。该接口定义了两个方法。下面将使用拦截器其中的withAop()方法,而另一个方法withoutAop()将不会被拦截。接口代码如下:
    package com.zhangjie.spring.aop;
    public interface IAopService {
    //定义两个方法
        public void withAop() throws Exception;  //将会被拦截
        public void withoutAop() throws Exception; //不会被拦截
    }
    (二)  Service实现代码
    IaopService实现类中定义了一个name属性,以及对应的gettersetter方法。Name属性值将通过getter,setter方法被Spring容器设置进来。两个接口方法中将输出name属性值。实现类代码如下:
    package com.zhangjie.spring.aop;
    import javax.security.auth.login.AccountException;
    public class AopServiceImpl implements IAopService {  //Service实现
        private String name;   //name属性
        public void withAop() throws Exception { //withAop()方法实现
           System.out.println("AOP的函数运行。name:"+name);
           if(name.trim().length() == 0)   //如果name为空
               throw new AccountException("name属性不能为空");  //则抛出异常
        }
        public void withoutAop() throws Exception {  //withoutAop()方法实现
           System.out.println("没有AOP的函数运行。");
        }
        public String getName() {
           return name;
        }
        public void setName(String name) {
           this.name = name;
        }
    }
    (三)  方法前拦截器检查name是否为null
      下面是一个方法前拦截器,实现自MethodBeforeAdvice接口。方法前拦截器在执行指定方法前被调用,参数分别为被调用的方法,执行时被传入的参数,被拦截的Bean。被拦截的执行方法在applicationContext.xml中配置。拦截器代码如下:
    package com.zhangjie.spring.aop;
    import java.lang.reflect.Method;
    import org.springframework.aop.MethodBeforeAdvice;
    public class MethodBeforeInterceptor implements MethodBeforeAdvice { //方法前拦截器
        //调用对象的方法将执行该方法。参数分别为被调用的方法,被调用方法的参数,对象。
        public void before(Method method, Object[] args, Object instance)
               throws Throwable {
           System.out.println("即将要执行方法:"+method.getName());
           if(instance instanceof AopServiceImpl){  //如果是service
               String name = ((AopServiceImpl)instance).getName();  //获取name
               if(name == null)
                  throw new NullPointerException("name属性不能为null"); //抛出异常
            }
        }
    }
    (四)  返回后拦截器输出返回值
      返回后拦截器,实现自AfterReturningAdvice接口。返回后拦截器在执行完指定方法,并返回之后被调用。如果有返回值,可以取到返回值,否则为null。参数分别为方法返回值,被调用的方法,执行时被传入的参数,被拦截的Bean,代码如下:
    package com.zhangjie.spring.aop;
    import java.lang.reflect.Method;
    import org.springframework.aop.AfterReturningAdvice;
    public class MethodAfterInterceptor implements AfterReturningAdvice{
        public void afterReturning(Object value, Method method, Object[] args, Object instance) throws Throwable {//方法后拦截器
           System.out.println("方法 "+method.getName()+"运行完毕,返回值为:"+value);
        }  
    }
    (五)  异常拦截器捕获异常
      异常抛出拦截器,实现自ThrowsAdvice接口。如果指定的方法中有异常被抛出,则其被调用。与上两个拦截器接口不同,ThrowsAdvice接口没有定义任何方法,因此不需要实现任何方法。但是如果定义了形如
      afterThrowing([Method],[args],[target],subclassOfThrowable)
    的方法,这些方法将会调用。参数分别为:被调用的方法,方法的参数,被拦截的Bean以及抛出的异常类。这里面只有最后一个参数是必须的。Spring之所以这样设计,是为了使开发者可以灵活地定义多个捕捉不同的异常,代码如下:
    package com.zhangjie.spring.aop;
    import java.lang.reflect.Method;
    import javax.security.auth.login.AccountException;
    import org.springframework.aop.ThrowsAdvice;
    public class ThrowsInterceptor implements ThrowsAdvice {  //异常拦截器
        public void afterThrowing(Method method,Object[] args,Object instance,AccountException ex) throws Throwable{ //方法一
           System.out.println("方法"+method.getName()+"抛出了异常:"+ex); //方法及异常
        }
        public void afterThrowing(NullPointerException ex) throws Throwable { //方法二
           System.out.println("抛出了异常:"+ex);
        }
    }

    回复

    使用道具 举报

    该用户从未签到

    发表于 2011-9-27 10:25:23 | 显示全部楼层
    谢谢楼主分享啊啊。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-20 15:52 , Processed in 0.405313 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表