一、什么是AOP
AOP是面向切面的编程,其编程思想是把散布于不同业务但功能相同的代码从业务逻辑中抽取出来,封装成独立的功能模块,这此独立的模块被称为切面(Aspect),切面 的具体功能方法被称为关注点。在业务逻辑执行过程中,AOP会把分离出来 的切面 和关注点动态切入到业务流程中,这样做的好处是提高了功能代码的重用性和可维护性。
二、相关专业述语
- Aspect
表示切面。切入业务流程的一个独立的功能模块。 - Joint point
表示链接点。也就是业务流程在运行过程中需要插入切面的具体位置。 - Advice
表示通知。是切面的具体实现方法。可分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)和环绕通知(Around)五种。实现方法具体属于哪 类通知,是在配置文件和注解中指定的。 - Pointcut
表示切入点。用于定义通知应该切入到哪些连接点上,不同的通知通常需要切入到不同的连接点上。 - Target
表示目标对象。被 一个或者多个切面所通知的对象。 - Proxy
表示代理对象。将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象为目标对象的业务逻辑功能加上被 切入的切面所形成的对象。 - Weaving
表示切入,也称为织入。将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译期、类装载期及运行期。
三、如何创建切面
切面其实就是业务逻辑模块中使用到的具有相同功能的程序的抽取出来形成的功能模块。如:把校长给老师发送课程邮件时需要对老师身份进行验证,我们就可以把这个验证的功能抽出来,形成切面。
四、如何把切面切入到业务逻辑中实现相应的功能
1.选择连接点,即在业务逻辑中选择一个位置作为切面的切入点。如:上述的发送邮件业务,可以把setTeacher方法之前定义为连接点。
2.编写配置文件xxx.xml。
<bean id="VerfyUserAspect" class="com.milihua.springprogram.aspect.VerifyUser" />
<aop:aspectj-autoproxy proxy-target-class="true" />
<aop:config>
<aop:aspect id="verify" ref="VerifyUserAspect">
<aop:pointcut id="verfyuser" expression="execution(* com.milihua.springprogram.notice.AopEmailNotice.setTeacher(..)) and args (teacher)" />
<aop:before pointcut-ref="verfyuser" method="beforeAdivce" arg-names="teacher" />
</aop:aspect>
</aop:config>
配置文件中需要引用AOP命名空间,否则会报错。
<aop:aspectj-autoproxy proxy-target-class=“true” />
这个用于设定代理切入类是基于接口还是基于类。如果proxy-target-class的值是true即为基于类创建的,否则是基于接口的。
切点表达式如下:
execution(* com.milihua.springprogram.notice.AopEmailNotice.setTeacher(…))
表示切入点为AopEmailNotice的setTeacher方法。其中号表示 切入 点为任意的返回类型,(…)表示 任意的参数。
再如:
execution( com.milihua.springprogram.notice….(…))
表示切点为com.milihua.springprogram.notice包及子包下所有类及所有的方法。
又如:
execution(* com.milihua.springprogram.notice..(…))
表示切入点为com.milihua.springprogram.notice包下所有的类及类中所有方法。
五、需要使用到的jar包
- spring-aop-xxx.RELEASE
- spring-aspects-xxx.RELEASE
- aspectjrt
- aspectjweaver