转自:https://www.cnblogs.com/qicosmos/archive/2013/04/07/3003480.html

(原创) C++ 轻量级AOP框架

c++11 boost技术交流群:296561497,欢迎大家来交流技术。

c++中开源的AOP框架AspectC++需要单独编译才能将切面的代码织入到核心逻辑代码中,感觉使用起来不方便,不能满足快速开发要求。我希望只要实现方法拦截即可,能织入before()和after()操作就行,不追求动态织入。思路是这样的,通过一个包装类,里面定义before()和after()方法,和->运算符重载方法,在重载操作函数中实现before()和after()操作。具体代码如下:

 1 #include <boost/shared_ptr.hpp>
 2
 3 template <typename WrappedType, typename DerivedAspect>
 4 class BaseAspect
 5 {
 6 protected:
 7   WrappedType* m_wrappedPtr; //被织入的对象
 8
 9   //获取派生的切面对象
10   DerivedAspect* GetDerived()
11   {
12     return static_cast<DerivedAspect*>(this);
13   }
14
15   //被织入对象的删除器,用来自动触发切面中的After方法
16   struct AfterWrapper
17   {
18     DerivedAspect* m_derived;
19     AfterWrapper(DerivedAspect* derived): m_derived(derived) {};
20     void operator()(WrappedType* p)
21     {
22       m_derived->After(p);
23     }
24   };
25 public:
26   explicit BaseAspect(WrappedType* p) :  m_wrappedPtr(p) {};
27
28
29   void Before(WrappedType* p) {
30      // Default does nothing
31   };
32
33   void After(WrappedType* p) {
34      // Default does nothing
35   }
36
37   //重载指针运算符用来织入切面(Before和After)
38   boost::shared_ptr<WrappedType> operator->()
39   {
40     GetDerived()->Before(m_wrappedPtr);
41     return boost::shared_ptr<WrappedType>(m_wrappedPtr, AfterWrapper(GetDerived()));
42   }
43 };
44
45 //织入切面的工厂函数, 返回包含被织入对象的切面
46 template <template <typename> class Aspect, typename WrappedType>
47 Aspect<WrappedType> MakeAspect(WrappedType* p)
48 {
49   return Aspect<WrappedType>(p);
50 }

BaseAspect为切面的基类,提供了Before()和After()方法,供派生的切面实现;

下面看看具体的切面实现:一个实现对函数运行时间的统计,一个实现日志功能。

 1 #include <iostream>
 2 #include <boost/chrono/chrono.hpp>
 3 #include <boost/chrono/system_clocks.hpp>
 4
 5 template<typename WrappedType>
 6 class TimeElapsedAspect : public BaseAspect< WrappedType, TimeElapsedAspect<WrappedType> >
 7 {
 8   typedef  BaseAspect<WrappedType, TimeElapsedAspect<WrappedType> > BaseAspect;
 9   typedef boost::chrono::time_point<boost::chrono::system_clock, boost::chrono::duration<double> > time_point;
10
11   time_point m_tmBegin;
12 public:
13   TimeElapsedAspect(WrappedType* p): BaseAspect(p) {}
14
15
16   void Before(WrappedType* p)
17   {
18     m_tmBegin = boost::chrono::system_clock::now();
19   }
20
21   void After(WrappedType* p)
22   {
23     time_point end = boost::chrono::system_clock::now();
24
25     std::cout << "Time: " << (end-m_tmBegin).count() << std::endl;
26   }
27 };

TimeElapsedAspect切面实现对函数运行时间统计。

 1 template <typename WrappedType>
 2 class LoggingAspect : public BaseAspect<WrappedType, LoggingAspect<WrappedType> >
 3 {
 4   typedef  BaseAspect<WrappedType, LoggingAspect<WrappedType> > BaseAspect;
 5 public:
 6   LoggingAspect(WrappedType* p): BaseAspect(p) {}
 7
 8   void Before(WrappedType* p)
 9   {
10     std::cout << "entering" << std::endl;
11   }
12
13   void After(WrappedType* p)
14   {
15     std::cout << "exiting" << std::endl;
16   }
17
18 };

LoggingAspect实现日志记录

现在来看看测试代码

class IX
{
public:IX(){}virtual ~IX(){}virtual void g()=0;
private:};class X : public IX
{
public:void g() {std::cout << "it is a test" << std::endl;}};void TestAop()
{boost::shared_ptr<IX> p(new X());MakeAspect<TimeElapsedAspect>(p.get())->g();MakeAspect<LoggingAspect>(p.get())->g();
}

测试结果:

总结:

这个简单的AOP实现,可以实现对类的方法进行拦截,具体切面自由定制,不过还有个地方不太完善,还不支持切面的组合,这个可以用TypeList去实现。

一点梦想:尽自己一份力,让c++的世界变得更美好!

面向切面编程--AOP相关推荐

  1. Spring in Action 入门之面向切面编程AOP

    注明:这篇文章一是当成学习笔记,二是给大家提供另一个快速理解学习Spring的参考.欢迎留言讨论,持续更新中~ (该部分是Spring的面向切面编程AOP) 第四章 通知Bean 在软件编程中,散布于 ...

  2. 服务端第三次课程:面向切面编程AOP

    3:面向切面编程AOP 1:回顾 bean的组装方式 规划的装配 component autowired sacn是在configuration底下的 Java config 使用configurat ...

  3. Spring-学习笔记08【面向切面编程AOP】

    Java后端 学习路线 笔记汇总表[黑马程序员] Spring-学习笔记01[Spring框架简介][day01] Spring-学习笔记02[程序间耦合] Spring-学习笔记03[Spring的 ...

  4. Spring→面向切面编程AOP、相关概念、通知Advice类型、配置切面切入点通知、AOP相关API、AOP代理类ProxyFactoryBean、AOP注解@AspectJ

    面向切面编程AOP CGLib AOP相关概念 Advice类型 Spring实现AOP Spring配置切面aspect 配置切入点pointcut 配置通知advice 配置通知参数 调用新的父类 ...

  5. Spring(四):面向切面编程AOP

    2019独角兽企业重金招聘Python工程师标准>>> 横切关注点:分布于应用中多处的功能 面向切面编程AOP:将横切关注点与业务逻辑相分离 在使用面向切面编程时,仍在一个地方定义通 ...

  6. Spring之面向切面编程AOP(八)

    介绍&步骤 视频教程: https://www.bilibili.com/video/BV1WZ4y1P7Bp?p=121 官方笔记链接:https://pan.baidu.com/s/1dn ...

  7. 九、面向切面编程AOP

    本栏博客目录 一.Spring的IOC和DI 二.IoC和DI注解开发 三.SpringMVC入门 四.SpringMVC的请求和响应 五.JdbcTemplate 六.Spring练习 七.Spri ...

  8. java切面编程 切面概念,面向切面编程(AOP)初探

    面向对象编程通过设计和语言本身提供的模块化.封装.继承.多态来实现软件复用.尽管OOP在建模以及实现复杂软件方面非常成功,它仍然有一些问题.面向切面编程(AOP)被认为是一项有前途的新技术,它通过对交 ...

  9. 【Spring】面向切面编程AOP

    AOP基础 什么是AOP [废话解释]在软件业,AOP全称Aspect Oriented Programming 即:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AO ...

  10. 图文结合分析Spring的面向切面编程--AOP

    Spring还可以这么学–AOP 上一篇文章Spring还可以这么学–IoC(控制反转) / DI(依赖注入)理解 1. 什么是AOP? AOP(Aspect Oriented Programming ...

最新文章

  1. QT学习-10/18/2012
  2. PC Lint 初学
  3. 解决vc6.0卡死的方法
  4. mysql 分支 XtraDB Percona MariaDB 简介
  5. 四、【线性表】线性表的顺序表示和实现
  6. 现代密码学5.1--哈希函数定义
  7. 从头捋一遍Java项目中的五大设计原则,就不信你学不会!
  8. 转贴:23种设计模式的有趣见解
  9. 响应已被截断_技术:RWD响应式网站网页设计基本原则
  10. 2.10 环境变量PATH 2.11 cp命令 2.12 mv命令 2.13 文档查看cat/mor
  11. Python上传文件到百度网盘(一)
  12. Hadoop配置和启动
  13. 北京科技大学计算机实践,北京科技大学计算机实践报告-Excel 练习
  14. c语言2的n次方编程利用数组,1.6编程基础之一维数组_12计算2的N次方
  15. 【AGC】年龄分级问卷全攻略
  16. opencv2.4.10配置vs2010旗舰版过程与遇到问题的解决
  17. MathRound修约
  18. 费雪MOGAFX方程式是什么? -
  19. Android 手机设备信息获取使用详解
  20. MATLAB 用拉格朗日插值验证龙格现象

热门文章

  1. Linux的实际操作:文件目录类的实用指令 (显示路径pwd 显示文件ls 更改目录cd)
  2. 如何查看cplex的help文档_word查看技巧:如何快速找到文档的修改痕迹
  3. 高级java技术web组件_(重温)JavaWeb--Servlet技术(二)(JavaWeb 的三大组件之一)...
  4. python什么元素为真_如何使用Python基础内置函数
  5. mysql存储过程注释方法_mysql存储过程 详细注释
  6. python绘制混淆矩阵_如何实现python绘制混淆矩阵?
  7. pytorch 矩阵相乘_深度学习 — — PyTorch入门(三)
  8. vestacp 远程mysql_免费使用VestaCP控制面板的文件管理器 | 雷雨博客
  9. 服务器内存会显示ecc么,服务器内存ecc
  10. java线程interu_Intel 10nm服务器U首曝:多线程性能提升118%