首页 > 代码库 > SPring+Structs2实现的项目中进行Spring AOP时的相关小记

SPring+Structs2实现的项目中进行Spring AOP时的相关小记



SPring+Structs2实现的项目中进行Spring AOP时的相关小记

1.一般为了方便开发Structs2的项目中的action都会建立一个BaseAction如果继承了BaseAction中的子类进行AOP时,只能指定AOP中的PointCut为BaseAction
如果对应的BaseAction如果继承于ActionSupport的话,就只能定义AOP中的PointCut为ActionSupport了
因为Spring生成的代理类中,对同名的方法,只有一个,即子类重写父类的方法,只有一个,所以如果找不到代理类直接实现的接口,就会找它的最顶级超类中去找。

2. 如果是用注解方式,原理同样,因为不好更改ActionSupport中对应的类增加对应的注解,所以只好不能继承ActionSupport了.

3. 对于非单例模式(none singleton)的类进行AOP时,需要开启proxy-target-class=”true”,使用Cglib进行aop代理处理,
 如果是业务类,一般都是接口,可以不加,对于action类中,要加上
 如下所示为用于注解方式的
  <aop:aspectj-autoproxy  proxy-target-class="true" />
  如下所示为用于xml配置方式的
  <aop:config proxy-target-class="true">
  对于采用aop拦截器方式的增加一个元素
 <bean name="xxaspet"  class="com.xx.aop.LogAspect"/>
 <bean name="loggingAutoProxy"
 class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">      
 <property name="proxyTargetClass" value=http://www.mamicode.com/"true"/>
 <property name="beanNames"><value>.*</value></property>
 <property name="interceptorNames">
  <list>
   <value>xxaspet</value>
  </list>
 </property>
 </bean>

4. 对于Structs中,一般需要增加<constant name="struts.objectFactory.spring.autoWire.alwaysRespect" value=http://www.mamicode.com/"true" />,
 以便Structs2中优先使用Spring的装配类,就是Spring来负责类的加载,初始化。


5.相关PointCut说明: execution 用于匹配方法执行的连接点;
within 用于匹配指定类型内的方法执行;
this 用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也进行类型匹配;
target用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也进行类型匹配;
args用于匹配当前执行的方法传入的参数为指定类型的执行方法;
@within 用于匹配所以持有指定注解类型内的方法;
@target 用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解;
@args 用于匹配当前执行的方法传入的参数持有指定 注解的执行;
@annotation 用于匹配当前执行方法持有指定注解的方法;
bean: Spring AOP扩展的,AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法;
reference pointcut :表示引用其他命名切入点,只有@ApectJ风格支持,Schema风格不支持。

一般指PointCut可以用within指定对应包及子包的类中所有的公共方法
可以用execution指定对应包及子包的类中对应的公共方法
可以用@annotation指定对应包及子包的类中对应的具有对应注解的方法

相关地方可能存在理解错误,希望看到的朋友进行指正
 

SPring+Structs2实现的项目中进行Spring AOP时的相关小记