Spring AOP編程(兩種:1,傳統的AOP切面編程 2,基於aspectj框架切點傳統開發)
第一種,Spring傳統AOP編程開發
在傳統的spring aop中有5種對類中方法的增強
1,前置通知 在目標方法之前來執行對類中方法的增強
2,後置通知 在目標方法執行之後來執行方法增強
3,環繞通知 在目標方法執行前後拋出方法的增強
4,異常拋出通知在發生異常的時候拋出對方法的增強
5,引介通知 在目標類中添加一些新的方法或屬性,開發中不常用
Spring傳統AOP的實現流程
1,創建通知類
2,配置文件
<!-- 目標target -->
<bean id="aoptest01"class="cmo.demo.aop.OrderService"></bean>
<!-- 通知advice -->
<bean id="aopadvice"class="cmo.demo.aop.AOPAdvice"></bean>
<!-- 定義切點,用兩種方式 -->
<!-- 第一種,用對應方法名來操作 -->
<bean id="aopOpthin"class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedNames">
<list>
<value>addTest</value>
<value>updateTest</value>
</list>
</property>
</bean>
<!-- 第二種,用表達式來限制方法的操作 -->
<!-- <beanid="aopOpthin" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<propertyname="pattern" value=".*Test"></property>
</bean>
-->
<!-- 定義切面,切點+通知 -->
<bean id="PointCut"class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice"ref="aopadvice"></property>
<property name="pointcut"ref="aopOpthin"></property>
</bean>
<!-- 代理動態proxy,目標對象,切面,代理對象-->
<bean id="proxy"class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target"ref="aoptest01"></property>
<property name="interceptorNames"value="PointCut"></property>
<property name="proxyInterfaces"value="cmo.demo.aop.IOrderService"></property>
</bean>
</beans>
重點注意:生成動態標籤中的id,要設置成和test測試類的,通 @Autowired
@Qualifier("proxy")
public IOrderService orderService;
來使用代理對象
關於切點表達式寫法
1. execution(public * *()) 所有的public的方法
2. execution(*cn.itheima.aop.*(..)) 所有的aop包下的所有類的方法(不包含子包)
3. execution(*cn.itheima.aop..*(..)) 所有的aop包及其子包下的所有類的方法
4. execution(*cn.itheima.aop.IOrderService.*(..)) IOrderService接口中定義的所有方法
5. execution(*cn.itheima.aop.IOrderService+.*(..)) 匹配實現特定接口所有類的方法
6. execution(*save*(..)) 區配所有的以save開頭的方法