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:

nTarget 定义需要代理的目标对象
nproxyInterfaces 接口名称,如不定义,CGLIB proxy 将激活使用。
ninterceptorNames 拦截器名称,顺序很重要。
   <bean id="person" class="org.springframework.aop.framework.ProxyFactoryBean">
     <property name="proxyInterfaces">
           <value>com.mycompany.Person</value>
    </property>
    <property name="target">
          <ref local="personTarget"/>
   </property>
    <property name="interceptorNames">
     <list> <value>myAdvisor</value> <value>debugInterceptor</value> </list> </property> </bean>

<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实现

PetshopServiceTarget是应用系统的业务对象,必须设为非单态。
<bean id="petshopServiceTarget"
    class=“XXXXXX.PetshopManagerImpl"  
              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的数据抽象层。

事务架构:

事务策略定义:

  1. Transaction isolation 事务隔离程度
  2. Transaction propagation 类似CMT ,在已经存在的事务中运行,中断事务,创建新事务。
  3. Transaction timeout
  4. 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);

声明式配置事务:

n<bean id="petStore" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
     
            <property name="transactionManager">
                  <ref bean="transactionManager"/>
              </property>
             <property name="target">
                   <ref bean="petStoreTarget"/>
             </property>
            <property name="transactionAttributes">
                  <props>
            <prop key="insert*">PROPAGATION_REQUIRED,-MyCheckedException</prop>
            <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props>
            </property>
   </bean>

元注解@Transactional:

 

Spring专题