1、术语的理解
切面 :首先建立一个切面,相当于一个过滤器之类的东西,就是对于某一种功能上的需求进行判断,并分为不同的情况来处理。
连接点:对这一类问题中的某些方法,可能要穿过这个切面去执行,会在切面上进行判断。它只是连接点,但还不确定是否要切入切面。
切入点:是一个断言,并且他对应一个通知,它会去判断切入点,用此断言去判断切入点,也就是方法,当这个方法满足它的需求的时候,如以XXX开头,然后就会执行通知,通知某一组件去执行某一通用的操作。
通知:在切入点执行的动作,共有三种,Around,Before,After。也就是在连接点(方法)执行的前,后,或来回吧,也就是前后都有,功能强大,去执行某一个动作。
目标对象:当符合切入点的时候,就会通知它去执行一些操作,因为AOP是通过动态代理来执行的,所以,它是一个代理对象。
引入:官方说明:Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。我的理解就是对目标对象所执行的操作的一个规范比如对增加、修改、查询要开启事务。
织入:就是把切面配置到应用程序中,并创建目标对象,也就是被通知对象,就是符合条件要执行的操作。
2、对应实际的配置进行分析
<!-- 配置事务管理器-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<!-- 配置事务的传播特性-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 那些类的哪些方法参与事务 -->
<aop:config>
<aop:pointcut id="allManagerMethod"
expression="execution(* org.jsoft.services.impl.*.*(..))"/>
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice" />
</aop:config>
上面是Spring处理事务的AOP部分,可以看出来:
1、 切入点PointCut通过Expression断言来判断org.jsoft.services.impl包下的所有类的方法,具体的断言内容在advice-ref="txAdvice"里面,也就是方法的判断,然后去通知事务管理器。
2、 或者这样看,这里有一个通知者<aop:advisor,它有两部分组成,第一个要处理的切入点,pointcut-ref="allManagerMethod",就是要对哪些连接点,也就是哪些类下的哪些方法,第二个是具体的判断要求和要执行的操作。也就是advice-ref="txAdvice",它对于不同的情况有不同的目标对象,也就是此处的事务管理器。
3、 整个流程就是这样,切面,它也就像一个中间的过滤器,用来过滤方法,也就是连接点,切面有自己的过滤范围,也就是切入点的配置范围,同时切入点有自己的if条件,当满足某种条件的时候,也就是符合切入点,符合断言,然后就去通知目标对象,也就是一个类去执行某些操作。这就是AOP,引入是对目标对象的规定,规定他要做什么;织入,也就是配置切面和切入点,并创建目标对象,也就是一个处理的类。