日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

JavaEE——Spring学习笔记03【AOP开发】

發(fā)布時(shí)間:2024/1/18 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaEE——Spring学习笔记03【AOP开发】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

JavaEE——Spring學(xué)習(xí)筆記01【Ioc開(kāi)發(fā)的模式】

JavaEE——Spring學(xué)習(xí)筆記02【Spring和Mybatis的整合】

JavaEE——Spring學(xué)習(xí)筆記03【AOP開(kāi)發(fā)】

JavaEE——Spring學(xué)習(xí)筆記04【Spring的事務(wù)管理】

JavaEE——Spring學(xué)習(xí)筆記05【Mybatis的逆行工程】

JavaEE——Spring學(xué)習(xí)筆記06【Maven創(chuàng)建Web工程】

目錄

六、Spring的AOP開(kāi)發(fā)

1. AOP的概念

2. 動(dòng)態(tài)代理(了解)

? 2.1 JDK動(dòng)態(tài)代理

?2.2 Cglib動(dòng)態(tài)代理

3. AOP的編程的好處

4. AOP的編程相關(guān)術(shù)語(yǔ)

?5. AOP的開(kāi)發(fā)模式

?5.1 Aop的Xml開(kāi)發(fā)方式

5.2 Aop的注解開(kāi)發(fā)方式


六、Spring的AOP開(kāi)發(fā)

1. AOP的概念

????????AOP的英文全程為Aspect Oriented programming,叫做面向切面編程,主要是在運(yùn)行期間動(dòng)態(tài)實(shí)現(xiàn)在不修改源碼的情況下給程序及進(jìn)行功能增強(qiáng)。針對(duì)目標(biāo)功能進(jìn)行擴(kuò)展或是增強(qiáng),通俗來(lái)說(shuō)就是不修改源碼,讓目標(biāo)獲得它本身沒(méi)有用的新功能。其實(shí)就是OOP編程的一個(gè)補(bǔ)充,降低了代碼的耦合性。

? ? ? ?AOP開(kāi)發(fā)的底層是通過(guò)動(dòng)態(tài)代理來(lái)完成,動(dòng)態(tài)代理分為JDK動(dòng)態(tài)代理Cglib動(dòng)態(tài)代理

??????JDK動(dòng)態(tài)代理:依賴(lài)于一個(gè)接口

??????Cglib動(dòng)態(tài)代理:依賴(lài)一個(gè)類(lèi)

2. 動(dòng)態(tài)代理(了解)

? 2.1 JDK動(dòng)態(tài)代理

????只能對(duì)實(shí)現(xiàn)了接口的類(lèi)產(chǎn)生代理。

實(shí)現(xiàn)的步驟:

????????1)業(yè)務(wù)的接口和實(shí)現(xiàn)類(lèi)

/** 用戶(hù)的接口* */ public interface UserDao {public void save();public void update();public void find();public void delete(); } /** 用戶(hù)接口實(shí)現(xiàn)類(lèi)* */ public class UserDaoImpl implements UserDao {@Overridepublic void save() {System.out.println("保存用戶(hù)信息");}@Overridepublic void update() {System.out.println("更改用戶(hù)信息");}@Overridepublic void find() {System.out.println("查詢(xún)用戶(hù)信息");}@Overridepublic void delete() {System.out.println("刪除用戶(hù)信息");} }

????????2)JDK動(dòng)態(tài)代理的類(lèi)

/** JDK動(dòng)態(tài)代理的類(lèi):實(shí)現(xiàn)Invocation Handler* */ public class JdkProxy implements InvocationHandler {//將被增強(qiáng)的對(duì)象傳遞進(jìn)來(lái)(目標(biāo)類(lèi))private UserDao userDao;public JdkProxy(UserDao userDao) {this.userDao = userDao;}//產(chǎn)生UserDao代理的方法public UserDao createProxy() {/** 第一個(gè)參數(shù):UserDao類(lèi)的加載器* 第二個(gè)參數(shù):要實(shí)現(xiàn)的接口* */UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(), this);return userDaoProxy;}/* 方法功能增強(qiáng)* 第一個(gè)參數(shù): 代理對(duì)象* 第二個(gè)參數(shù): 真正執(zhí)行的方法* 第三個(gè)參數(shù): 是方法的參數(shù)* */@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if ("save".equals(method.getName())) {//增強(qiáng)System.out.println("權(quán)限校驗(yàn)==========");return method.invoke(userDao, args);}return method.invoke(userDao, args);} }

????????3)測(cè)試方法

/** 用戶(hù)方法增強(qiáng)的測(cè)試類(lèi)* */ public class UserDaoTest {public static void main(String[] args) {//創(chuàng)建一個(gè)UserDao的實(shí)現(xiàn)類(lèi)對(duì)象UserDao userDao = new UserDaoImpl();//創(chuàng)建代理的對(duì)象UserDao proxy = new JdkProxy(userDao).createProxy();proxy.save();proxy.update();proxy.find();proxy.delete();} }

?

?2.2 Cglib動(dòng)態(tài)代理

???????1)針對(duì)類(lèi)而言:引入第三代理的jar包

<!--添加Cglib動(dòng)態(tài)代理的jar包--><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>2.1_3</version></dependency>

???????2)目標(biāo)類(lèi)

/** 客戶(hù)信息的類(lèi)* */ public class CustomerService {public void save() {System.out.println("保存用戶(hù)信息");}public void update() {System.out.println("更改用戶(hù)信息");}public void find() {System.out.println("查詢(xún)用戶(hù)信息");}public void delete() {System.out.println("刪除用戶(hù)信息");} }

? ? ???3)Cglib代理的類(lèi)

/** CglibProxy動(dòng)態(tài)代理的類(lèi):實(shí)現(xiàn)MethodInterceptor* */ public class CglibProxy implements MethodInterceptor {//給出要代理的對(duì)象private CustomerService customerService;public CglibProxy(CustomerService customerService) {this.customerService = customerService;}/** 使用Cglib產(chǎn)生代理的方法* */public CustomerService createProxy() {//1.創(chuàng)建Cglib的核心類(lèi)的對(duì)象Enhancer enhancer = new Enhancer();//2.設(shè)置父類(lèi)enhancer.setSuperclass(customerService.getClass());//3.設(shè)置回滾enhancer.setCallback(this);//4.創(chuàng)建代理的對(duì)象CustomerService proxy = (CustomerService) enhancer.create();return proxy;}/** 功能增強(qiáng)* */@Overridepublic Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {//判斷方法if ("delete".equals(method.getName())) {//增強(qiáng)System.out.println("日志信息==========");return methodProxy.invokeSuper(proxy, args);}return methodProxy.invokeSuper(proxy, args);} }

? ? ? ?4)測(cè)試的類(lèi)

/** 客戶(hù)信息測(cè)試類(lèi)* */ public class CustomerServiceTest {public static void main(String[] args) {//創(chuàng)建一個(gè)目標(biāo)類(lèi)CustomerService customerService = new CustomerService();//代理過(guò)程CustomerService proxy = new CglibProxy(customerService).createProxy();proxy.save();proxy.update();proxy.find();proxy.delete();} }

3. AOP的編程的好處

????????1.減少重復(fù)

????????2.專(zhuān)注于業(yè)務(wù)功能增強(qiáng)的實(shí)現(xiàn),就是oop的補(bǔ)充。

????????3.解模塊之間的耦合性

????????4.實(shí)現(xiàn)了事務(wù)的功能管理

????????5.。。。。。

4. AOP的編程相關(guān)術(shù)語(yǔ)

1)切面:Aspect

???切面指的是一個(gè)輔助類(lèi),實(shí)際上就是對(duì)業(yè)務(wù)邏輯的一種增強(qiáng)管理類(lèi)。

2)連接點(diǎn):JointPoint

???連接點(diǎn)是指可以被切面植入的具體的方法,通常情況就是業(yè)務(wù)中的方法均可以作為連接點(diǎn)。

3)切入點(diǎn):PointCut

???切入點(diǎn)(切點(diǎn))聲明一個(gè)或多個(gè)連接點(diǎn)的集合,一般我們理解為真正被增強(qiáng)的那個(gè)方法或方法的集合。

4)目標(biāo)對(duì)象:Target

???目標(biāo)對(duì)象就是指被增強(qiáng)的對(duì)象,即包含業(yè)務(wù)邏輯的類(lèi)的對(duì)象

5)通知:Advice

???通知定義了增強(qiáng)代碼切入到目標(biāo)代碼的時(shí)間點(diǎn)(可前可后進(jìn)行增強(qiáng)),是目標(biāo)方法執(zhí)行前還是執(zhí)行后等,通知的類(lèi)型不同,導(dǎo)致切入的時(shí)間點(diǎn)就不一樣了。

6)織入:weaving

???織入就是增強(qiáng)添加對(duì)目標(biāo)類(lèi)具體連接點(diǎn)的過(guò)程。

5. AOP的開(kāi)發(fā)模式

?5.1 Aop的Xml開(kāi)發(fā)方式

? ?Spring本身有自己對(duì)AOP開(kāi)發(fā)的實(shí)現(xiàn),但是開(kāi)發(fā)者發(fā)現(xiàn)了這個(gè)過(guò)程太過(guò)于繁瑣了,所以在實(shí)際開(kāi)發(fā)中我們使用的是AspectJ技術(shù)實(shí)現(xiàn)對(duì)AOP的開(kāi)發(fā),其實(shí)就是簡(jiǎn)化Spring本身的開(kāi)發(fā)。其實(shí)現(xiàn)方式簡(jiǎn)潔、方便管理,而且還支持注解開(kāi)發(fā)。所以Spring又將AspectJ作為AOP實(shí)現(xiàn)引入到自己框架中。

log4j.properties日志配置 log4j.rootLogger = debug,stdout,D,Elog4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%nlog4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = D://logs/log.log log4j.appender.D.Append = true log4j.appender.D.Threshold = DEBUG log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%nlog4j.appender.E = org.apache.log4j.DailyRollingFileAppender log4j.appender.E.File =D://logs/error.log log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

?5.1.1 前置通知:berfore

1)引入AspectJ的依賴(lài)jar包

<dependencies><!--添加單元測(cè)試的依賴(lài)包--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><!--添加Spring的核心jar包--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.7.RELEASE</version></dependency><!--添加AspectJ的依賴(lài)包--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.2.7.RELEASE</version></dependency></dependencies>

2)配置切面(就是業(yè)務(wù)增強(qiáng)的那個(gè)類(lèi))AccountAspect?

/** 賬戶(hù)類(lèi)的切面:其實(shí)就是Account業(yè)務(wù)增強(qiáng)的類(lèi)* */ public class AccountAspect {/** 驗(yàn)證賬戶(hù)的合法性* */public void validAuth() {System.out.println("驗(yàn)證賬戶(hù)是否合法!");}/** 檢查余額是否足夠* */public void validMoney() {System.out.println("檢查余額是否充足!");}/** 生成對(duì)賬單* */public void generateStatement() {System.out.println("生產(chǎn)對(duì)賬單!");}/** 發(fā)送短信* */public void sendMsg() {System.out.println("發(fā)送短信!");}/** 后置通知:取完錢(qián)后查看余額的方法* */public void getYuMoney(Object result) {System.out.println("賬戶(hù)余額還有:" + result);}/** 利用環(huán)繞通知檢查余額是否足夠(前置)和生成對(duì)賬單(后置)* */public Object validMoneyAndGenerateStatement(ProceedingJoinPoint point) throws Throwable {Object obj = null;//前置通知: 檢查余額是否充足validMoney();obj = point.proceed(); //調(diào)用切點(diǎn)的方法//后置通知: 生成對(duì)賬單generateStatement();return obj;}/** 異常通知* */public void exception(Exception e) {System.out.println("目標(biāo)方法執(zhí)行出錯(cuò)" + e.getMessage());}/** 最終的通知* */public void after() {System.out.println("不管有無(wú)異常,我都進(jìn)行通知");} }

3) 配置被切面(就是配置目標(biāo)類(lèi))Account?

/** 賬號(hào)類(lèi)* */ public class Account {int money = 1000;//取錢(qián)/*public void out() {money -= 100; //取出100元System.out.println("已扣除100元!");}*///取錢(qián)public int out() {money -= 100; //取出100元System.out.println("已扣除100元!");int num = 100 / 0; //設(shè)置異常return money;}//存錢(qián)public void in() {money += 100; //存儲(chǔ)100元System.out.println("已存儲(chǔ)100元!");}//轉(zhuǎn)賬public void transfer() {System.out.println("轉(zhuǎn)賬人民幣!");}//開(kāi)戶(hù)public void open() {System.out.println("開(kāi)通賬戶(hù)!");}//銷(xiāo)戶(hù)public void close() {System.out.println("銷(xiāo)毀賬戶(hù)!");} }

4)配值目標(biāo)類(lèi)和切面類(lèi)的關(guān)系applicationContext-aop.xml

? ? ?Spring容器管理

<?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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><!--1.配置切面: 業(yè)務(wù)增強(qiáng)的類(lèi)--><bean id="accountAspect" class="com.suke.aspect.AccountAspect"></bean><!--2.配置被切面: 目標(biāo)類(lèi)--><bean id="account" class="com.suke.pojo.Account"></bean><!--3.配置切面和目標(biāo)類(lèi)之間的關(guān)系--><aop:config><!--3.1 配置切入點(diǎn):真正被增強(qiáng)的那個(gè)點(diǎn)(方法)--><aop:pointcut id="pointcut1" expression="execution(public int com.suke.pojo.Account.out())"/><!--3.2 配置切面,給出增強(qiáng)的方法的執(zhí)行時(shí)間通知的配置:方法被增強(qiáng)的執(zhí)行時(shí)間:之前,之后,環(huán)繞,異常,最終--><aop:aspect ref="accountAspect"><!--配置增強(qiáng)的方法--><!--前置通知--><aop:before method="validAuth" pointcut-ref="pointcut1"/><aop:before method="validMoney" pointcut-ref="pointcut1"/><!--后置通知,給出余額參數(shù)信息--><aop:after-returning method="getYuMoney" pointcut-ref="ponintcut1" returning="result"/><!--環(huán)繞通知--><aop:around method="validMoneyAndGenerateStatement" pointcut-ref="pointcut1"/><!--異常通知--><aop:after-throwing method="exception" pointcut-ref="pointcut1" throwing="e"/><!--最終異常--><aop:after method="after" pointcut-ref="pointcut1"/></aop:aspect></aop:config> </beans>

5)測(cè)試類(lèi)AccountTest?

/** 測(cè)試賬戶(hù)的類(lèi)* */ public class AccountTest {@Testpublic void testAccount() {//1.創(chuàng)建Spring容器的對(duì)象ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-aop.xml");//2.獲取容器中Account對(duì)象Account account = (Account) applicationContext.getBean("account");//取錢(qián)account.out();} }

?5.1.2 后置通知:after-returing

???在目標(biāo)方法執(zhí)行后進(jìn)行通知?

1)以取錢(qián)后顯示余額為案例,目標(biāo)類(lèi)中的方法

//取錢(qián)public int out() {money -= 100; //取出100元System.out.println("已扣除100元!");return money;}

2)切面類(lèi)中的方法

/** 后置通知:取完錢(qián)后查看余額的方法* */public void getYuMoney(Object result) {System.out.println("賬戶(hù)余額還有:" + result);}

3)Spring容器中的配置

<!--后置通知,給出余額參數(shù)信息--><aop:after-returning method="getYuMoney" pointcut-ref="ponintcut1" returning="result"/>

?5.1.3 環(huán)繞通知:aroud

在目標(biāo)方法執(zhí)行前和執(zhí)行后都進(jìn)行通知,修改切面類(lèi)中的方法!

1)切面類(lèi)中的方法

/** 利用環(huán)繞通知檢查余額是否足夠(前置)和生成對(duì)賬單(后置)* */public Object validMoneyAndGenerateStatement(ProceedingJoinPoint point) throws Throwable {Object obj = null;//前置通知: 檢查余額是否充足validMoney();obj = point.proceed(); //調(diào)用切點(diǎn)的方法//后置通知: 生成對(duì)賬單generateStatement();return obj;}

2)Spring容器中的配置

<!--環(huán)繞通知--><aop:around method="validMoneyAndGenerateStatement" pointcut-ref="pointcut1"/>

3)測(cè)試類(lèi)不變

/** 測(cè)試賬戶(hù)的類(lèi)* */ public class AccountTest {@Testpublic void testAccount() {//1.創(chuàng)建Spring容器的對(duì)象ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-aop.xml");//2.獲取容器中Account對(duì)象Account account = (Account) applicationContext.getBean("account");//取錢(qián)account.out();} }

?5.1.4 異常通知:after-throwing

1)目標(biāo)類(lèi)中的方法

//取錢(qián)public int out() {money -= 100; //取出100元System.out.println("已扣除100元!");int num = 100 / 0; //設(shè)置異常return money;}

2)切面類(lèi)中的方法

/** 異常通知* */public void exception(Exception e) {System.out.println("目標(biāo)方法執(zhí)行出錯(cuò)" + e.getMessage());}

3)Spring容器中的配置

<!--異常通知--><aop:after-throwing method="exception" pointcut-ref="pointcut1" throwing="e"/>

4)測(cè)試類(lèi)不變

?5.1.5 最終通知:after

1)切面類(lèi)中的方法

/** 最終的通知* */public void after() {System.out.println("不管有無(wú)異常,我都進(jìn)行通知");}

2)Spring容器文件中的配置

<!--最終異常--><aop:after method="after" pointcut-ref="pointcut1"/>

3)測(cè)試類(lèi)不變

AOP的總結(jié):

1. 切什么?用什么切?

???找切面與被切面,被切面是業(yè)務(wù),切面是擴(kuò)展業(yè)務(wù)

2. 從哪切?

???找切點(diǎn)

3. 什么時(shí)間切?

???定義通知類(lèi)型(前置,后置,環(huán)繞,異常,最終)

5.2 Aop的注解開(kāi)發(fā)方式

無(wú)論是xml的aop開(kāi)發(fā)。還是注解的aopo開(kāi)發(fā),都可以實(shí)現(xiàn)方法增強(qiáng)的功能。

5.2.1 設(shè)置注解的包掃描器

<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!--1、設(shè)置注解的包掃描器--><context:component-scan base-package="com.suke"/><!--2、開(kāi)啟AOP的注解代理--><aop:aspectj-autoproxy/> </beans>

5.2.2 AOP注解在使用前要先開(kāi)啟

<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!--1、設(shè)置注解的包掃描器--><context:component-scan base-package="com.suke"/><!--2、開(kāi)啟AOP的注解代理--><aop:aspectj-autoproxy/> </beans>

5.2.3 目標(biāo)類(lèi)Account?

/*** 賬戶(hù)類(lèi):被切面類(lèi)*/@Component public class Account {int money = 1000;//取錢(qián) /* public void out(){money -=100;//取出100System.out.println("已扣除100元!");}*/public int out() {money -= 100;//取出100System.out.println("已扣除100元!");//int num = 100/0;//設(shè)置異常return money;}//存錢(qián)public void in() {money += 100;//存儲(chǔ)100System.out.println("已存儲(chǔ)100元!");}//轉(zhuǎn)賬public void transfer() {System.out.println("轉(zhuǎn)賬人民幣!");}//開(kāi)戶(hù)public void open() {System.out.println("開(kāi)通賬戶(hù)!");}//銷(xiāo)戶(hù)public void close() {System.out.println("賬戶(hù)銷(xiāo)戶(hù)!");} }

5.2.4 切面類(lèi)AccountAspect

/*** 賬戶(hù)類(lèi)的切面:其實(shí)就是Account業(yè)務(wù)增強(qiáng)的類(lèi)*/ @Component @Aspect public class AccountAspect {/*** 驗(yàn)證賬戶(hù)的合法性:前置通知1*/@Before("execution(public int com.suke.pojo.Account.out())")public void validAuth() {System.out.println("驗(yàn)證賬戶(hù)是否合法!");}/*** 檢查余額是否足夠:前置通知2*/@Before("execution(public int com.suke.pojo.Account.out())")public void validMoney() {System.out.println("檢查余額是否充足!");}/*** 生成對(duì)賬單*/@AfterReturning("execution(public int com.suke.pojo.Account.out())")public void generateStatement() {System.out.println("生成對(duì)賬單!");}/*** 發(fā)送短信*/@AfterReturning("execution(public int com.suke.pojo.Account.out())")public void sendMsg() {System.out.println("發(fā)送短信!");}/*** 后置通知:取完錢(qián)后查看余額的方法*/ // @AfterReturning(value = "execution(public int com.suke.pojo.Account.out())",returning = "result")@AfterReturning(value = "accountPoint()", returning = "result")public void getYuMoney(Object result) {System.out.println("賬戶(hù)余額還有:" + result);}/*** 利用環(huán)繞通知檢查余額是否足夠(前置)和生成對(duì)賬單(后置)*/@Around("execution(public int com.suke.pojo.Account.out())")public Object vaildMoneyAndGenerateStatement(ProceedingJoinPoint ponint) throws Throwable {Object obj = null;//前置通知:檢查余額是否充足validMoney();obj = ponint.proceed(); //調(diào)用切點(diǎn)的方法//后置通知:生成對(duì)賬單generateStatement();return obj;}/*** 異常通知*/ // @AfterThrowing(value = "execution(public int com.suke.pojo.Account.out())", throwing = "e")@AfterThrowing(value = "accountPoint()", throwing = "e")public void exception(Exception e) {System.out.println("目標(biāo)方法執(zhí)行出錯(cuò)!" + e.getMessage());}/*** 最終的通知*/ // @After("execution(public int com.suke.pojo.Account.out())")@After(value = "accountPoint()")public void after() {System.out.println("不管有無(wú)異常我都進(jìn)行通知!");}/*** 配置一個(gè)切點(diǎn)*/@Pointcut(value = "execution(public int com.suke.pojo.Account.out())")public void accountPoint() {} }

5.2.4 測(cè)試類(lèi)AccountTest?

/*** 測(cè)試賬戶(hù)的類(lèi)*/ public class AccountTest {@Testpublic void testAccount(){//1、創(chuàng)建Spring的容器對(duì)象ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-aop.xml");//2、獲取容器中Account對(duì)象Account account = (Account) applicationContext.getBean("account");//取錢(qián)account.out();} }

總結(jié)

以上是生活随笔為你收集整理的JavaEE——Spring学习笔记03【AOP开发】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。