Spring 源码分析(九)--AOP

论坛 期权论坛     
选择匿名的用户   2021-5-30 02:14   577   0
<div class="blogpost-body" id="cnblogs_post_body">
<p>    我们知道,使用面向对象编程(OOP)有一些弊端,当需要为多个不具有继承关系的对象引入同一个公共行为时,例如日志,安全检测等,我们只有在每个对象里引用公共行为,这样程序中就产生了大量的重复代码,程序就不便于维护了,<span style="color:#ff0000;">所以就有了一个对面向对象编程的补充,即面向方面编程(AOP)</span>,AOP所关注的方向是横向的,不同于OOP的纵向。</p>
<p>   <span style="color:#ff0000;"> Spring 2.0 采用&#64;AspectJ注解对POJO进行标注,从而定义一个包含切点信息和增强横切逻辑的切面。Spring2.0可以将这个切面织入到匹配的目标Bean中。&#64;AspectJ注解使用AspectJ切点表达式语法进行切点定义,可以通过切点函数,运算符,通配符等高级功能进行切点定义,拥有强大的连接点描述能力。</span></p>
<p><span style="font-size:18pt;">一:动态AOP使用示例</span></p>
<p>(1)创建用于拦截的bean</p>
<p>    在实际工作中,此bean可能是满足业务需要的核心逻辑,例如test方法可能会封装这某个核心业务,但是,如果我们想在test前后加入日志来跟踪调试,如果直接修改源码并不符合面向对象的设计方法,而且随意修改原有代码也会造成一定的风险,还好接下来的Spring帮我们做到了这一点。</p>
<p> </p>
<div class="cnblogs_code">
  <pre class="blockcode"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span><span style="color:#000000;"> TestBean {
    </span><span style="color:#0000ff;">private</span> String testStr &#61; &#34;testStr&#34;<span style="color:#000000;">;

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> String getTestStr() {
        </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> testStr;
    }

    </span><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">void</span><span style="color:#000000;"> setTestStr(String testStr) {
        </span><span style="color:#0000ff;">this</span>.testStr &#61;<span style="color:#000000;"> testStr;
    }

    </span><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">void</span><span style="color:#000000;"> test(){
        System.out.println(</span>&#34;test&#34;<span style="color:#000000;">);
    }
}</span></pre>
</div>
<p> </p>
<p>(2)创建Advisor。</p>
<p>    Spring中摒弃了最原始的繁杂配置方式而采用&#64;AspectJ注解对POJO进行标注,使AOP的工作大大简化,例如,在AspectJTest类中,我们要做的就是在所有类的test方法执行前在控制台中打印beforeTest,而在所有类的test方法执行后打印afterTest,同时又使用环绕的方式在所有类的方法执行前后再次分别打印before1和after1。</p>
<div class="cnblogs_code">
  <pre class="blockcode"><span style="color:#000000;">&#64;Aspect
</span><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span><span style="color:#000000;"> AspectJTest {

    &#64;Pointcut(</span>&#34;execution(* *.test(..))&#34;<span style="color:#000000;">)
    </span><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">void</span><span style="color:#000000;"> test(){

    }

    &#64;Before(</span>&#34;test()&#34;<span style="color:#000000;">)
    </span><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">void</span><span style="color:#000000;"> beforeTest(){
        System.out.println(</span>&#34;beforeTest&#34;<span style="color:#000000;">);
    }

    &#64;After(</span>&#34;test()&#34;<span style="color:#000000;">)
    </span><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">void</span><span style="color:#000000;"> afterTest(){
        System.out.println(</span>&#34;afterTest&#34;<span style="color:#000000;">);
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> Object arountTest(ProceedingJoinPoint p){
        System.out.println(</span>&#34;before1&#34;<span style="color:#000000;">);
        Object obj </span>&#61; <span style="color:#0000ff;">null</span><span style="color:#000000;">;
        </span><span style="color:#0000ff;">try</span><span style="color:#000000;">{
            obj </span>&#61;<span style="color:#000000;"> p.proceed();
        }</span><span style="color:#0000ff;">catch</span><span style="color:#000000;"> (Throwable e){
            e.printStackTrace();
        }
        System.out.println(</span>&#34;after1&#34;<span style="color:#000000;">);
        </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> obj;
    }
}</span></pre>
</div>
<p> </p>
<p>(3)创建配置文件</p>
<p>    尽管注解可以取代XML配置,但是本文还是通过XML配置来开启AOP功能,做更详细的讲解,这样有助于理解。</p>
<div class="cnblogs_code">
  <pre class="blockcode"><span style="color:#0000ff;">&lt;?</span><span style="color:#ff00ff;">xml version&#61;&#34;1.0&#3
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP