本例是以用户登陆为例,有一个VO、一个Manager、一个DAO、一个Action和一个Form等,像DAO、Manager、VO这些我不想多说,并登陆的业务逻辑也不想多说,我只说我的ApplicationContext.xml和struts-config.xml是如何设置的,下面是ApplicationContext.xml(也就是上例里面的bean.xml,项目中多用的是ApplicationContext.xml)的配置:
<bean name="MyAutoProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <value>/login</value> </property> <property name="interceptorNames"> <list> <value>myPointcutAdvisor2</value> </list> </property> </bean> |
在原文中的:
<bean id="myCheckClass" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value>com.testspring.demo.CheckInterface</value> </property> <property name="target"> <ref local="checkInterface" /> </property> <property name="interceptorNames"> <value>myPointcutAdvisor2</value> </property> </bean> |
是定义了这个虚拟的bean,然后在测试类SpringTestCase2中用ApplicationContext.getBean("myCheckClass");来获得这个bean,然后调用execute方法(这里我把上例中的excute方法改成了execute,因为Action中自动执行的是execute,这样我可以直接用那个myPointcutAdvisor2正则匹配的拦截器应用到Action上,记得把ExcuteClass里的相应方法名也随之修改,SpringTestCase2测试类中的相应调用也改)。
MyAutoProxy这个bean是对login这个Action的自动代理,他是自动运行的,beanNames指定是哪个Action(也可以是普通java类),如果要指定多个Action(或java类),则
<property name="beanNames"> <list> <value>/login</value> <value>/xxx</value> <list> </property> |
这样配置。interceptorNames配置的是拦截器的beanid,同样如果想配多个拦截器,也可以写多个value。
在ApplicationContext.xml中还需要把Action做为bean来配,上面代码中的/login就是在xml中配置的bean,其余的如manager和dao也需要配置:
<bean name="/login" class="com.testspring.action.LoginAction"> <property name="userManager"> <ref bean="userManager" /> </property> </bean>
<bean id="userManager" parent="txProxyTemplate"> <property name="target"> <bean class="com.testspring.manager.impl.UserManagerImpl"> <property name="userDAO"> <ref bean="userDAO" /> </property> </bean> </property> </bean> |
本例是用Hibernate来做持久化层的,这里的txProxyTemplate是事务处理的bean,userDAO也是要配的,其它的代码如下:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="mappingDirectoryLocations"> <list> <value>classpath:/com/testspring/dao/model</value> </list> </property> </bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <bean id="dao" class="com.testspring.dao.hibernate.BaseDaoHibernate"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean>
<bean id="userDAO" class="com.testspring.dao.hibernate.UserDAOHibernate"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean>
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> <property name="transactionAttributes"> <props> <prop key="add*">PROPAGATION_REQUIRED</prop> <prop key="delete*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="query*">PROPAGATION_REQUIRED</prop> <prop key="reduce*">PROPAGATION_REQUIRED</prop> <prop key="set*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> |
这里的事务处理的意思是,如果以add、delete、update、query、reduce和set开头的函数都要进行事务处理。
在struts-config.xml还得配置Action:
<action path="/login" type="org.springframework.web.struts.DelegatingActionProxy" input="index.jsp" validate="true" name="loginForm"> <forward name="success" path="/WEB-INF/pages/success.jsp" /> <forward name="failure" path="/WEB-INF/pages/failed.jsp" /> </action> |
其它的都没怎么改,就这样,在页面上登陆,看后台就能看出来已经先走的拦截器。