现在的位置: 首页 > 综合 > 正文

web基于spring的aop

2013年12月07日 ⁄ 综合 ⁄ 共 3026字 ⁄ 字号 评论关闭


小小的研究了下spring的aop(面向切面编程:Aspect Oriented Programming)

感觉和struts的拦截器很像 只不过aop可以脱离struts,而struts只能在bs项目中应用,也就是说aop可以适用任何java程序

而且功能也比拦截器更加强大 包括了 前置拦截 后置拦截 最终拦截 环绕拦截(这个感觉就是struts的拦截器 或者是servlet的过滤器)

虽然jdk现在也支持代理 但是貌似比较麻烦 所以简单说下spring aop的使用

基本spring提供了2种实现方式 一种是基于注释(annotation)的方式,另一种和ssh的使用差不多 配置xml

首先说下 基于注释的方法 我挺喜欢这的

以来的jar如下aspectjrt.jar aspectjweaver.jar cglib-nodep-2.1_3.jar common-annotations.jar commons-logging.jar spring.jar http://download.csdn.net/source/2658420 (不包括struts等)

首先新建一项目 之后配置一个struts配置一个action 比如name为userAction

之后配置spring的applicationContext.xml 把action交给spring管理

之后在applicationContext.xml 加入<aop:aspectj-autoproxy/>

如果xml验证报错的话请删掉

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "
http://www.springframework.org/dtd/spring-beans.dtd">

并将 <beans> 中改成

就可以了 我也不晓得为什么spring的dtd不支持这个标签

然后新建一个类 比如 Interceptor 关键代码↓

首先需要在class前声明@Aspect

之后可以声明一个切面 用@Pointcut(), execution中的参数:

第一个* 表示要拦截的返回类型 如果只想拦截返回值为string的话 就变成java.lang.String

*表示全部拦截

之后的user为包名 userAction为类名 表示这个切面是专门拦截user包下userAction类的

如果换成user.*的话就是拦截user包下的所有方法

userAction之后的*为要拦截的方法 可以自己根据需要更改 之后的参数".."表示方法的参数类型为任意,如果想改为至拦截参数为

string的话 就变成*(java.lang.String)

ok 切面定义完了之后写一个方法对应这个切面 名字任意 不需要有内容 现在已经spring已经知道了 要拦截那个包下的哪些类下的哪些方法了 下面做的就是完成拦截部分的功能了 ,先声明一个前置拦截@Before("doIntercept()")

其中的参数doIntercept() 必须对应前面切面对应函数的名字 之后在下面定义一个方法就是拦截的具体实现了

这样之后 在访问 userAction的任意方法的时候都回先执行@before方法也就是doIt()中的内容

除了@Before之外还提供了 @AfterReturning(在方法完成前通知) @After(在方法完成后通知) @Around(全方位拦截通知,可以当作拦截器使用)

比如

 @Around("doIntercept()")
 public Object myInteceptor(ProceedingJoinPoint pjp) throws Throwable {
    String result = pjp.proceed();

    if(//用户有权限访问)
        return result;//正常的访问action中的方法 并跳转

    else

        return "error";//直接struts跳转到错误页
 }

就是先了拦截器的基本功能

除此之外以上方法也支持获取拦截方法的参数,根据参数拦截的方法.....也可以在一个类中声明多个切面从而实现多个拦截器的功能 总之比jdk提供的api要好用的多


 

如果用xml的方法实现也很简单在 applicationContext.xml 加入

所有标签和刚才以注释的方法实现的意义是一样的


爽啊 哈哈哈~

抱歉!评论已关闭.