AOP专题
Spring的AOP实现之三
Advisor
- 一个Advisor 是一个切面Aspect。
- Advisor综合了一个advice和一个pointcut。
- org.springframework.aop.support.DefaultPointcutAdvisor 是经常使用的Advisor。
- 在同样AOP proxy中混合使用advisor和advice, 能够使用interception around advice, throws advice 和before advice在同样的proxy配置中: Spring会自动创建必需的 interceptor chain.
使用ProxyFactoryBean 实现AOP:
<bean id="personTarget" class="com.mycompany.PersonImpl">
<property name="name"><value>Tony</value>
</property>
<property name="age"><value>51</value></property>
</bean>
<bean id="myAdvisor" class="com.mycompany.MyAdvisor"> <property name="someProperty"><value>Custom string property value</value></property>
</bean>
<bean id="debugInterceptor" class="org.springframework.aop.interceptor.DebugInterceptor"> </bean>
代码调用:
Person person = (Person) factory.getBean("person");
person.xxx();
对象池Spring AOP实现
singleton="false“>
<bean id=“poolTargetSource“ //对象池设置
class=“spring.CommonsPoolTargetSource">
<property name="targetBeanName"> <value>petshopServiceTarget</value> </property>
<property name="maxSize"> <value>25</value>
</property>
</bean>
对象池Spring Ioc实现
<bean id="businessObject“ class=“org.springframework.aop.framework.ProxyFactoryBean ">
<property name="targetSource"> <ref local="poolTargetSource"/> </property>
<property name="interceptorNames"> <list>
<ref local="emailAdvisor"/>
</list>
</property>
</bean>
客户端调用PetshopServiceTarget,只要调用getBean(“businessObject”)即可。
Email拦截器
<bean id="emailAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <constructor-arg>
<ref local="emailAdvice"/>
</constructor-arg>
<property name="pattern">
<value>.*insertOrder.*</value>
</property>
</bean>
AOP事务
- 提供了在基于不同事务API(JTA、JDBC、Hibernate、IBATIS或JDO)一致的编程模式。
- 提供比其他事务API更简单、容易使用的事务编程管理。
- 整合了Spring的数据抽象层。
事务架构:
事务策略定义:
- Transaction isolation 事务隔离程度
- Transaction propagation 类似CMT ,在已经存在的事务中运行,中断事务,创建新事务。
- Transaction timeout
- Read-only status 只读,用于Hibernate
事务配置:
1.定义JDBC的datasource:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>${jdbc.driverClassName}</value>
</property>
<property name="url"><value>${jdbc.url}</value></property>
<property name="username">
<value>${jdbc.username}</value>
</property>
<property name="password"><value>${jdbc.password}</value>
</property>
</bean>
2.定义PlatformTransactionManager :
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
3.在dataAccessContext-jta.xml 中定义
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>jdbc/jpetstore</value>
</property> </bean>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
Transaction结合Hibernate配置:
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource"/>
</property>
<property name="mappingResources">
<value>org/springframework/samples/petclinic/hibernate/petclinic.hbm.xml</value>
</property>
<property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> </props></property></bean> <bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"> <property name="sessionFactory"><ref local="sessionFactory"/></property> </bean>
事务编程第一种方式:
使用TransactionTemplate
tt.execute(new TransactionCallbackWithoutResult(){
protected void doInTransactionWithoutResult(TransactionStatus status) {
updateOperation1();
updateOperation2();
} })
事务编程第二种方式:
使用PlatformTransactionManager 类似使用JTA API
DefaultTransactionDefinition def = new DefaultTransactionDefinition() ;
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status = transactionManager.getTransactionDefinition(def);
try { // execute your business logic here }
catch (MyException ex) { transactionManager.rollback(status); throw ex; } transactionManager.commit(status);
声明式配置事务:
元注解@Transactional: