SPING 概念

一、概念
cross-cutting concerns 横向切入功能,和具体的业务逻辑无关,如日志、鉴权等。
Aspect 将cross-cutting concerns收集起来,设计成可以重用的对象,这个对象就叫Aspect
Advice 就是Aspect的具体实现
Joinpoint 就是在程序中执行加入到业务流程的点或者时机。Spring 只支持方法的joinPoint,也就是说只能在方法前后执行。
Pointcut 定义了感兴趣的joinPoint,当调用的方法符合pointcut的表达式的时候,就将advice织入到应用程序中。(这个使用annotation方式比较好理解)
Target               Advice被应用的对象。
Introduction 对于一个现存的类,introduction可以为其增加行为,且不用修改该类的程序。就是在执行期动态地加入一些方法和行为,而不用修改代码。
Proxy 代理。动态代理和静态代理。spring中主要采用动态代理。有部分用CGLIB代理。
weave               Advice被应用到对象的过程叫weave。织入的3个时间点:compile time、classload time、runtime。spring中在运行期织入到目标。
二、spring 的3中实现aop的方式
1、通过实现spring api,并设置代理对象。
2、基于xml的设置,使用<aop>标签。
3、使用基于@AspectJ的Annotation的支持。
三、advice的分类
Before Advice         在对象方法之前执行。通过实现org.springframework.aop.MethodBeforeAdvice接口来实现。
After Advice         在对象方法之后执行。通过实现org.springframework.aop.AfterReturningAdvice接口来实现。
Around Advice        在对象方法前后执行。通过实现org.aopalliance.intercept.MethodInterceptor接口来实现。根据具体情况决定是否调用methodInvocation的proceed()方法
Throw Advice        异常发生时通知某些服务。通过实现org.springframework.aop.ThrowAdvice接口来实现。
要想advice起作用,必须在代理中配置。
四、PointcutAdvisor
接口PointcutAdvisor继承了Advisor接口,在spring中使用PointcutAdvisor提供Pointcut的实例,具体结合Advice,spring内建的Pointcut都有对应的PointcutAdvisor
1、NameMatchMethodPointcutAdvisor,可以用表达式指定advice应用目标上的方法名称。
<bean id="helloadvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
        <property name="mappedName" value="方法正则表达式(如*hello)"/>
         <property name="advice" ref="advice的bean实例"/>
</bean>

2、RegExpMethodPointcutAdvisor
<bean id="regAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <property name="pattern" value="方法正则表达式(如*hello)"/>
         <property name="advice" ref="advice的bean实例"/>
</bean>

3、DefaultPointcutAdvisor
<beanid="defaultAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<propertyname="advice"ref="adviceBean"></property>
<propertyname="pointcut"ref="pointcutBean"></property>
</bean> 

4、ControlFlowPointcut        Spring 提供的动态pointcut功能

猜你喜欢

转载自njnu-zhoubo.iteye.com/blog/1687494