我用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接口。请高手指点!!!
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接口。请高手指点!!!
<bean id="securityCheckAdvice" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref local="theSecurityCheckAdvice"/>
</property>
<property name="pattern">
<value>.*user.*</value>
</property>
</bean>
this.userManager.setOperatorId("***************123***************");*/
this.userManager.userList();
说真的这个解决办法很简单。你自己 debug下 或 打下当前调用栈, 结果马上就出来了。如果找到原因之后请告诉下大家、