首先还是引入一段对AOP的解释。
AOP(Aspect-Oriented Programming)其实是OOP(Object-Oriented Programing) 思想的补充和完善。我们知道,OOP引进"抽象"、"封装"、"继承"、"多态"等概念,对万事万物进行抽象和封装,来建立一种对象的层次结构,它强调了一种完整事物的自上而下的关系。但是具体细粒度到每个事物内部的情况,OOP就显得无能为力了。比如日志功能。日志代码往往水平地散布在所有对象层次当中,却与它所散布到的对象的核心功能毫无关系。对于其他很多类似功能,如事务管理、权限控制等也是如此。这导致了大量代码的重复,而不利于各个模块的重用。 而AOP技术则恰恰相反,它利用一种称为"横切"的技术,能够剖解开封装的对象内部,并将那些影响了多个类并且与具体业务无关的公共行为 封装成一个独立的模块(称为切面)。更重要的是,它又能以巧夺天功的妙手将这些剖开的切面复原,不留痕迹的融入核心业务逻辑中。这样,对于日后横切功能的编辑和重用都能够带来极大的方便。
AOP技术的具体实现,无非也就是通过动态代理技术或者是在程序编译期间进行静态的"织入"方式。下面是这方面技术的几个基本术语:
1、join point(连接点):是程序执行中的一个精确执行点,例如类中的一个方法。它是一个抽象的概念,在实现AOP时,并不需要去定义一个join point。
2、point cut(切入点):本质上是一个捕获连接点的结构。在AOP中,可以定义一个point cut,来捕获相关方法的调用。
3、advice(通知):是point cut的执行代码,是执行“方面”的具体逻辑。
4、aspect(切面):point cut和advice结合起来就是aspect,它类似于OOP中定义的一个类,但它代表的更多是对象间横向的关系。
AOP基础知识在这样就不一一说明,主要是记录一下在使用测试用例过程中的几个问题。
以下将几个基础代码贴出来。
首先,在POM文件中增加Spring AOP要的依赖
新建一个接口Performance
新增实现类DanceImpl:
实现切面类Audience:
Spring配置文件的配置信息:
重点记录是在初次体检过程中遇到如下问题:
1.通过Autowired加载的是实体类时,测试出错,错误信息如下:
Unsatisfied dependency expressed through field 'danceImpl'; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'danceImpl' is expected to be of type 'com.linghan.aop.DanceImpl' but was actually of type 'com.sun.proxy.$Proxy27'
原因在于Spring AOP代理时出现了混乱,解决办法有两种:
1)修改配置文件,指定proxy-target-class为true
2)修改Autowired的对象为接口,此时proxy-target-class的值为true,false都可以











网友评论