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

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>

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值