javascript
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----面向切面编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python爬虫脚本ie=utf-8_P
- 下一篇: 获取this_带你彻底弄清JavaScr