关于AOP
AOP的核心思想
就是“将应用程序中的业务逻辑同对其提供支持的通用服务功能进行分离,而业务逻辑与通用服务功能之间通过配置信息,实现整合”
涉及的主要概念:
1、Aspect(“切面”或称为“方面”)
2、Joinpoint(连接点)
3、 Pointcut(切入点)
4、 Advice(通知)
5、 Target(目标对象)
6、 AOP Proxy(AOP代理)
7、 Weave(织入)
8、拦截机(Interceptor)
在原业务流程需要的位置“插入”所需要执行的功能方法,即动态的根据需要插入“某方法”运行,完成所要求得附加功能。这就是AOP的基本思想。
第一部分,采用传统的设计思想与方法(OOP技术)。
第二部分,采用AOP技术,然后将两部分织入整合即可。
导入AOP所需要的jar包
在工程目录下,建立目录lib,将所需要的Jar包复制到lib下,并利用Eclipse中的bliudpath命令,将其部署到classpath路径下。
要导入的包有:
commons-logging-1.1.1.jar:日志处理包
spring-aop-4.1.6.RELEASE.jar :Spring AOP包
spring-aspects-4.1.6.RELEASE.jar:Spring 切面包
spring-beans-4.1.6.RELEASE.jar :Spring Bean管理包
spring-context-4.1.6.RELEASE.jar :Spring 注释等上下相关包
spring-core-4.1.6.RELEASE.jar :Spring 核心容器包
spring-expression-4.1.6.RELEASE.jar:Spring表达式包
还要配置bean.xml
我配置的一个实例
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<aop:config>
<aop:aspect id="TestAspect" ref="aspectBean"> <!-- 引用的切面类 -->
<!--配置service包下所有类或接口的所有方法-->
<aop:pointcut id="businessService" expression="execution(* service.*.*(..))" /> <!-- 通过表达式,指明操作的范围 -->
<aop:around pointcut-ref="businessService" method="doAround"/>
<aop:before pointcut-ref="businessService" method="doBefore"/>
<aop:after pointcut-ref="businessService" method="doAfter"/>
<aop:after-throwing pointcut-ref="businessService" method="doThrowing" throwing="ex"/>
<aop:after-returning pointcut-ref="businessService" method="doAfterReturning" returning="result"/>
</aop:aspect>
</aop:config>
<bean id="aspectBean" class="aop.TestAspect" />
<bean id="aService" class="service.AServiceImpl"></bean>
<bean id="bService" class="service.BServiceImpl"></bean>
</beans>
注意切入点
(1)execution(* com.edu.spring.ArithmeticCalculator.*(..))
表示匹配ArithmeticCalculator中声明的所有方法。第一个“*”代表任意修饰符及任意返回值,第二个“*”代表任意方法,“..”匹配任意数量的参数,“com.edu.spring.ArithmeticCalculator”指明目标方法所在的包路径,若目标类(接口)与该切面在同一个包中,可省略包名,直接给出类(接口)名称即可。
(2)execution public(* ArithmeticCalculator.*(..))
表示匹配ArithmeticCalculator接口的所有公有方法。
(3)execution(public double ArithmeticCalculator.*(..))
表示匹配ArithmeticCalculator中返回double类型数值的方法。
(4)execution(public double ArithmeticCalculator.*(double, ..))
表示匹配第一个参数为double类型的方法,“..”匹配任意数量任意类型的参数
(5)execution(public double ArithmeticCalculator.*(double, double))
表示匹配参数类型为(double,double)类型的方法.