spring AOP进行自动拦截,常用的比如事务处理。代码如下
<bean id="BeanProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <!-- 对类名以Dao结尾的类进行代理 --> <value>*Dao</value> </property> <!-- 对代理类进行加载拦截器(实现通知的过程) --> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean>
再比如eHcache缓存AOP拦截:
<!-- Bean自动代理处理器配置 --> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <!-- 配置需要进行日志记录的Service和Dao <value>*Dao</value> --> <!-- 配置所有Service结尾命名的Bean,即所有Service层的类都要 经过exceptionHandler异常处理类 --> <value>*Dao</value> <!-- Service层的Bean ID 命名要以Service 结尾 --> </list> </property> <property name="interceptorNames"> <list> <value>methodCachePointCut</value> <value>methodCacheDestory</value> </list> </property> </bean>
这两个例子其实是一样的,第一个属性beanNames是对需要的地方进行配置,第二个属性interceptorNames是拦截器的名称,比如说transactionInterceptor的配置如下:
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="transactionManager"></property> <property name="transactionAttributes"> <props> <!-- PROPAGATION_SUPPORTS: 如果已经存在事务,则加入事务;如果没有事务,则以非事务的方式执行; PROPAGATION_MANDATORY: 使用当前事务, 如果没有, 则抛出异常; PROPAGATION_REQUIRED: 新建事务,如果当前有事务, 则挂起; P ROPAGATION_NOT_SUPPORTED:以非事务的方式执行, 如果当前有事务, 则挂起; PROPAGATION_NEVER:以非事务的方式执行, 如果当前有事务,则抛出异常; +/-Exception</prop> + 表示异常出现时事物提交 - 表示异常出现时事务回滚 --> <prop key="find*">PROPAGATION_SUPPORTS,readOnly</prop> <prop key="del*"> PROPAGATION_SUPPORTS</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="save*">PROPAGATION_REQUIRED,-Exception</prop> </props> </property> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
很好理解的。