本例是以使用者登陸為例,有一個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> |
其它的都沒怎麼改,就這樣,在頁面上登陸,看後台就能看出來已經先走的攔截器。