我用ProxyFactoryBean代理business层,通过strut2 action来执行business对象的方法,business对象IOC到action中。执行发现每次action的方法也被代理了,并且business代理被执行了多次,我并没有对action进行任何代理,不知道什么原因,请高人指点一下!这是action:public class UserAction {

private UserManager userManager;

public UserManager getUserManager() {
return userManager;
} public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}

    public String executeList(){
     ActionContext ctx = ActionContext.getContext();
        /*this.userManager.setUserInfo((UserInfo)ctx.getSession().get("user"));
        this.userManager.setOperatorId("***************123***************");*/
     this.userManager.userList();
    
     return "success";
    }
}
这是business层:public interface UserManager{
public List userList();
public void userAdd();}public class UserManagerImpl implements UserManager{
private String OperatorId;
private UserInfo userInfo; public void setOperatorId(String OperatorId){
this.OperatorId = OperatorId;
}
public String getOperatorId(){
return this.OperatorId;
}
public void setUserInfo(UserInfo userInfo){
this.userInfo = userInfo;
}
public UserInfo getUserInfo(){
return this.userInfo;
}

public List userList(){
//this.OperatorId = "***********123****************";
System.out.println("************userlist************");
return null;
}

public void userAdd(){

}


}这是通知:public class SecurityCheckAdvice implements MethodInterceptor{
    
    public Object invoke(MethodInvocation invocation)throws Throwable{
     //Service business = (Service)invocation.getThis();
     System.out.println("operatorId == ");
     System.out.println("(被调用方法接口类名: " + invocation.getMethod().getDeclaringClass().getName() + ")");
     System.out.println("(被调用方法名:" + invocation.getMethod().getName()+ ")");
    
    
     return invocation.proceed();
    }

}这是配置文件:<bean id="userManagerImpl" class="jn.rbac.sys.user.business.UserManagerImpl" scope="prototype">
     <!-- collaborators and configuration for this bean go here -->
   </bean>
   
   <bean id="userAction" class="jn.rbac.sys.user.action.UserAction" scope="prototype">
     <property name="userManager" ref="userManager"/>
   </bean>
   
    <!-- advisor -->
   <bean id="theSecurityCheckAdvice" class="jn.rbac.security.SecurityCheckAdvice">
   </bean>
    
    <!-- permission around advisor -->
   <bean id="securityCheckAdvice" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <property name="advice">
            <ref local="theSecurityCheckAdvice"/>
        </property>
        <property name="pattern">   
            <value>.*user.*</value>
        </property>
   </bean><bean id="userManager" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
      <value>jn.rbac.sys.user.business.UserManager</value>
    </property>
    <property name="target">
      <ref local="userManagerImpl"/>
    </property>
    <property name="interceptorNames">
      <list>
        <value>securityCheckAdvice</value>
      </list>
    </property>
  </bean>这是输出结果:operatorId == 
(被调用方法接口类名: jn.rbac.sys.user.action.UserAction)
(被调用方法名:executeList)
operatorId == 
(被调用方法接口类名: jn.rbac.sys.user.business.UserManager)
(被调用方法名:userList)
operatorId == 
(被调用方法接口类名: jn.rbac.sys.user.business.UserManager)
(被调用方法名:userList)
operatorId == 
(被调用方法接口类名: jn.rbac.sys.user.business.UserManager)
(被调用方法名:userList)从结果上看aop被执行了4次,第一次代理了action,后面三次代理了business层对象,我认为正确的结果应该是只输出一次,只代理userManager接口。请高手指点!!!

解决方案 »

  1.   

    这个挺明显的。<!-- permission around advisor -->
      <bean id="securityCheckAdvice" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
      <property name="advice">
      <ref local="theSecurityCheckAdvice"/>
      </property>
      <property name="pattern">  
      <value>.*user.*</value>
      </property>
      </bean>
      

  2.   

    关于action被代理的情况,我发现是正则表达式写的有问题,把action的方法也包括进去了,struts的action代理可能自动引用了我定义的通知。改掉正则之后第一个AOP执行就去掉了。另外后面那三次是什么原因,怎么会重复执行的?请高人指点!!!
      

  3.   

    应该是这个调用了三次/*this.userManager.setUserInfo((UserInfo)ctx.getSession().get("user"));
      this.userManager.setOperatorId("***************123***************");*/
      this.userManager.userList();
      

  4.   

    我当然知道是注释了,只是怀疑你那 log会不会在 注释之前执行的(怀疑你注释之后没有重新编译, 如果这样你在浪费大家时间)。
    说真的这个解决办法很简单。你自己 debug下 或 打下当前调用栈, 结果马上就出来了。如果找到原因之后请告诉下大家、
      

  5.   

    已经两年不来csdn, 突然上来下,现在赚点分都这么难~。  楼主,赶紧给下分~。