没有接触AOP之前,对AOP(Aspect Oriented Programming)的了解只限于听说过,具体是什么不是很清楚,由于工作的原因有一次需要实现日志记录的功能,同事有使用AspectJ实现,当时好奇就按着同事的代码抄了一遍,可以运行,使有魔性,但,还是不理解,昨天看了一天的AspectJ的东东,有官方的文档、也有网络上的博文终于明白Spring AOP和AspectJ是两个东东。
Spring AOP的实现有用到AspectJ定义的一些类、接口、注解等,但实现方式与AspectJ完全不同。
AspectJ定义了自己的语法、语义,需要经过自已的编译器编译成Java字节码,在编译时会将Aspect的代码织入到你需要增强的类的方法的代码中,编译好的代码就是最终的代码。
Spring AOP是在运行时,使用动态代理的方式进行织入,而且只能对Spring代码的bean可以使用,对未代码的类不能使用。
之前的一家公司自己写的一个框架,使用反射有实现与面向切面编程类似的功能,框架的实现在配置文件中定义一系统文件,文件的内容描述了一个流程,框架起动后读取这些流程配置文件,在接到请求时,按照业务code查找应该执行哪一个流程,在执行流程时有根据每一步的返回结果转入不同的处理分支中去,根据上一个流程的返回结果从配置文件中读取到下一步应该执行的类及方法,然后使用反射的方式执行相应的方法,在每一步执行开始和结束都有记录相应的日志。