AOP(Aspect Oriented Programming)面向切面编程
-
可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术,实现横切关注点(如日志、安全、缓存和事务管理)与他们所影响的对象之间的解耦。
-
AOP在spring的三种配置方式
1.XML:自动代理
<!--被代理对象(target)-->
<bean id="orderServiceTarget" class="com.apesource.service.Impl.OrderServiceImpl"/>
<!--通知(Advice)-->
<bean id="logAdviceBean" class="com.apesource.advice.LogAdvice"/>
<bean id="PerformanceAdviceBean" class="com.apesource.advice.PerformanceAdvice"/>
<!--切入点:通过正则表达式描述指定切入点(某些指定方法)-->
<bean id="createMethodPointcutBean" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<!--注入正则表达式:描述哪些方法为切入点-->
<property name="pattern" value=".*creat.*"/>
</bean>
<!--Advisor(高级通知)=Advice(通知)+Pointcut(切入点)-->
<bean id="performanceAdvisorBean" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<!--注入切入点-->
<property name="pointcut" ref="createMethodPointcutBean"/>
<!--注入通知-->
<property name="advice" ref="PerformanceAdviceBean"/>
</bean>
<!--自动代理创建-->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!--Bean名称规则(数组):指定哪些bean创建自动代理-->
<property name="beanNames">
<list>
<value>*ServiceTarget</value>
</list>
</property>
<!--通知列表:需要执行哪些通知-->
<property name="interceptorNames">
<list>
<value>performanceAdvisorBean</value>
<value>logAdviceBean</value>
</list>
</property>
</bean>
2.AspectJ:在类中自定义通知,在xml文件中配置切面
<!--业务组件bean-->
<bean id="orderServiceBean" class="com.apesource.service.Impl.OrderServiceImpl"/>
<!--日志Aspect切面-->
<bean id="logAspectBean" class="com.apesource.advice.LogAspect"/>
<!--使用Aspect实现切面,使用Spring AOP进行配置-->
<aop:config>
<!--配置切面-->
<!--注入切面bean-->
<aop:aspect ref="logAspectBean">
<!--定义Pointcut:通过expression表达式,来查找特定的方法(pointcut)-->
<aop:pointcut id="serviceMethodPointcut" expression="execution(* com.apesource.service.Impl.*.creat*(..) )"/>
<!--配置“前置通知”-->
<!--在Pointcut切入点()查找到的方法执行“前”,执行当前logAspectBean的doBefore-->
<aop:before method="beforeAdvice" pointcut-ref="serviceMethodPointcut"/>
<!--配置“后置通知”-->
<!--returning属性:配置当前方法中用来接收返回值的参数名-->
<aop:after-returning returning="returnVal" method="afterReturningAdvice" pointcut-ref="serviceMethodPointcut"/>
<aop:after method="afterAdvice" pointcut-ref="serviceMethodPointcut"/>
<!--配置“异常通知”-->
<!--throwing属性:配置当前方法中用来接收当前异常的参数名-->
<aop:after-throwing throwing="ex" method="throwingAdvice" pointcut-ref="serviceMethodPointcut"/>
<!--配置环绕通知-->
<aop:around method="aroundAdvice" pointcut-ref="serviceMethodPointcut"/>
</aop:aspect>
</aop:config>
3.注解:xml文件中配置自动扫描器和AspectJ的自动代理,在自定义的通知前加注解
<!--自动扫描器-->
<context:component-scan base-package="com.apesource"/>
<!--配置AspectJ的自动代理-->
<aop:aspectj-autoproxy/>
@Aspect()//标注当前类为切面类
@Before()//前置通知
@AfterReturning()//后置通知(有返回值)
@After()//后置通知
@AfterThrowing()//异常通知
@Around()//环绕通知