`
uule
  • 浏览: 6352329 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

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(动态代理)

    然而,如果需要更精细的控制,可以通过`@EnableAspectJAutoProxy`注解开启基于AspectJ的自动代理支持,或者通过`proxyTargetClass`属性来强制使用CGLIB代理。 总结一下,Spring的AOP机制通过JDK动态代理和CGLIB动态...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    在 Spring AOP 的自动代理创建过程中,`AbstractAutoProxyCreator` 类起着关键作用。它实现了 `BeanPostProcessor` 接口,会在 Bean 初始化后对其进行处理,生成代理对象。`AbstractAutoProxyCreator` 会查找 Spring...

    springAop默认代理方式.zip

    5. **代理的使用**:在应用中,我们通常不直接引用目标对象,而是通过ApplicationContext获取Bean,此时Spring会自动创建并返回相应的代理对象。这样,当我们调用代理对象的方法时,就会触发AOP代理逻辑。 6. **切...

    spring-boot aop

    6. **配置自动代理**:在某些情况下,可能需要自定义代理创建或禁用某些特性。可以通过`@EnableAspectJAutoProxy`注解在配置类中启用AspectJ支持,并调整其属性。 7. **调试与测试**:确保在测试中正确配置了AOP,...

    Spring 2.5 AOP 例子

    Spring 2.5 AOP(面向切面编程)是Java应用程序中的一个重要概念,它允许开发者在不修改原有代码的情况下插入新的行为或监控。这个例子旨在帮助我们理解和应用Spring框架的AOP特性。以下是对该主题的详细解释: 一...

    解释Spring中的Aop代理

    当我们声明一个Bean为切面并配置通知时,Spring容器会在需要的时候自动创建AOP代理。当通过代理调用目标方法时,Spring会先执行通知,然后转发到实际的目标方法。这个过程称为拦截器链,每个通知相当于一个拦截器,...

    Spring-AOP-JDK动态代理

    本篇将详细讲解Spring中的AOP实现,特别是JDK动态代理的应用。 首先,我们要了解什么是AOP(Aspect Oriented Programming,面向切面编程)。AOP是一种编程范式,旨在解决应用程序中分散的、横切关注点的问题,如...

    spring-aop.jar

    在spring-aop.jar中,`org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator`类负责自动创建代理并织入切面。 三、Spring AOP的使用 在实际应用中,我们可以利用Spring AOP进行日志记录、...

    springAOP配置动态代理实现

    综上所述,通过理解Spring AOP的配置和动态代理机制,我们可以灵活地在项目中添加横切关注点,提升代码的模块化和可维护性。在实际开发中,结合使用XML配置、注解配置以及适当的动态代理策略,可以使AOP功能更好地...

    spring-aop.xsd

    `spring-aop.xsd`文件是Spring AOP配置的XML Schema定义文件,用于指导和验证XML配置中的元素和属性,确保其符合规范,同时也为IDE提供代码提示和自动补全功能,提高开发效率。 在Java开发中,AOP(Aspect Oriented...

    JavaEE spring半自动实现AOP代理

    本篇将深入探讨如何在Spring中半自动地实现AOP代理。 首先,理解AOP的概念是至关重要的。AOP通过将关注点(如日志)与核心业务逻辑分离,提高了代码的可读性和可维护性。在Spring中,AOP代理有两种实现方式:JDK...

    spring2.5.6 aop简单示例

    在Spring 2.5.6版本中,AOP支持两种类型的代理:JDK动态代理和CGLIB代理。JDK动态代理基于接口实现,如果目标类实现了至少一个接口,Spring会使用JDK动态代理。如果目标类没有实现接口或者需要增强的类是final的,...

    JavaEE spring自动实现AOP代理

    在Day01_AutoAOP的学习资料中,你可能将深入理解Spring AOP的原理,实践自动代理的配置,并通过示例代码体验如何使用AOP进行日志记录、事务管理和权限控制等功能。这将有助于提升你在JavaEE开发中的能力,使你的代码...

    研究下Spring中AOP的实现?

    4. 使用AOP:在业务代码中,当匹配的连接点被触发时,对应的切面通知将会自动执行。无需显式调用。 通过上述步骤,`myAOPExample`展示了如何在Spring中定义、配置和应用AOP。这使得我们可以轻松地在不修改原有业务...

    spring-aop。以及把代理类 文件输出

    在实际应用中,我们可以通过Spring的`@Aspect`注解和`@Component`注解将切面类注册到Spring容器中,这样Spring会自动为我们创建代理对象。在运行时,当我们调用被代理的方法时,实际上是在调用代理对象的方法,从而...

    spring 3.0 aop 实例

    5. **自动代理**:Spring可以自动检测应用中的`@Aspect`注解,并自动生成代理。这使得在无需显式配置的情况下启用AOP变得简单。 6. **源码分析**:对于深入理解Spring AOP,阅读其源码是非常有帮助的。你可以通过...

    day39 07-Spring的AOP:自动代理

    在压缩包`spring3_day02_aop`中,可能包含了Spring AOP的示例代码,包括切面类、配置文件以及运行示例,你可以通过学习这些代码加深对Spring AOP自动代理的理解。通过实际操作,你会发现Spring AOP使得编写和管理切...

    spring-aop实例demo

    1. **配置AOP**:在Spring配置文件中启用AOP代理。这可以通过设置`&lt;aop:aspectj-autoproxy&gt;`或`&lt;aop:config&gt;`元素来完成。例如: ```xml &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...

    spring AOP 引入jar包,spring IOC 引入Jar包

    5. **代理(Proxy)**:Spring AOP 使用动态代理技术创建对象,有两种代理方式:JDK 动态代理和 CGLIB 代理。前者适用于接口实现类,后者适用于没有接口的类。 6. **注解使用**:如 @Aspect、@Before、@After、@...

    spring aop spring aop

    5. **代理(Proxy)**:Spring AOP通过动态代理机制创建目标对象的代理,代理对象在调用目标方法时会自动插入切面逻辑。在Java项目中,Spring可以使用JDK动态代理或CGLIB动态代理来创建代理对象。 在实际应用中,...

Global site tag (gtag.js) - Google Analytics