- 浏览: 138866 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
老八牛:
利用迭代器让异步操作更加“人性化”-山寨版的AsyncEnumerator -
老八牛:
为什么看不到代码?
利用迭代器让异步操作更加“人性化”-山寨版的AsyncEnumerator -
xi4nyu:
如果启动Application中的settings 的debu ...
玩蛇记-使用Tornado构建高性能Web之二-autoreload -
huacnlee:
"且在python下工作多日才发现原来在.NET下的 ...
玩蛇记-使用tornado构建高性能Web应用之一 -
jasongreen:
异步数据库操作,在web上有什么作用吗?
玩蛇记-使用tornado构建高性能Web应用之一
修行Python个把星期,终于有点成果了,呵呵,一个利用metaclass实现的aop。
其实python这类非常动态的语言要实现AOP是很容易的,所以首先我们要来先定义一个metaclass
然后我们要在__new__()这个metaclass 的时候动态植入方法到要调用地方法的前后。
具体代码如下:
<bgsound cep="0"><span style="color: #008080;"> 1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""><span style="color: #000000;"><br></span><span style="color: #008080;"> 2</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""></span><span style="color: #800080;">__author__</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">alex</span><span style="color: #800000;">"</span><span style="color: #000000;"><br></span><span style="color: #008080;"> 3</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""></span><span style="color: #800080;">__date__</span> <span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">$2008-12-5 23:54:11$</span><span style="color: #800000;">"</span><span style="color: #000000;"><br></span><span style="color: #008080;"> 4</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""></span><span style="color: #800080;">__name__</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">pyaop</span><span style="color: #800000;">"</span><span style="color: #000000;"><br></span><span style="color: #008080;"> 5</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""><br></span><span style="color: #008080;"> 6</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""></span><span style="color: #800000;">'''</span><span style="color: #800000;"><br></span><span style="color: #008080;"> 7</span><span style="color: #800000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="">这个metaclass是实现AOP的基础<br></span><span style="color: #008080;"> 8</span><span style="color: #800000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""></span><span style="color: #800000;">'''</span><span style="color: #000000;"><br></span><span style="color: #008080;"> 9</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> pyaop(type):<br></span><span style="color: #008080;">10</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #800000;">'''</span><span style="color: #800000;"><br></span><span style="color: #008080;">11</span><span style="color: #800000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> 这个空方法是用来将后面的beforeop和afterop初始化成函数引用<br></span><span style="color: #008080;">12</span><span style="color: #800000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #800000;">'''</span><span style="color: #000000;"><br></span><span style="color: #008080;">13</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> nop(self):<br></span><span style="color: #008080;">14</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">pass</span><span style="color: #000000;"><br></span><span style="color: #008080;">15</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #800000;">'''</span><span style="color: #800000;"><br></span><span style="color: #008080;">16</span><span style="color: #800000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> 下面这两个变量是类变量,也就是存放我们要植入的两个函数的地址的变量<br></span><span style="color: #008080;">17</span><span style="color: #800000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #800000;">'''</span><span style="color: #000000;"><br></span><span style="color: #008080;">18</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> beforeop</span><span style="color: #000000;">=</span><span style="color: #000000;">nop<br></span><span style="color: #008080;">19</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> afterop</span><span style="color: #000000;">=</span><span style="color: #000000;">nop<br></span><span style="color: #008080;">20</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #800000;">'''</span><span style="color: #800000;"><br></span><span style="color: #008080;">21</span><span style="color: #800000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> 设置前后两个植入函数的类函数<br></span><span style="color: #008080;">22</span><span style="color: #800000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #800000;">'''</span><span style="color: #000000;"><br></span><span style="color: #008080;">23</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> @classmethod<br></span><span style="color: #008080;">24</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> setbefore(self,func):<br></span><span style="color: #008080;">25</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> pyaop.beforeop</span><span style="color: #000000;">=</span><span style="color: #000000;">func<br></span><span style="color: #008080;">26</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> @classmethod<br></span><span style="color: #008080;">27</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> setafter(self,func):<br></span><span style="color: #008080;">28</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> pyaop.afterop</span><span style="color: #000000;">=</span><span style="color: #000000;">func<br></span><span style="color: #008080;">29</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #800000;">'''</span><span style="color: #800000;"><br></span><span style="color: #008080;">30</span><span style="color: #800000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> 初始化metaclass的函数,这个函数最重要的就是第四个参数,dict通过这个参数我们可以修改类的属性(方法)<br></span><span style="color: #008080;">31</span><span style="color: #800000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #800000;">'''</span><span style="color: #000000;"><br></span><span style="color: #008080;">32</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__new__</span><span style="color: #000000;">(mcl,name,bases,dict):<br></span><span style="color: #008080;">33</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">from</span><span style="color: #000000;"> types </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> FunctionType </span><span style="color: #008000;">#</span><span style="color: #008000;">加载类型模块的FunctionType</span><span style="color: #008000;"><br></span><span style="color: #008080;">34</span><span style="color: #008000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""></span><span style="color: #000000;"> obj</span><span style="color: #000000;">=</span><span style="color: #000000;">object() </span><span style="color: #008000;">#</span><span style="color: #008000;">定义一个空对象的变量</span><span style="color: #008000;"><br></span><span style="color: #008080;">35</span><span style="color: #008000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""></span><span style="color: #000000;"> </span><span style="color: #800000;">'''</span><span style="color: #800000;"><br></span><span style="color: #008080;">36</span><span style="color: #800000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> 这个就是要植入的方法,func参数就是我们要调用的函数<br></span><span style="color: #008080;">37</span><span style="color: #800000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #800000;">'''</span><span style="color: #000000;"><br></span><span style="color: #008080;">38</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> aop(func):<br></span><span style="color: #008080;">39</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #800000;">'''</span><span style="color: #800000;"><br></span><span style="color: #008080;">40</span><span style="color: #800000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> 我们用这个函数来代替将要调用的函数<br></span><span style="color: #008080;">41</span><span style="color: #800000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #800000;">'''</span><span style="color: #000000;"><br></span><span style="color: #008080;">42</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> wrapper(</span><span style="color: #000000;">*</span><span style="color: #000000;">args, </span><span style="color: #000000;">**</span><span style="color: #000000;">kwds):<br></span><span style="color: #008080;">43</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> pyaop.beforeop(obj) </span><span style="color: #008000;">#</span><span style="color: #008000;">调用前置函数</span><span style="color: #008000;"><br></span><span style="color: #008080;">44</span><span style="color: #008000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""></span><span style="color: #000000;"> value </span><span style="color: #000000;">=</span><span style="color: #000000;"> func(</span><span style="color: #000000;">*</span><span style="color: #000000;">args, </span><span style="color: #000000;">**</span><span style="color: #000000;">kwds) </span><span style="color: #008000;">#</span><span style="color: #008000;">调用本来要调用的函数</span><span style="color: #008000;"><br></span><span style="color: #008080;">45</span><span style="color: #008000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""></span><span style="color: #000000;"> pyaop.afterop(obj) </span><span style="color: #008000;">#</span><span style="color: #008000;">调用后置函数</span><span style="color: #008000;"><br></span><span style="color: #008080;">46</span><span style="color: #008000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""></span><span style="color: #000000;"> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> value </span><span style="color: #008000;">#</span><span style="color: #008000;">返回</span><span style="color: #008000;"><br></span><span style="color: #008080;">47</span><span style="color: #008000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""></span><span style="color: #000000;"> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> wrapper<br></span><span style="color: #008080;">48</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #008000;">#</span><span style="color: #008000;">在类的成员列表中查找即将调用的函数</span><span style="color: #008000;"><br></span><span style="color: #008080;">49</span><span style="color: #008000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""></span><span style="color: #000000;"> </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> attr, value </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> dict.iteritems():<br></span><span style="color: #008080;">50</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> isinstance(value, FunctionType):<br></span><span style="color: #008080;">51</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> dict[attr] </span><span style="color: #000000;">=</span><span style="color: #000000;"> aop(value) </span><span style="color: #008000;">#</span><span style="color: #008000;">找到后用aop这个函数替换之</span><span style="color: #008000;"><br></span><span style="color: #008080;">52</span><span style="color: #008000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""></span><span style="color: #000000;"> obj</span><span style="color: #000000;">=</span><span style="color: #000000;">super(pyaop, mcl).</span><span style="color: #800080;">__new__</span><span style="color: #000000;">(mcl, name, bases, dict) </span><span style="color: #008000;">#</span><span style="color: #008000;">调用父类的__new__()创建self</span><span style="color: #008000;"><br></span><span style="color: #008080;">53</span><span style="color: #008000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""></span><span style="color: #000000;"> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> obj<br></span><span style="color: #008080;">54</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span></bgsound>
使用的时候,如果我们要拦截一个类A的方法调用,就这样子:
<bgsound cep="1"><span style="color: #008080;"> 1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""><span style="color: #0000ff;">class</span><span style="color: #000000;"> A(object):<br></span><span style="color: #008080;"> 2</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #800080;">__metaclass__</span> <span style="color: #000000;">=</span><span style="color: #000000;"> pyaop<br></span><span style="color: #008080;"> 3</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> foo(self):<br></span><span style="color: #008080;"> 4</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> total </span><span style="color: #000000;">=</span><span style="color: #000000;"> 0<br></span><span style="color: #008080;"> 5</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> i </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> range(</span><span style="color: #000000;">100000</span><span style="color: #000000;">):<br></span><span style="color: #008080;"> 6</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> total </span><span style="color: #000000;">=</span><span style="color: #000000;"> total</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;"><br></span><span style="color: #008080;"> 7</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">print</span><span style="color: #000000;"> total<br></span><span style="color: #008080;"> 8</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""><br></span><span style="color: #008080;"> 9</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> foo2(self):<br></span><span style="color: #008080;">10</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">from</span><span style="color: #000000;"> time </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> sleep<br></span><span style="color: #008080;">11</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> total </span><span style="color: #000000;">=</span><span style="color: #000000;"> 0<br></span><span style="color: #008080;">12</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> i </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> range(</span><span style="color: #000000;">100000</span><span style="color: #000000;">):<br></span><span style="color: #008080;">13</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> total </span><span style="color: #000000;">=</span><span style="color: #000000;"> total</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;"><br></span><span style="color: #008080;">14</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> sleep(</span><span style="color: #000000;">0.0001</span><span style="color: #000000;">)<br></span><span style="color: #008080;">15</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">print</span><span style="color: #000000;"> total</span></bgsound>
最后我们只需要:
<bgsound cep="2"><span style="color: #008080;"> 1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""><span style="color: #0000ff;">def</span><span style="color: #000000;"> beforep(self):<br></span><span style="color: #008080;"> 2</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(</span><span style="color: #800000;">'</span><span style="color: #800000;">before</span><span style="color: #800000;">'</span><span style="color: #000000;">)<br></span><span style="color: #008080;"> 3</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""></span><span style="color: #0000ff;">def</span><span style="color: #000000;"> afterp(self):<br></span><span style="color: #008080;"> 4</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(</span><span style="color: #800000;">'</span><span style="color: #800000;">after</span><span style="color: #800000;">'</span><span style="color: #000000;">)<br></span><span style="color: #008080;"> 5</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""><br></span><span style="color: #008080;"> 6</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""></span><span style="color: #0000ff;">if</span> <span style="color: #800080;">__name__</span> <span style="color: #000000;">==</span> <span style="color: #800000;">"</span><span style="color: #800000;">__main__</span><span style="color: #800000;">"</span><span style="color: #000000;">:<br></span><span style="color: #008080;"> 7</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> pyaop.setbefore(beforep)<br></span><span style="color: #008080;"> 8</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> pyaop.setafter(afterp)<br></span><span style="color: #008080;"> 9</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> a</span><span style="color: #000000;">=</span><span style="color: #000000;">A()<br></span><span style="color: #008080;">10</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> a.foo()<br></span><span style="color: #008080;">11</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""> a.foo2()</span></bgsound>
这样子在执行代码的时候就得到了如下结果
before
100000
after
before
100000
after
这段代码耗时一天才调通(汗颜),是基于园里另外一贴 http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483056.html
并感谢python讨论群69828975里的大虾Seewind(310380)给予的无私帮助
欢迎各位python大牛给予斧正
发表评论
-
关于ORM和内存数据库的遐想
2007-01-23 13:21 534最近有消息说韩国电信 ... -
继续ORM-欧德巴赫猜想-Mapping
2007-01-23 14:34 631最近从项目组单离出来开始在公司实施过程化管理,整个QA Off ... -
剑走偏锋,小心走火入魔
2007-01-23 15:07 674这是很久前写好的文字,闲得无聊就发上来,几个月前的感想,上午一 ... -
手把手教你写ORM(三)
2007-01-24 11:50 573昨天处于晕死状态,少写了一个组件,还需要一个组件用来专门管理C ... -
手把手教你写ORM(四)
2007-01-24 13:51 596现在中午不睡一会儿就头晕。前一篇有人留言说为什么不写web.c ... -
手把手教你写ORM(五)
2007-01-24 15:29 571CMMI是魔鬼继续上面的内容,这里我们要实现一个插件的结构来动 ... -
谈谈我们的学习和我们的Blog
2007-01-24 20:07 364第一,学习编程是一个很枯燥的过程,所以我们更要讲究效率(要把有 ... -
手把手教你写代码生成器(也算ORM的续)
2007-01-25 11:45 671因为ORM还是需要配置,还是需要EntityObject,所以 ... -
粒度细到控件的权限管理系统的设计(概要篇)
2007-01-25 21:40 1023其实这个设计是已经做过了,那个时候我才进公司还在试用期,给我的 ... -
粒度细到控件的权限管理组件(构想篇)
2007-01-26 10:34 710说老实话我现在还没开 ... -
手把手教你写ORM大全篇
2007-01-26 19:36 636根据dudu boss的建议将本系列作一个归纳,下一个系列正在 ... -
架构设计的非侵入性原则
2007-01-27 00:41 656最近常常看到JAVA社区热 ... -
手把手教你可复用SSO组件的设计(原理篇)
2007-01-27 14:55 726在结构设计上复用性 ... -
对《万事欠备设计先行》的一点想法,兼谈XP和CMMI
2007-01-29 09:31 606周末陪女友,故沉默了,其实大脑并没有沉默,之前看到《万事欠备设 ... -
手把手教你可复用的SSO组件设计(设计篇)
2007-01-29 16:24 553周末陪女朋友去了,没写,告罪,上班后急忙补上。 这里说到了可复 ... -
手把手教你可复用的SSO组件设计(实现篇)
2007-01-29 22:30 572费了一夜的功夫写完这些代码,有些凌乱,望见谅。 首先是对加密解 ... -
玩具级嵌入式内存对象数据库^V^
2007-02-01 19:46 458纯粹是为了好玩:} 最近几天很忙所以写得少了,昨天在清理硬盘的 ... -
差之毫厘谬以千里-计算中的精度问题
2007-02-27 10:04 547如果你只是i++来作计数 ... -
动态语言,涅磐重生还是死路一条?
2007-03-06 10:31 540最近花时间一直在看python和ruby,为了在Web应用又看 ... -
ASP.NET's MVC is what a joke!
2007-03-08 13:43 455很早前还在毁人不倦的 ...
相关推荐
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
AOP面向切面编程(Aspect Oriented Programming),是通过预编译方式和运行期动态代理实现程序功能的统一...下面这篇文章主要给大家介绍了关于利用C#实现AOP常见的几种方法,需要的朋友可以参考借鉴,下面来一起看看吧。
使用Spring的注解方式实现AOP的细节
.net平台AOP的实现 .net平台AOP的实现 .net平台AOP的实现 .net平台AOP的实现 .net平台AOP的实现
在Xml配置AOP有两种实现方式:一、基于代理实现AOP切面编程;二、通过自动代理实现AOP切面编程
在net core2.2时,我当时就尝试过用autofac实现aop,但这次我不想用autofac,我用了一个更轻量级的框架,AspectCore。 用起来非常非常的简单,但一开始还是走了一点弯路,主要是网上都是net core3以下的教程,3以下...
注解方式实现AOP编程
JavaEE spring自动实现AOP代理
动态代理实现AOP机制,动态代理实现AOP机制,动态代理实现AOP机制,动态代理实现AOP机制
AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理
C# 实现的AOP框架 转载,高手写的。
Xml文件配置实现AOP通知
Spring通过注解实现AOP,Spring通过注解实现AOP,Spring通过注解实现AOPSpring通过注解实现AOP,Spring通过注解实现AOP,Spring通过注解实现AOP
在AOP注解中一共分为五中类型的通知注解,接下来,我们通过实例,对这五种AOP注解进行讲解
对Observer模式的实现,引入后可直接使用。 包括传统实现和遵循AOP思想的实现
Spring AOP实现方法之一:CGLIB 实现AOP功能
详细介绍了AOP的核心功能(拦截功能)在底层是如何实现的;介绍了两种实现AOP的动态代理:jdk动态代理和cglib动态代理,并详细描述了它们在代码层面的实现。附有必须的cglib.jar和asm.jar
目前整个开发社区对AOP(Aspect Oriented Programing)推崇备至,也涌现出大量支持AOP的优秀Framework,--Spring, JAC, Jboss AOP 等等。AOP似乎一时之间成了潮流。Java初学者不禁要发出感慨,OOP还没有学通呢,又来AOP...
AOP+Sample 实现AOP的一个例子