Spring框架:面向切面編程,切點(diǎn)等面試時常問的術(shù)語,aop: before,aop:aspect等標(biāo)簽
導(dǎo)航:
邊看教程邊記錄的部分
面試時常用的術(shù)語
切點(diǎn)的理解(pointcut)
<aop: before>
<aop: after>
aop:after-throwing?
aop:before等相關(guān)標(biāo)簽的面向切面的運(yùn)用例子
aop:aspect等標(biāo)簽來模擬黑客抓,攔截用戶更新數(shù)據(jù)的游戲數(shù)據(jù)包的例子
5、SPRINGCORE框架_面向切面編程.ppt
aop:aspect
單詞:aspect方面

邊看教程邊記錄的部分 START
在訪問界面的時候,不可以直接的訪問,要進(jìn)行安全驗(yàn)證,確認(rèn)是登錄了的用戶后才可以訪問界面,沒登錄就想訪問就是非法訪問,就是沒登錄的就要跳到登錄界面。

在訪問界面的時候,不可以直接的訪問,要進(jìn)行安全驗(yàn)證,確認(rèn)是登錄了的用戶后才可以訪問界面,沒登錄就想訪問就是非法訪問,就是沒登錄的就要跳到登錄界面。
其實(shí)我認(rèn)為spring框架,面向切面編程等的作用就是“集中處理會常要修改的內(nèi)容,比如一些數(shù)據(jù),在配置文件用value賦值,要改數(shù)據(jù)時,改value等的值就可以”。切面是一種“類”。有時集中處理就效率更高了,省去找分散的部分。如果不用Spring框架等等,還可能遺漏處理。

其實(shí)我認(rèn)為spring框架,面向切面編程等的作用就是“集中處理會常要修改的內(nèi)容,比如一些數(shù)據(jù),在配置文件用value賦值,要改數(shù)據(jù)時,改value等的值就可以”。切面是一種“類”。有時集中處理就效率更高了,省去找分散的部分。如果不用Spring框架等等,還可能遺漏處理。
如果是每個步驟都用日志文件打印,那么出問題后,看日志文件就可以更快地知道錯在哪里。

面試時常用的術(shù)語。

切點(diǎn)的理解(pointcut)。



可以看出了如果有更多類似考試,創(chuàng)業(yè)等的方法調(diào)用,但是要對應(yīng)地在調(diào)用這些方法等前或后調(diào)用鼓勵方法,使用原始地調(diào)用方法地話就會要重復(fù)用代碼調(diào)用鼓勵的方法。
這時候spring框架的作用就體現(xiàn)出了:使用面向切面,配置文件配置后可以減少代碼重復(fù)。
其實(shí)我發(fā)現(xiàn)和認(rèn)為很多強(qiáng)大和先進(jìn)的技術(shù)(比如一些框架)的話常用的作用之一就是:減少代碼重復(fù),像是是使用了“乘法結(jié)合律”。

這時候spring框架的作用就體現(xiàn)出了:使用面向切面,配置文件配置后可以減少代碼重復(fù)。
其實(shí)我發(fā)現(xiàn)和認(rèn)為很多強(qiáng)大和先進(jìn)的技術(shù)(比如一些框架)的話常用的作用之一就是:減少代碼重復(fù),像是是使用了“乘法結(jié)合律”。



execution:執(zhí)行


core:核心部分

配置文件中聲明切面的方法(在事務(wù)提交處理等中切面會常用,且其關(guān)鍵作用,所以很重要):
<aop: before>等等是spring框架中的“通知”的一種。
個人理解:本質(zhì)作用就是用對應(yīng)的標(biāo)簽來控制成自己規(guī)定的“何時,何處”來調(diào)用一些自己創(chuàng)建的并且為method中的值的方法。
關(guān)于<aop: before>標(biāo)簽的代碼的意思就是,在調(diào)用Student這個類中的exam方法之前(before),會調(diào)用在method中聲明的encourage方法。

關(guān)于<aop: before>標(biāo)簽的代碼的意思就是,在調(diào)用Student這個類中的exam方法之前(before),會調(diào)用在method中聲明的encourage方法。
同理的話,關(guān)于<aop: after>標(biāo)簽的代碼的意思就是在調(diào)用Student這個類中的createWork方法之后(after),會調(diào)用在method中聲明的encourage方法。











邊看教程邊記錄的部分?END
aop:before等相關(guān)標(biāo)簽的面向切面的運(yùn)用例子?START


package com.SSHC.bean;
public class Student {
? ? public void exam(){
? ? System.out.println("正在考試,調(diào)用Student的exam方法。");
? ? }
? ??
? ? public void createWork(){
? ? System.out.println("正在創(chuàng)業(yè),調(diào)用Student的createWork方法。");
? ? }
? ??
? ? public void driverExam(){
? ? System.out.println("駕照考試,調(diào)用Student的driverExam方法,"
+ "\n int i = 1 / 0的異常來模擬駕照考試失敗。");
? ? int i = 1 / 0;
? ? }
}

package com.SSHC.bean;
public class Teacher {
? ? public void encourage(){
? ? System.out.println("奧里給,加油,"
? ? + "調(diào)用了Teacher類中的encourage鼓勵方法 ");
? ? }
}

package MainText;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.SSHC.bean.Game;
import com.SSHC.bean.Student;
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
? ? ? ? ApplicationContext ctx =?
new ClassPathXmlApplicationContext("applicationContext.xml");
? ? ? ? Student s = (Student) ctx.getBean("s");
? ? ? ? //模擬考試前鼓勵:
? ? ? ? s.exam();
? ? ? ? //模擬創(chuàng)業(yè)失敗后鼓勵:
? ? ? ? s.createWork();
? ? ? ??
? ? ? ??
? ? ? ? //模擬考駕照科目三沒過后給鼓勵:
? ? ? ? s.driverExam();
? ? ? ??
? ? ? ??
}
}

<?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"
xmlns:tx="http://www.springframework.org/schema/tx"?
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans classpath:/org/springframework/beans/factory/xml/spring-beans-3.0.xsd
? ? ? ?http://www.springframework.org/schema/aop classpath:/org/springframework/aop/config/spring-aop-3.0.xsd
? ? ? ?http://www.springframework.org/schema/tx classpath:/org/springframework/transaction/config/spring-tx-3.0.xsd
? ? ? ?http://www.springframework.org/schema/context classpath:/org/springframework/context/config/spring-context-3.0.xsd">
? ? <bean id="s" class="com.SSHC.bean.Student"></bean>
? ? <bean id="t" class="com.SSHC.bean.Teacher"></bean>
? ??
? ? <bean id="game" class="com.SSHC.bean.Game"></bean>
? ? <bean id="hk" class="com.SSHC.bean.Hacker"></bean>
? ? <!-- 切面配置 -->
? ? <aop:config>
? ? ? ? <aop:aspect ref="t">
? ? ? ? ? ? <aop:before pointcut="execution(* com.SSHC.bean.Student.exam(..))"
? ? ? ? ? ? ? ? method="encourage"></aop:before>
? ? ? ? ? ? <aop:after pointcut="execution(* com.SSHC.bean.Student.createWork(..))"
? ? ? ? ? ? ? ? method="encourage"></aop:after>
? ? ? ? ? ? <aop:after-throwing pointcut="execution(* com.SSHC.bean.Student.driverExam(..))"
? ? ? ? ? ? ? ? method="encourage"></aop:after-throwing>
? ? ? ? </aop:aspect>
? ? ? ? <aop:aspect ref="hk">
? ? ? ? ? ? <aop:before pointcut="execution(* com.SSHC.bean.Game.sendData(String)) and args(data)"
? ? ? ? ? ? ? ? method="interData"></aop:before>
? ? ? ? </aop:aspect>
? ? </aop:config>
</beans>

aop:before等相關(guān)標(biāo)簽的面向切面的運(yùn)用例子END
aop:aspect等標(biāo)簽來模擬黑客抓,攔截用戶更新數(shù)據(jù)的游戲數(shù)據(jù)包的例子 START

package com.SSHC.bean;
public class Game {
//發(fā)送游戲數(shù)據(jù)包
? ? public void sendData(String msg){
? ? System.out.println("發(fā)送到服務(wù)器的數(shù)據(jù)是:" + msg);
? ? }
}

package com.SSHC.bean;
public class Hacker {
//攔截?cái)?shù)據(jù)
? ? public void interData(String data){
? ? System.out.println("攔截到的數(shù)據(jù)是:" + data);
? ? }
}


package MainText;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.SSHC.bean.Game;
public class Demo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
? ? ? ? ApplicationContext ctx =?
new ClassPathXmlApplicationContext("applicationContext.xml");
? ? ? ? //Student s = (Student) ctx.getBean("s");
? ? ? ? //考試前鼓勵
? ? ? ? //s.exam();
? ? ? ? //創(chuàng)業(yè)失敗后鼓勵
? ? ? ? //s.createWork();
? ? ? ? //考駕照科目三沒過
? ? ? ? //s.driverExam();
? ? ? ??
? ? ? ? Game g = (Game) ctx.getBean("game");
? ? ? ? g.sendData("對BOSS造成了1000點(diǎn)的傷害");
}
}

aop:aspect等標(biāo)簽來模擬黑客抓,攔截用戶更新數(shù)據(jù)的游戲數(shù)據(jù)包的例子 END
5、SPRINGCORE框架_面向切面編程.ppt START












SPRINGCORE框架
面向切面編程
概念的引入
思考以下的幾種情形:1、如何在javaweb項(xiàng)目中實(shí)現(xiàn)用戶的安全驗(yàn)證。2、在javaweb中處理中文亂碼問題。3、在系統(tǒng)工程中,對每步操作都產(chǎn)生日志記錄。4、對每個service類中的方法調(diào)用前都啟動一個事務(wù),調(diào)用后提交或者回滾事務(wù)。在上面的情形中,分布于應(yīng)用中多處的功能被稱為橫切關(guān)注點(diǎn)。通常,這些橫切關(guān)注點(diǎn)從概念上是與應(yīng)用的業(yè)務(wù)邏輯分離的,但是往往又直接嵌入到應(yīng)用的業(yè)務(wù)邏輯中,面向切面編程(AOP)的目的就是將這些橫切關(guān)注點(diǎn)與業(yè)務(wù)邏輯分離。
什么是面向切面編程
橫切關(guān)注點(diǎn)可以理解為在工程需要多次使用的功能。如前面所述的4種情形,全部都是橫切關(guān)注點(diǎn)。下圖展示了一個多模塊的應(yīng)用,每個模塊都有自己的核心功能,但是這些模塊也需要一些輔助功能,例如安全驗(yàn)證和事務(wù)管理,這些輔助功能就是橫切關(guān)注點(diǎn),如果將每個橫切關(guān)注點(diǎn)模塊化為特殊類,則這些類就被稱為切面。面向切面編程的好處:1、每個橫切關(guān)注點(diǎn)現(xiàn)在被集中處理了,不會再分散到多處代碼中。2、service類更加的簡潔,因?yàn)樗鼈儸F(xiàn)在只需要關(guān)注核心功能的代碼,而輔助功能的代碼被轉(zhuǎn)移到切面中去了。
面向切面編程的術(shù)語
描述切面的常用術(shù)語有:通知(advice),切點(diǎn)(pointcut)和連接點(diǎn)(join point)。通知:定義了切面是什么以及何時使用,即描述了切面要完成的工作以及什么時候執(zhí)行這個工作。spring中包含5種類型的通知。1、Before,在方法被調(diào)用之前調(diào)用通知。2、After,在方法被調(diào)用之后調(diào)用通知。3、After-returning,在方法成功執(zhí)行之后調(diào)用通知。4、After-throwing,在方法拋出異常后調(diào)用通知。5、Around,通知包裹了被通知的方法,在被通知的方法調(diào)用之前和調(diào)用之后執(zhí)行自定義的行為。連接點(diǎn):應(yīng)用通知的時機(jī)被稱為連接點(diǎn)。連接點(diǎn)可以是調(diào)用方法時、拋出異常時、甚至修改一個字段時。在spring中連接點(diǎn)總是方法調(diào)用時。切點(diǎn):如果通知定義了切面的“什么”和“何時”,那么切點(diǎn)就定義了“何處”。也可以理解為被篩選后需要被通知的連接點(diǎn)。切面:即通知與切點(diǎn)的結(jié)合,即定義切面的全部內(nèi)容:它是什么,在何時何處完成其功能。織入:將切面應(yīng)用到目標(biāo)對象來創(chuàng)建新的代理對象的過程。切面在指定的連接點(diǎn)被織入到目標(biāo)對象中。
Spring中的AOP支持
Spring提供了4種AOP支持:●基于代理的經(jīng)典AOP●@AspectJ注解驅(qū)動的切面●純POJO切面●注入式AspectJ切面(適合Spring各版本)注意:Spring只支持方法連接點(diǎn)
AspectJ的切點(diǎn)表達(dá)式語言
在Spring AOP中,需要使用AspectJ的切點(diǎn)表達(dá)式語言來定義切點(diǎn)。下表列出了Spring AOP所支持的AspectJ切點(diǎn)指示器。
在配置文件中聲明切面(一)
在Spring AOP的配置元素如下表
在配置文件中聲明切面(二)
檢查applicationContext.xml的beans標(biāo)簽中是否有以下的代碼。
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
classpath:/org/springframework/aop/config/spring-aop-4.1.xsd
在配置文件中聲明切面(三)
1、創(chuàng)建Teacher類和Student類。
在配置文件中聲明切面(三)
2、在配置文件中聲明切面。
為通知傳遞參數(shù)
有時候通知不僅僅是對方法的簡單包裝,還需要校驗(yàn)傳遞給方法的參數(shù)值,為通知傳遞參數(shù)就比較有用了。下面看看如何為通知傳遞參數(shù)。創(chuàng)建一個模擬黑客截取游戲數(shù)據(jù)包的程序。1、創(chuàng)建Game類和Hacker類。
為通知傳遞參數(shù)
2、配置application.xml文件。
3、進(jìn)行測試。