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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

spring aop实例讲解_小实例理解Spring中的AOP----面向切面编程

發布時間:2025/3/19 javascript 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring aop实例讲解_小实例理解Spring中的AOP----面向切面编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于面向切面編程(Spring AOP),是在java面試中經常提及的,只有在充分理解了,日常工作中才能得心應手。

如何理解AOP呢?首先我們要思考為什么要使用切面編程,如下圖:

對于一個系統來說保存用戶信息、權限分配的時候,我們會有數據庫事務,保存要么同時成功,要么同時失敗,用戶信息、權限分配是面向對象設計的類對象,是橫向的;數據庫事

務是縱向的,像切面一樣把他們切開。在編程中我們會發現:數據庫的開閉,事務的管理是通用的,AOP可以抽取出來實現,簡化我們的編程。

在Springboot中,javaBean是提供一個更強大的配置功能來增強JavaBean的功能,在java編程中,使用數據庫時會寫大量jdbc的try-catch代碼,這個時候我們就能使用AOP編程將這些代碼抽取出來,簡化代碼。

下面就用一個小實例初步理解面向切面編程(代碼按照文末工程目錄結構復制即可運行展示效果):

首先我們理解什么是動態代理模式:當你需要采訪一名兒童的時候,首先你需要經過他的父母的同意,在一些問題上父母也許會替他回答,而對于另一些問題,也許父母覺得不太適合這個小孩會拒絕掉,這個時候小孩的父母就是他的代理(proxy)了。

動態代理的定義:生成一個占位,又稱代理對象來代理目標對象,可以增強或者控制對孩子這個真實對象的訪問。

1.約定編程,新建一個DinnerService接口

package com.springboot.chapter4.service;/*** @Auther: * @Date: 2019/3/17 09:56* @Description:*/ public interface DinnerService {public void eatDinner(String name); }

再寫一個DinnerService的實現類DinnerServiceImpl

package com.springboot.chapter4.service.impl;import com.springboot.chapter4.service.DinnerService;/*** 描述:** @author * @create 2019-03-17 9:58*/ public class DinnerServiceImpl implements DinnerService {@Overridepublic void eatDinner(String name) {if(name == null || name.trim() == ""){throw new RuntimeException("parameter is null");}System.out.println("hello"+name);} }

2.在JDK中提供了類Proxy的靜態方法newProxyInstance作為代理對象,我們讓代理類EatProxy通過實現InvocationHandler接口來實現代理功能,代碼如下:

package com.springboot.chapter4.proxy;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;/*** 描述:** @author * @create 2019-03-17 17:07*/ public class EatProxy implements InvocationHandler {// 引入目標對象:目的是吃晚餐private Object target;public static Object bind(Object target) {EatProxy eatProxy = new EatProxy();eatProxy.target = target;Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),eatProxy);return proxy;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("飯前洗手");Object obj = method.invoke(target, args);System.out.println("收拾飯菜");System.out.println("收拾餐具");return obj;} }

其中重寫的invoke方法作為代理處理邏輯來處理業務

3.再寫一個主函數AopMain

package com.springboot.chapter4.main;import com.springboot.chapter4.proxy.EatProxy; import com.springboot.chapter4.service.DinnerService; import com.springboot.chapter4.service.impl.DinnerServiceImpl;/*** 描述:** @author * @create 2019-03-17 14:35*/ public class AopMain {public static void main(String[] args) {DinnerService dinnerService = new DinnerServiceImpl();DinnerService eatProxy = (DinnerService) EatProxy.bind(dinnerService);eatProxy.eatDinner("晚飯好吃");} }

4.運行程序則可以看到”hello晚上吃飯“已經被調用,即我們第1步實現的接口代碼已經被織入到約定的流程中。

項目工程截圖如下:

總結

以上是生活随笔為你收集整理的spring aop实例讲解_小实例理解Spring中的AOP----面向切面编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。