spring 的AOP

来源:互联网 发布:施耐庵子孙 哑巴 知乎 编辑:程序博客网 时间:2024/06/16 21:55

AOP 面向切面编程,作为面向对象编程的一种补充,已经成为一种比较成熟的编程方式。

AOP和OOP互为补充,面向对象编程将程序分解成各个层次的对象,而面向切面编程将程序运行过程分解成各个切面。可以这样理解:面向对象编程是从静态角度考虑程序结构,而面向切面编程则是从动态角度考虑程序运行过程。

假如三个类共用三个方法时,如果需要修改方法中的内容时,只需要修改方法的内容即可。通过这种方式,大大降低了软件后期维护的复杂度。

这样做能够解决大部分的应用场景,但程序希望实现更好的解耦,希望三个类中的三个方法彻底与方法分离。应该如何解决。这就需要用到切面编程。只需要实现新的方法,无需三个类中显示调用新方法,系统会自动在三个类中调用这个新方法。


javaee应用中,常常通过aop来处理一些具有横切性质的系统服务,如事物管理,安全检查,缓存,对象池管理等。

使用AspectJ实现AOP:

1 安装AspectJ : 在cmd窗口中使用命令进行安装:

                         java -jar xxxx(aspectj包名) ,之后就下一步。

2 AspectJ使用入门:

   bin:该路径下存放了aj、aj5 、ajc、ajdoc、ajbrowser等命令,其中ajc是最常用的,它的作用类似于javac,用于对普通的java类进行编译时增强。

  docs:该路径存放了AspectJ的使用说明,参考手册,api文档

  lib:该路径下的4个jar文件时AspectJ的核心类。


具体实现:

Hello.java

public class Hello{public void foo(){System.out.println("执行hello组件的foo()方法");}public int addUser(String name,String pass){System.out.println("执行hello组件的addUser添加用户:"+name);return 20;}}
World.java

public class World{public void bar(){System.out.println("执行world组件的bar()方法");}}

测试类AspectJTest.java

public class AspectJTest{public static void main(String[] args){Hello hello = new Hello();hello.foo();hello.addUser("孙悟空","7788");World world = new World();world.bar();}}
使用javac进行编译:

添加一个特殊的类:AuthAspect.java

public aspect AuthAspect{before():execution(* *.*(..)){System.out.println("模拟进行权限检查");}}

LogAspect.java

public aspect LogAspect{pointcut logPointcut():execution(* *.*(..));after():logPointcut(){System.out.println("模拟记录日志。。。");}}

使用命令运行程序,显示结果为:


这就是使用aop实现的。在没有修改方法,类中的方法中的任何信息,就给类添加新的方法。




0 0