另一种方式使用SPRING的AOP

来源:互联网 发布:股票基本知识书籍 知乎 编辑:程序博客网 时间:2024/05/19 23:16

 这次使用org.springframework.aop.framework.ProxyFactoryBean,进行AOP,测试权限控制,

第一次:在XML里配置如下,去掉注解方式

[code]

<bean id="logAop" class="bbs.domain.interceptor.LogAop" />
 <bean id="boardAction" class="org.springframework.aop.framework.ProxyFactoryBean">
  <property name="proxyTargetClass">
   <value>true</value>
  </property>
  <property name="target">
   <bean class="bbs.web.action.BoardAction" />
  </property>
  <property name="interceptorNames">
   <list>
    <value>logAop</value>
   </list>
  </property>
 </bean>

[code]

 

这个配置三个property分别是,明确使用cglib代理,目标对象是BoardAction 织入logAop,LogAop实现了MethodInterceptor接口,这个接口用来做around advice . 配置好后,测试,和昨天的是一样的结果,无法转入board.实际上,在Spring内部最终的实现都是一样的,无论是使用这种配置ProxyFactoryBean的方式,还是配置<aop/>,或是用注解.

 

通过这种方式,我们看到,在struts.xml中配置的<action name="board_*" class="boardAction" method="{1}">,boardAction是在Spring中使用org.springframework.aop.framework.ProxyFactoryBean创建的,struts2应当是把web中的form的值传给了ProxyFactoryBean,而没有传给BoardAction.这应该就是出错的原因.

 

第二次:也使用同样的方式,但是,是对service进行拦截.BoardAction中注入的是由代理工厂产生的代理对象.

 <bean id="logAop" class="bbs.domain.interceptor.LogAop" />
 <bean id="aopTest" class="org.springframework.aop.framework.ProxyFactoryBean"><!--
  <property name="proxyTargetClass">
   <value>true</value>
  </property>
  --><property name="target">
   <bean class="bbs.domain.service.impl.BoardServiceBean" />
  </property>
  <property name="interceptorNames">
   <list>
    <value>logAop</value>
   </list>
  </property>
 </bean>

 <bean id="boardAction" class="bbs.web.action.BoardAction">
  <property name="boardService" ref="aopTest" />
 </bean>

这个当然能够实现预期的目的,登录后可以添加版块,没登录就不可能添加,但是BoardSevice中的save()方法是没有返回值的,因此无法在程序中判断是否成功添加版块,只能返回success.

 

当然可以为SAVE 添加String类型的返回值,但这样得不偿失,还是用Stuts2的拦截器友

原创粉丝点击