您的当前位置:首页正文

面向方面编程四种常用形式总结

2024-11-11 来源:个人技术集锦

Advisor:

 

  切点:

 

实例

public class Test extentds DynamicMethodMatherPointcut{

private static List<String>specialClientList=new ArrayList<String>();

static{

specialClientList.add("tom");

specialClientList.add("lilei");

}

 public ClassFileter getClassFileter(){

  return new ClassFileter(){

 public boolean matches(Class clazz){

 System.out.println("调用getClassFilter()对"+clazz.getName()+"做静态检查");

 return Waiter.class.isAssignableForm(clazz);

}

};

}

public boolean matches(Method method,Class clazz){

System.out.println("对"+method.getName()+"做静态检查");

return "greeTo".equals(method.getName());

}

public boolean mathes(Method method,Class clazz,Object[] args){         //对连接点入参绑定

System.out.println("对"+method.getName()+"做动态检查");

String clientName=(String)args[0];

return specialClientList.contains(clientName);

}

}

 

切面 (applicationContext.xml文件的配置):

<bean id="advisor">

 <property name="pointcut"><ref local="pointcut"/></property>

 <property name="advice"><ref local="advice"/></property>

</bean>

<bean id="advice" class="TestMethodBeforeAdivce"/>

<bean id="pointcut" class="..Test"/>

 

@AspectJ

  切点:支持AspectJ切点表达式语法,可以通过@Pointcut注解定义命名切点

  切点写法:    @切面类型("切点函数(切点表达式)")

 

 切面:带有切点注解方法的类组成

 

 常见的切面类型:@Bfore @AfterReturnint @Around @AfterThrowing @After @DeclareParents

 常见的切点函数: @annotation() execution() args() @args() within()@within() @target() target() this()               

 

 连接点方法入参绑定:1) 可以通过JoinPoint,ProceedingJoinPoint连接对象   2)使用切点函数指定参数名绑定

 连接点方法返回值: 1)在后置增强中,使用@AfterReturning的returning成员绑定方法返回值

 

 

<aop:aspect>

  切点:通过<aop:pointcut id="a"  expression="切点表达式"/><aop:before method="" pointcut-ref="a"/>

或者<aop:before method=""  pointcut="切点表达式">

  切面:

     <aop:config>

     <aop:aspect ref="增强类">

     <aop:before method="增强类中的特定方法" pointcut="切点表达式"/>

      <aop:aspect/>

     </aop:config>

 

<aop:advisor>

切点:通过aop:advisor 的pointcut属性指定

切面

    <aop:config proxy-target-class="true">

    <aop:advisor advice-ref="" pointcut="切点表达式"/>

    </aop:config>

 

 

 

下表为四种切面方法常用的增强类型

 

 @AspectJ<aop:aspect>Advisor<aop:advisor>
前置增强@Before<aop:before>MethodBeforeAdvice同左面
后置增强@AfterReturnint<aop:after-returning>AfterReturningAdvice同左面
环绕增强@Around<aop:around>MethodInterceptor同左面
抛出异常增强@AfterThrowing<aop:after-throwing>ThrowsAdvice同左面
final增强@After<aop:after>无对应接口同左面
引介增强@DeclareParents<aop:declare-parents>IntroductionInterceptor同左面
切面组成各种增强注解和增强方法组成切面类aop:config配置切点和增强属性通过bean的advice和pointcut属性配置通过aop:config 配置
织入

(方法一)AspectJProxyFactory类,该类常用方法:

setTarget();

addAspect();

(proxyclass)getProxy();

(方法二)

在applicationContext.xml配置<aop:aspectj-autoproxy>

由容器依据切点表达式自动织入匹配的类中,这个过程不需要用户操作

ProxyFactorBean类,配置interceptorNames,target,proxyInterfaces,

proxyTargetClass(true/false)属性,有容器产生供用户使用的代理对象。

同<aop:aspect>

 

 

 

 

 

 

显示全文