将Spring AOP应用一例改为对Acton的代理

本例是以用户登陆为例,有一个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>

其它的都没怎么改,就这样,在页面上登陆,看后台就能看出来已经先走的拦截器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值