面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
面向切面编程:就是在原直线编程的某处咔嚓一下,加点动西,而且不影响原来的代码。可以用在日志,加权限,事物,异常管理等方面。
 
从简单的例子说起
现在有一个save()方法,需要在save()前、后分别加上日志打印的信息。
  1. public class UserDAOImp implements UserDAO
  2. {
  3. @Override
  4. public void save(User u)
  5. {
  6. System.out.println("a DAO implements!");
  7. }
  8. }

1.  解决办法一:

直接在源代码save里加一些输出就行了。
前提条件:有源代码!
  1. public class UserDAOImp implements UserDAO
  2. {
  3. @Override
  4. public void save(User u)
  5. {
  6. System.out.println("before!!!!!");
  7. System.out.println("a DAO implements!");
  8. System.out.println("after!!!!!!");
  9. }
  10. }
评价:傻瓜式的!可拓展性差!!

2.  解决办法二:

如果没有源代码呢?
可以继承UserDAOImp, 然后在xml中将bean的class改成继承的类。
前提条件:继承
  1. public class UserDAOImp1 extends UserDAOImp
  2. {
  3. @Override
  4. public void save(User u)
  5. {
  6. System.out.println("save start......");
  7. super.save(u);
  8. }
  9. }

评价:继承尽量少用。可拓展性也差!!

 
3.  解决办法三:
针对第二种办法优化,用接口。
  1. public class UserDAOImp2 implements UserDAO
  2. {
  3. private UserDAO userDAO = new UserDAOImp();
  4. @Override
  5. public void save(User u)
  6. {
  7. System.out.println("save start.....");
  8. userDAO.save(u);
  9. }
  10. }

评价:比较灵活了,但还是有一个问题, 当有1000个bean时, 就要组合1000次........如何解决?

4. 解决办法四:
AOP
在不修改源代码的情况下给程序动态统一添加功能。
  1. /*
  2. *面向切面编程, 动态代理. Aspect声明切面, Component初始化.
  3. */
  4. @Aspect
  5. @Component
  6. public class LogInterceptor
  7. {
  8. //这个可用来替代以后重复出现的. 直接在后面的Before("myMethod()")就行了.
  9. @Pointcut("execution(public * com.dao.impl..*.*(..))")
  10. public void myMethod(){};
  11. //下面用到的是织入点语法, 看文档里面有. 就是指定在该方法前执行
  12. //@Before("execution(public void com.dao.impl.UserDAOImp.save(com.model.User))")
  13. //记住下面这种通用的, *表示所有
  14. @Before("execution(public * com.dao.impl..*.*(..))")
  15. public void beforeMethod()
  16. {
  17. System.out.println("save start......");
  18. }
  19. //正常执行完后
  20. @AfterReturning("execution(public * com.dao.impl..*.*(..))")
  21. public void afterReturnning()
  22. {
  23. System.out.println("after save......");
  24. }
  25. //抛出异常时才调用
  26. @AfterThrowing("myMethod()")
  27. public void afterThrowing()
  28. {
  29. System.out.println("after throwing......");
  30. }
  31. //环绕, 这个特殊点.
  32. @Around("myMethod()")
  33. public void aroundMethod(ProceedingJoinPoint pjp) throws Throwable
  34. {
  35. //加逻辑的时候, 不要依赖执行的的先后顺序
  36. System.out.println("method around start!");
  37. pjp.proceed();
  38. System.out.println("method around end!");
  39. }
  40. }

aop 例子(annotation方式实现)的更多相关文章

  1. 5.3 Spring5源码--Spring AOP使用接口方式实现

    Spring 提供了很多的实现AOP的方式:Spring 接口方式,schema配置方式和注解. 本文重点介绍Spring使用接口方式实现AOP. 使用接口方式实现AOP以了解为目的. 更好地理解动态 ...

  2. spring aop 使用注解方式总结

    spring aop的注解方式:和xml的配置方式略有区别,详细如下: 1.首先还是建立需要的切面类:切面类里面定义好切点配置,以及所有的需要实现的通知方法. /** * */ package com ...

  3. springboot aop 自定义注解方式实现完善日志记录(完整源码)

    版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 一:功能简介 本文主要记录如何使用aop切面的方式来实现日志记录功能. 主要记录的信息有: 操作人,方法名,参数,运行时间,操作类型 ...

  4. springboot aop 自定义注解方式实现一套完善的日志记录(完整源码)

    https://www.cnblogs.com/wenjunwei/p/9639909.html https://blog.csdn.net/tyrant_800/article/details/78 ...

  5. Spring入门6事务管理2 基于Annotation方式的声明式事务管理机制

    Spring入门6事务管理2 基于Annotation方式的声明式事务管理机制 201311.27 代码下载 链接: http://pan.baidu.com/s/1kYc6c 密码: 233t 前言 ...

  6. Spring整合Hibernate:2、使用Annotation方式进行声明式的事务管理

    1.加入DataSourceTransactionManager的命名空间 修改applicationContext.xml文件,增加如下内容: 1 2 3 4 5 6 7 8 9 10 11 12 ...

  7. 一个简单的Spring AOP例子

    转载自: http://www.blogjava.net/javadragon/archive/2006/12/03/85115.html 经过这段日子的学习和使用Spring,慢慢地体会到Sprin ...

  8. spring+springMVC集成(annotation方式)

    spring+springMVC集成(annotation方式) SpringMVC+Spring4.0+Hibernate 简单的整合 MyBatis3整合Spring3.SpringMVC3

  9. 框架源码系列七:Spring源码学习之BeanDefinition源码学习(BeanDefinition、Annotation 方式配置的BeanDefinition的解析)

    一.BeanDefinition 1. bean定义都定义了什么? 2.BeanDefinition的继承体系  父类: AttributeAccessor: 可以在xml的bean定义里面加上DTD ...

随机推荐

  1. 从头開始写项目Makefile(五):嵌套运行

    [版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] 在大一些的项目里面,全部源码不会仅仅放在同一个文件夹,一般各个功 ...

  2. java代码实现输出指定以.java结尾的文件的绝对路径

    package 输出指定文件绝对路径; import java.io.File; /* * 需求:请大家把"E:\\JAVA语言"文件夹下全部的java结尾的文件的绝对路径给输出在 ...

  3. 查看本机外网ip地址

    DOS下是无法查看外网IP的,只能获取本机内网IP地址   外网IP只能通过专门的测IP网站 http://www.ip138.com/ip2city.asp

  4. 25:坐标移动CoordinateMove

    题目描述 开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动.从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面. 输入: 合 ...

  5. 网络通信数据处理 Xbytestring类

    PS_Xbytestring a byte string for store low level data type 文件夹[TOC] PS_Xbytestring 文件夹TOC base info ...

  6. EventBus使用的简介

    写在前面 曾经我们做组件间的消息分发更新,通常会採用观察者模式.或者接口数据回调的相关方式,可是这种做法尽管能够解决我们的问题.可是组件之间的耦合相当严重,并且代码也不易阅读和维护,为了解决这种问题, ...

  7. iOS 10 的杂碎资料

    兼容iOS 10 资料整理笔记   1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大 ...

  8. GS与数据库打交道

    GS与数据库打交道 link_stat stat = (link_stat)rPkt.size; if (stat == link_stat::link_connected) { GameChanne ...

  9. Jmeter文章索引贴

    一.基础部分: 使用Jmeter进行http接口测试 Jmeter之Http Cookie Manager Jmeter之HTTP Request Defaults Jmeter之逻辑控制器(Logi ...

  10. 九度OJ 1172:哈夫曼树 (贪心)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6701 解决:2954 题目描述: 哈夫曼树,第一行输入一个数n,表示叶结点的个数.需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结 ...