A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冯超 高级黑马   /  2014-4-11 14:34  /  881 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

                                                                                                         Spring中的AOP
AOP:aspect origin program 面向切面编程
Spring为什么要AOP?
        N个业务组件,每个组件有M个方法,一共有N*M个方法

若需要为每一个方法都增加一个“通用功能”,例如:事物处理,日志,权限控制...

AOP(aspect orient program):在保证程序员不修改方法A,方法B,方法C。。。的前提下,可以为
方法A,方法B,方法C。。。增加通用方法处理。
本质:依然在去修改方法A,方法B,方法c--只是这个修改由AOP框架完成。


Spring AOP的配置
  1.指定的目标方法哪里插入(after,before,around)
  2.通过execution表达式指定哪些方法执行插入
  3.指定插入怎样的一段代码

根据以上这三部,来如何简单使用AOP。

例如在
com.feng.test 包下邮如下两个类:

  1. package com.feng.test;

  2. public class Method1 {
  3.         public void fun1() {
  4.                 System.out.println("Method1" + "1111111111111111");
  5.         }
  6.         public void fun11() {
  7.                 System.out.println("Method11111111" + "1111111111111111");
  8.         }
  9. }
复制代码
  1. package com.feng.test;

  2. public class Method2 {
  3.         public void fun2() {
  4.                 System.out.println("method2" + "22222222222222");
  5.         }
  6. }
复制代码

如果在不修改源码的基础上,为这两个类增加一个方法,该如何做到了?
beans.xml配置如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans
  3.         xmlns="http://www.springframework.org/schema/beans"
  4.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5.         xmlns:aop="http://www.springframework.org/schema/aop"
  6.         xsi:schemaLocation="http://www.springframework.org/schema/beans
  7.                 http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
  8.                 http://www.springframework.org/schema/aop
  9.                 http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
  10.                 http://www.springframework.org/schema/tx
  11.                 http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
  12.        
  13.        

  14.         <bean id="me1" class="com.feng.test.Method1" />
  15.         <bean id="me2" class="com.feng.test.Method2" />
  16.        
  17.         <!-- 定义切面类 -->
  18.         <bean id="aspect_autho" class="com.feng.aspect.Autho" />
  19.         <aop:config>
  20.             <!-- aspect把普通的类转换为 切面 -->
  21.             <aop:aspect ref="aspect_autho">
  22.                 <!-- 有before after等 -->
  23.                 <!-- 包名下的所有类所有方法参数不限 -->
  24.                 <!-- method表示切面的方法 -->
  25.                 <aop:before method="fun"
  26.                     pointcut="execution(* com.feng.test.*.*(..))"/>
  27.             </aop:aspect>
  28.         </aop:config>
  29. </beans>
复制代码

这个过程就交给Spring完成了。aop配置的意思就是在com.feng.test下的所有类,所有方法,参数不限下,为每个方法前增加了一个fun方法(fun方法是增加增加的一个通用类中的方法)。
测试如下:
  1. package com.feng.test;

  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;

  4. public class Test {

  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub
  7.         /*        Method1 m1 = new Method1();
  8.                 Method2 m2 = new Method2();
  9.                
  10.                 m1.fun1();
  11.                 m2.fun2();*/
  12.                
  13.                 ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
  14.                
  15.                 System.out.println(ctx);
  16.                 Method1 m1 = (Method1) ctx.getBean("me1");
  17.                 Method2 m2 = (Method2) ctx.getBean("me2");
  18.                
  19.                
  20.                 m1.fun1();
  21.                 m1.fun11();
  22.                
  23.                 System.out.println("----------------------");
  24.                 m2.fun2();
  25.         }


  26. }
复制代码

切面类如下:
  1. package com.feng.aspect;

  2. public class Autho {
  3.         public void fun() {
  4.                 System.out.println("正在模拟 AOP");
  5.         }
  6. }
复制代码

显示结果如下:
正在模拟 AOP
Method11111111111111111
正在模拟 AOP
Method111111111111111111111111
----------------------
正在模拟 AOP
method222222222222222


更多细节 自己还不是很懂!!! 只是学的学的东西很多,用到的时候就深究吧!

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马