Spring學習筆記02(AOP)
阿新 • • 發佈:2018-12-27
學了IOC之後,緊跟著就是AOP(面向切面程式設計)
來個官方一點的,面向切面程式設計,是通過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。
簡單舉個例子來說,我們通過java程式碼對資料庫進行增刪改操作的時候,需要對事務進行控制,我們阻止事務的自動提交,事務成功後手動提交以及失敗後回滾事務的一系列操作是必須的,這樣就需要做大量重複的工作,而AOP就可以幫助我們解決這個問題。簡單的程式碼描述一下這個過程(Spring)。
//介面
inteface UserService{
void reg();
}
//實現類
public class UserServiceImpl implements UserService{
@Override
public void reg() {
System.out.println("資料新增成功!");
}
}
上面是事務層的程式碼
下面編寫一下AOP的相關程式碼(額外功能的程式碼)
//實現aop中的方法攔截器
public class MyAdvice implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation mi) throws Throwable {
System. out.println("開始事務");
//呼叫service中的方法(在spring中通過配置檔案將它們關聯起來)
Object o=mi.proceed();
System.out.println("結束事務");
return o;
}
}
下面看一下怎麼配置
<!--配置目標類-->
<bean id="userService" class="com.service.impl.UserServiceImpl"></bean>
<!--配置額外的功能程式碼-->
<bean id="myAdvice" class="com.advice.MyAdvice"></bean>
<!--aop相關的配置-->
<aop:config>
<!--切入點-->
<aop:pointcut id="pt" expression="execution(* com.service..*.*(..))"></aop:pointcut>
<!--在切入點切入額外的功能程式碼-->
<aop:advisor advice-ref="myAdvice" pointcut-ref="pt"></aop:advisor>
</aop:config>
上面的程式碼中我們先寫了目標類,就是我們的sevice裡面的程式碼,裡面包含了reg()註冊方法,註冊方法的主要流程應該是新增資料到資料庫,但是我們需要給新增方法加上事務的提交回滾等操作,這些操作因為了aop所以我們可以寫在MyAdvice類中,需要繼承的是MethodInterceptor這個方法攔截器,實現其中的invoke方法,其中mi.proceed()方法的返回值和service中的reg方法的返回值相同,再通過xml的配置,我們就完成了這個功能的增強。
測試一下
public class TestAop {
public static void main(String[] args) {
//建立spring的工廠物件幫助我們建立物件
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
//獲取我們需要的物件(這裡必須要用介面引用,因為底層使用了動態代理技術,實際獲取的不是service的實現類)
UserService us=(UserService) ac.getBean("userService");
//呼叫方法
us.reg();
}
}
執行結果