spring中AOP的自动代理

DefaultAdvisorAutoProxyCreator 这种配置方式与BeanNameAutoProxyCreator自动创建代理的方式非常相似,都是使用bean后处理器为目标bean创建代理,区别是前者使用事务拦截器创建代理 ,后者需要使用Advisor创建事务代理
事实上,采用DefaultAdvisorAutoProxyCreator的事务代理配置方式更加简洁,这个代理生成器自动搜索Spring容器中的Advisor,并为容器中所有的bean创建代理。

 

DefaultAdvisorAutoProxyCreator:
下面是使用DefaultAdvisorAutoProxyCreator的配置方式

对于事务,使用TransactionAttributeSourceAdvisor这个Advisor:

 <!-- 定义事务管理器,使用适用于Hibernte的事务管理器-->
 <bean id="transactionManager"
 class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	 <property name="sessionFactory"><ref local="sessionFactory"/></property>
 </bean>

 <!-- 配置事务拦截器-->
 <bean id="transactionInterceptor"
 class="org.springframework.transaction.interceptor.TransactionInterceptor">
 <!-- 事务拦截器bean需要依赖注入一个事务管理器 -->
	<property name="transactionManager" ref="transactionManager"/>
	<property name="transactionAttributes">
	  <!-- 下面定义事务传播属性-->
	  <props>
	   <prop key="insert*">PROPAGATION_REQUIRED</prop>
	   <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
	   <prop key="*">PROPAGATION_REQUIRED</prop>
	  </props>
	</property>
 </bean>

 <!-- 定义事务Advisor-->
<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"<!-- 定义advisor时,必须传入Interceptor-->
	<property name="transactionInterceptor" ref="transactionInterceptor"/>
</bean>

 <!-- DefaultAdvisorAutoProxyCreator搜索容器中的 advisor,并为每个bean创建代理 -->
 <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

 在这种配置方式下,配置文件变得更加简洁,增加目标bean,不需要增加任何额外的代码,容器自动为目标bean生成代理。但这种方式的可读性相对较差。

来源:http://mopdzz.itpub.net/post/20166/470140


当ApplicationContext读如所有的Bean配置信息后,DefaultAdvisorAutoProxyCreator将扫描上下文,寻找所有的Advistor(一个Advisor是一个切入点和一个通知的组成) ,将这些Advisor应用到所有符合切入点的Bean中。

此例子没有用到事务,只用到AOP

 //前置通知  
 public class WelcomeAdvice implements MethodBeforeAdvice ...{  
   
     public void before(Method method, Object[] args, Object obj)  
             throws Throwable ...{             
         System.out.println("Hello welcome to bye ");     
     }     
 } 
 
   <!-- 自动代理所有的advisor -->  
   <bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean> 

   <bean id="WelcomeAdvice" class="AutoProxyTwo.WelcomeAdvice"/>  

   <bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">  
      <property name="pattern">  
        <value>.*sell.+</value>  <!-- 业务实现方法名匹配 -->  
      </property>  
      <property name="advice">  
        <ref bean="WelcomeAdvice"/>  
      </property>  
   </bean> 

雷同:http://www.iteye.com/topic/128556

http://esffor.iteye.com/blog/96126

 

很值得看的例子(没有用到事务,单纯AOP)

http://www.blogjava.net/cmzy/archive/2008/08/17/222624.html

 

BeanNameAutoProxyCreator:

<!-- 配置事务拦截器-->
    <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
        <!-- 事务拦截器bean需要依赖注入一个事务管理器 -->
        <property name="transactionManager" ref="transactionManager" />
        <property name="transactionAttributes">
            <!-- 下面定义事务传播属性-->
            <props>
                <prop key="insert*">PROPAGATION_REQUIRED</prop>
                <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>

    //定义BeanNameAutoProxyCreator,该bean是个bean后处理器,无需被引用,因此没有id属性
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="beanNames">
            <!-- 下面是所有需要自动创建事务代理的bean-->
            <list>
                <value>userDAOTarget</value>
            </list>
        </property>
        <!-- 下面定义BeanNameAutoProxyCreator所需的事务拦截器-->
        <property name="interceptorNames">
            <list>
                <value>transactionInterceptor</value>
                <!-- 此处可增加其他新的Interceptor -->
            </list>
        </property>
    </bean>

    <!--定义DAO Bean ,由于BeanNameAutoProxyCreator自动生成事务代理-->
    <bean id="userDAOTarget" class="db.CustomersDAO">
        <property name="sessionFactory">
            <ref local="localSessionFactory" />
        </property>
    </bean>

  单纯使用AOP时,interceptorNames为通知advice:

 <beans>   
      <bean id="TestBeanA" class="aop.test.TestBeanA"/>  
      <bean id="BeanB" class="aop.test.BeanB"/>    
      <bean id="BeforeAdvice" class="aop.test.BeforeAdvice"></bean>  
     
      <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
          <property name="beanNames">  
              <list>  
                  <value>Test*</value>  
              </list>  
          </property>  
          <property name="interceptorNames">  
              <list>  
                  <value>BeforeAdvice</value>  
              </list>  
          </property>  
      </bean>  
  </beans>  

 

http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch07s09.html

http://mopdzz.itpub.net/post/20166/470137

http://hi.baidu.com/freshman0502/blog/item/8068e01b5038d01c8618bf8e.html

 

你可能感兴趣的:(spring,AOP,bean,.net,配置管理)