上一篇中分析了AOP的实现原理,

总结为:

  • 判断对象是否需要被代理?@Aspect注解的实现是根据切入点表达式
  • 代理之后需要做什么,就是那些通知,本质上是实现了MethodInterceptor的拦截器
  • 如何让一个自定义的通知器生效?就是注入一个实现Advisor的bean

我们在使用@Aspect时通常都是使用表达式,基本上都是基于package级别的切,如果我们只想切某些较为分散的方法,这个时候配置表达式的话可能就不太方便啦,那么可以通过自定义注解,在需要的方法上加上这个注解就ok了

根据这些信息,我们可以自己仿写一个类@Aspect的功能

1.注入一个通知器,基于表达式的

@Component
public class MethodCustomAdvisor extends AbstractPointcutAdvisor { @Override
public Pointcut getPointcut() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
//定义切入点表达式
pointcut.setExpression("切入点表达式");
//基于method级别的注解
// AnnotationMatchingPointcut.forMethodAnnotation(MethodCustomAnnotation.class);
     //基于class级别的注解
// AnnotationMatchingPointcut.forClassAnnotation(ClazzCustomAnnotation.class);
return pointcut;
}
//绑定某个通知
@Override
public Advice getAdvice() {
return new MethodCustomInterceptor();
}
}

2. 定义一个拦截器(通知),表明这个通知要做什么,这样完全就可以啦

@Slf4j
public class MethodCustomInterceptor implements MethodInterceptor, Serializable { private Map<Method, Boolean> map = new ConcurrentHashMap<>(); @Override
public Object invoke(MethodInvocation invocation) throws Throwable {
log.error("ff========");
//譬如记录日志等等...... return invocation.proceed();
}
}

3.基于注解的实现

基于注解的话,完全就是将上面的表达式的判断部分改为注解的相关判断就可以啦,aop本身提供了方法级别和类级别的注解判断,只要自己定义一个注解写上去就OK啦

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface MethodCustomAnnotation { String name() default "name"; String value(); }

最新文章

  1. html中css、div命名规范
  2. a标签不跳转
  3. CSS3动画效果结合JS的轮播
  4. Match:Period(POJ 1961)
  5. 可自定义导航条功能案例ios项目源码
  6. 设置TabBarItem选中时的图片及文字颜色
  7. Sharepoint 2010 Workflow 发布
  8. UDID
  9. HTML及简单标签介绍
  10. Spring MVC中 controller方法返回值
  11. pfile,spfile 初始化参数文件顺序【weber出品】
  12. POJ2031Building a Space Station (最小生成树之prim)
  13. HDU 5572 An Easy Physics Problem (计算几何+对称点模板)
  14. springboot 打包
  15. CSS实现文字换行
  16. wget命令企业级应用参数详解
  17. 为什么开源外围包安装指导都是按照到/usr/local/目录下,/usr/local与/usr的区别
  18. 深入理解 ORM框架
  19. js之DOM对象三
  20. QC内部分享ppt

热门文章

  1. world 页面横向
  2. 12个提高Java程序员工作效率的工具
  3. const成员函数和const对象
  4. django-bootstrap4|django 加载popper.min.js失败
  5. Packet for query is too large (4,544,730 &gt; 4,194,304). You can change this value on the server by setting the &#39;max_allowed_packet&#39; variable.
  6. 底部版权时间自动变化,网页在线qq咨询
  7. SPOJ - AMR11B 判断是否在三角形 正方形 圆形内
  8. Spring入门篇——第2章 Spring IOC容器
  9. zabbix验证微信
  10. 数字签名 转载:http://www.youdzone.com/signature.html