博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring中的Advisor,Advice,Pointcut
阅读量:4952 次
发布时间:2019-06-12

本文共 2381 字,大约阅读时间需要 7 分钟。

一、Spring中的Advisor,Advice,Point概述

1、Advisor:充当Advice和Pointcut的适配器,类似使用Aspect的@Aspect注解的类(前一章节所述)。一般有advice和pointcut属性。

祖先接口为org.springframework.aop.Advisor,应用中可直接使用org.springframework.aop.support.DefaultPointcutAdvisor

 

2、Advice:用于定义拦截行为,祖先接口为org.aopalliance.aop.Advice,该接口只是标识接口,应用中可直接实现BeforeAdvice ,ThrowsAdvice,MethodInterceptor ,AfterReturningAdvice ,IntroductionInterceptor 等子接口

3、Pointcut:用于定义拦截目标集合,祖先接口为org.springframework.aop.Pointcut

 

二、Spring中的Advisor,Advice,Point的应用

1、编写Advisor实现类

在此可直接使用org.springframework.aop.support.DefaultPointcutAdvisor

 

2、编写Advice实现类

public class PlayAdvice implements MethodBeforeAdvice{

 public void before(Method method, Object[] args, Object target)
   throws Throwable {
  System.out.println("my before advice");
 // method.invoke(target, args); 如果再调用这句,则目标方法会执行多一次
 }
}

 

3、编写Pointcut实现类

public class PlayPointcut implements Pointcut {
 public ClassFilter getClassFilter() {
  return new PlayClassFilter();
 }
 public MethodMatcher getMethodMatcher() {
  return new PlayMethodMatcher();
 }
}
//PlayClassFilter的定义

class PlayClassFilter implements ClassFilter {

 public boolean matches(Class clazz) {
  if(clazz.getSimpleName().equals("Play"))
   return true;
  return false;
 }
}

//PlayMethodMatcher的定义

class PlayMethodMatcher implements MethodMatcher {

 public boolean isRuntime() {
  return true;
 }
 public boolean matches(Method method, Class c) {
  if(c.getSimpleName().equals("Play")&&method.getName().contains("Service"))
   return true;
  return false;
 }
 public boolean matches(Method method, Class c, Object[] args) {
  if(c.getSimpleName().equals("Play")&&method.getName().contains("Service"))
   return true;
  return false;
 }
}

 

4、编写目标类

public class Play {

  public void playService(String what){

  System.out.println("play "+what);
 }
}

5、在配置文件中配置

<bean id="adviceBean" class="com.hss.sp.aop.PlayAdvice"/>
<bean id="pointcutBean" class="com.hss.sp.aop.PlayPointcut"/>
<bean id="playService" class="com.hss.sp.service.Play"/>
<bean
   class="org.springframework.aop.support.DefaultPointcutAdvisor">
   <property name="advice" ref="adviceBean"></property>
   <property name="pointcut" ref="pointcutBean"></property>
</bean>

 

6、测试,结果

 BeanFactory bf=new ClassPathXmlApplicationContext("applicationContext.xml");

  Play play=(Play)bf.getBean("playService");
  play.playService("pingpong");

输出:

my before advice

play pingpong

转载于:https://www.cnblogs.com/tinylittlebunny/archive/2013/01/04/2844449.html

你可能感兴趣的文章
PHPCMS V9{loop subcat(0,0,0,$siteid) $r}怎么解释?
查看>>
避免内存重叠memmove()性能
查看>>
【ASP.NET】从服务器端注册客户端脚本
查看>>
Infix to Postfix Expression
查看>>
win7任务栏还原为xp样式
查看>>
SELECT LOCK IN SHARE MODE and FOR UPDATE
查看>>
Perl/Nagios – Can’t locate utils.pm in @INC
查看>>
目录导航「深入浅出ASP.NET Core系列」
查看>>
Git常用命令拾遗
查看>>
简易爬虫(爬取本地数据)
查看>>
一位菜鸟的java 最基础笔记
查看>>
python 进程间通信
查看>>
深拷贝 vs 浅拷贝 释放多次
查看>>
节约内存,请使用标签页管理工具:onetab、better onetab
查看>>
关于android系统不关屏设置
查看>>
SONY VPCS138EC降级安装XP
查看>>
[luogu4201][bzoj1063]设计路线【树形DP】
查看>>
手机抓包-手机劫持域名到指定服务器
查看>>
被放逐的皇后 金建云
查看>>
Javascript 有用参考函数
查看>>