1.1、
Aop, aspect object programming 面向切面編程
功能: 讓關注點代碼與業務代碼分離!
關注點,
重復代碼就叫做關注點;
切面,
關注點形成的類,就叫切面(類)!
面向切面編程,就是指 對很多功能都有的重復的代碼抽取,再在運行的時候往業務方法上動態植入“切面類代碼”。
切入點,
執行目標對象方法,動態植入切面代碼。
可以通過切入點表達式,指定攔截哪些類的哪些方法; 給指定的類在運行的時候植入切面類代碼。
代碼示例如下:
UserDao 目標對象
package com.murong.aop; import org.springframework.stereotype.Component; /** * 目標對象 */ @Component // 加入IOC容器 public class UserDao { public void save() { System.out.println("-----核心業務:保存!!!------"); } }
Aop 切面類
package com.murong.aop; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; /** *切面類 */ @Component // 加入IOC容器 @Aspect public class Aop { @Pointcut("execution(* com.murong.aop.UserDao.*(..))")//切入點 public void testPointCut(){ } @Before("testPointCut()") public void begin() { System.out.println("事務開啟123"); }//關注點代碼 @After("testPointCut()") public void end() { System.out.println("事務結束456"); }//關注點代碼 }
ApplicationContext sping配置文件
<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" 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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd" default-autowire="byType"> <!-- 開啟注解掃描 --> <context:component-scan base-package="com.murong.aop"></context:component-scan> <!--開啟注解掃描--> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>
App 測試類
package com.murong.aop; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App { private ApplicationContext ac = new ClassPathXmlApplicationContext("com/murong/aop/applicationContext"); @Test public void test() { UserDao dao = (UserDao) ac.getBean("userDao"); dao.save(); } }
使用總結:
步驟:
1) 先引入aop相關jar文件 (aspectj aop優秀組件)
spring-aop-3.2.5.RELEASE.jar 【以spring3.2版本jar為例】
aopalliance.jar 【spring2.5源碼/lib/aopalliance】
aspectjweaver.jar 【spring2.5源碼/lib/aspectj】或【aspectj-1.8.2\lib】
aspectjrt.jar 【spring2.5源碼/lib/aspectj】或【aspectj-1.8.2\lib】
注意: 用到spring2.5版本的jar文件,如果用jdk1.7可能會有問題。
需要升級aspectj組件,即使用aspectj-1.8.2版本中提供jar文件提供。
2) bean.xml中引入aop名稱空間(文件頭引入)
3) 開啟aop注解
如上圖。
4) 使用注解
@Aspect 指定一個類為切面類
@Pointcut("execution(* cn.itcast.e_aop_anno.*.*(..))") 指定切入點表達式
@Before("pointCut_()") 前置通知: 目標方法之前執行
@After("pointCut_()") 后置通知:目標方法之后執行(始終執行)
@AfterReturning("pointCut_()") 返回后通知: 執行方法結束前執行(異常不執行)
@AfterThrowing("pointCut_()") 異常通知: 出現異常時候執行
@Around("pointCut_()") 環繞通知: 環繞目標方法執行