博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
aop 例子(annotation方式实现)
阅读量:6173 次
发布时间:2019-06-21

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

面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
面向切面编程:就是在原直线编程的某处咔嚓一下,加点动西,而且不影响原来的代码。可以用在日志,加权限,事物,异常管理等方面。
 
从简单的例子说起
现在有一个save()方法,需要在save()前、后分别加上日志打印的信息。
 
  1. public class UserDAOImp implements UserDAO  
  2. {  
  3.   
  4.     @Override  
  5.     public void save(User u)  
  6.     {  
  7.         System.out.println("a DAO implements!");  
  8.     }  
  9.   
  10. }  
1.  解决办法一:
直接在源代码save里加一些输出就行了。
前提条件:有源代码!
 
  1. public class UserDAOImp implements UserDAO  
  2. {  
  3.   
  4.     @Override  
  5.     public void save(User u)  
  6.     {  
  7.         System.out.println("before!!!!!");  
  8.         System.out.println("a DAO implements!");  
  9.         System.out.println("after!!!!!!");  
  10.     }  
  11.   
  12. }  
评价:傻瓜式的!可拓展性差!!
2.  解决办法二:
如果没有源代码呢?
可以继承UserDAOImp, 然后在xml中将bean的class改成继承的类。
前提条件:继承
 
  1. public class UserDAOImp1 extends UserDAOImp  
  2. {  
  3.       
  4.     @Override  
  5.     public void save(User u)  
  6.     {  
  7.         System.out.println("save start......");  
  8.         super.save(u);  
  9.     }  
  10.   
  11. }  
评价:继承尽量少用。可拓展性也差!!
 
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.       
  11. }  
评价:比较灵活了,但还是有一个问题, 当有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.     //下面用到的是织入点语法, 看文档里面有. 就是指定在该方法前执行  
  13.     //@Before("execution(public void com.dao.impl.UserDAOImp.save(com.model.User))")  
  14.     //记住下面这种通用的, *表示所有  
  15.     @Before("execution(public * com.dao.impl..*.*(..))")  
  16.     public void beforeMethod()  
  17.     {  
  18.         System.out.println("save start......");  
  19.     }  
  20.       
  21.     //正常执行完后  
  22.     @AfterReturning("execution(public * com.dao.impl..*.*(..))")  
  23.     public void afterReturnning()  
  24.     {  
  25.         System.out.println("after save......");  
  26.     }  
  27.       
  28.     //抛出异常时才调用  
  29.     @AfterThrowing("myMethod()")  
  30.     public void afterThrowing()  
  31.     {  
  32.         System.out.println("after throwing......");  
  33.     }  
  34.       
  35.     //环绕, 这个特殊点.  
  36.     @Around("myMethod()")  
  37.     public void aroundMethod(ProceedingJoinPoint pjp) throws Throwable  
  38.     {  
  39.         //加逻辑的时候, 不要依赖执行的的先后顺序  
  40.         System.out.println("method around start!");  
  41.         pjp.proceed();  
  42.         System.out.println("method around end!");  
  43.     }  
  44. }  

转载于:https://www.cnblogs.com/atongmyuxiaowanzi/p/5288213.html

你可能感兴趣的文章
Linux下的uml画图工具
查看>>
xml返回数组数据
查看>>
约瑟夫问题总结
查看>>
spring mybatis 批量插入返回主键
查看>>
指针函数小用
查看>>
开源力量公开课第二十三期-从SVN到Git,次时代代码管理
查看>>
输入挂
查看>>
升级迁移前,存储过程统计各个用户下表的数据量,和迁移后的比对
查看>>
sql注入分类
查看>>
初识CSS选择器版本4
查看>>
[Hadoop in China 2011] 朱会灿:探析腾讯Typhoon云计算平台
查看>>
JavaScript之数组学习
查看>>
PHP 设置响应头来解决跨域问题
查看>>
CAS实现SSO单点登录原理
查看>>
博客园美化专用图片链接
查看>>
HDU_1969_二分
查看>>
高等代数葵花宝典—白皮书
查看>>
一种简单的图像修复方法
查看>>
基于DobboX的SOA服务集群搭建
查看>>
C#设计模式之装饰者
查看>>