1.前言:
AOP传统方式的xml配置虽然配置比较繁琐,但对于理解spring背后机制还是有非常大的帮助的。
传统方式的配置也有2种方式:一、自定义代理;二、自动代理(这个是基于传统的配置方式,并非aop标签),然后我们在进行事务配置的时候,就是通过传统自动代理的方式的。暂时没有发现用aop标签配置事务的。
2.项目实例代码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<!-- dbcp数据库连接池配置 -->
<bean id="dataSourceDBCP" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"></property>
<property name="username" value="root"></property>
<property name="password" value="yuanwang"></property>
<property name="maxIdle" value="10" />
<property name="maxActive" value="100" />
<property name="maxWait" value="10000" />
<property name="validationQuery" value="select 1" />
<property name="testOnBorrow" value="false" />
<property name="testWhileIdle" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="1200000" />
<property name="minEvictableIdleTimeMillis" value="1800000" />
<property name="numTestsPerEvictionRun" value="5" />
<property name="defaultAutoCommit" value="true" />
</bean>
<!-- 声明事务 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceDBCP"></property>
</bean>
<!-- 使用拦截器的方式来进行事务控制,个人觉得这个方法挺好,可以结合aop一起使用 -->
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="list*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- 自动代理,对beanname为DaoImpl后缀的都绑定事务拦截器 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*ServiceImpl</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
</beans>
其实罗列一下这些配置的主要功能:
1.adivce指定(插入代码-异常,事务或是之前之后)
2.pointcut切入点(指定类的某些方法)
3.传统使用:
Advice实现:1.AfterReturningAdvice:后接口
2.MethodBeforeAdvice:前接口
3.MethodInterceptor 前后接口
4.ThrowsAdvice 异常接口
配置代理类:
自定义代理类:ProxyFactoryBean
自动代理类:BeanNameAutoProxyCreator,DefaultAdvisorAutoProxyCreator
用于指定代码切入点具体位置(符合命名的方法或则表达式)
NameMatchMethodPointcutAdvisor,RegExpMethodPointcutAdvisor
4.基于aop标签配置
Adivce实现:自定义类
1.非异常:自定义方法,参数JoinPoint可选
2.异常:JoinPoint jp,Throwable ta参数列表
配置代理类:
无,都是基于配置标签