欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

java中AOP的原理是什么

本篇文章給大家分享的是有關(guān)java中 AOP的原理是什么,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

在王益等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作定制開(kāi)發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),營(yíng)銷型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站制作,王益網(wǎng)站建設(shè)費(fèi)用合理。

AOP :

面向切面編程

在程序設(shè)計(jì)中,我們需要滿足高耦合低內(nèi)聚,所以編程需滿足六大原則,一個(gè)法則.

AOP面向切面編程正是為了滿足這些原則的一種編程思想.

一.裝飾者模式:

當(dāng)我們需要給對(duì)象增加功能時(shí),為了滿足單一職責(zé)原則,可利用裝飾者模式編程,創(chuàng)建一個(gè)類用來(lái)裝飾原來(lái)的類,這個(gè)類寫(xiě)需要在原來(lái)的功能上增加的功能.

比如:一個(gè)類里面有一個(gè)增加圖書(shū)的功能,

@Service
public class BookSericeImpl implements BookSerice {
 @Override
 public void addOne(BokBean bokBean) {
  System.out.println("執(zhí)行邏輯:插入一本書(shū)");
 }
 @Override
 public void deletOne(Long bookId) {
  System.out.println("執(zhí)行邏輯:刪除一本書(shū)");
 }
}

我們需要在這個(gè)基礎(chǔ)上新增打印日志的功能,

public class BooklogServiceImpl implements BookSerice {
 private BookSerice bookSerice;
 public BooklogServiceImpl(BookSerice bookSerice) {
  this.bookSerice = bookSerice;
 }
 @Override
 public void addOne(BokBean bokBean) {

  System.out.println("準(zhǔn)備新增一本書(shū)");
  this.bookSerice.addOne(bokBean);
  System.out.println("新增一本書(shū)完成");
 }
 @Override
 public void deletOne(Long bookId) {

  System.out.println("準(zhǔn)備刪除一本書(shū)");
  this.bookSerice.deletOne(323L);
  System.out.println("刪除一本書(shū)完成");
 }
}

下面我們調(diào)用這個(gè)增強(qiáng)過(guò)后的的對(duì)象

public void test1(){

  //Aop :面向切面編程

  //使用裝飾者模式設(shè)計(jì)對(duì)象
  BookSerice bookSerice = new BookSericeImpl();
  //把原來(lái)功能的對(duì)象通過(guò)構(gòu)造方傳給新增功能的類,并把新增功能類的對(duì)象賦給原來(lái)對(duì)象
  //這里新增功能類和原來(lái)的類都是實(shí)現(xiàn)了同一個(gè)接口.
  bookSerice = new BooklogServiceImpl(bookSerice);
  //調(diào)用新增功能類的方法,在這個(gè)方法里讓構(gòu)造方法傳過(guò)去的對(duì)象調(diào)用原來(lái)的功能
  bookSerice.addOne(new BokBean());
 }

這樣我們就在不改變?cè)瓉?lái)代碼的基礎(chǔ)上新增了功能,并且也滿足單一職責(zé)的原則,降低了代碼的耦合性.

但是如果接口里面有很多方法,如果每個(gè)方法都需要增加日志功能,這樣就會(huì)出現(xiàn)很多重復(fù)代碼,并且裝飾者模式不能同時(shí)為多個(gè)沒(méi)有關(guān)系的類同時(shí)增強(qiáng)

所以java引入動(dòng)態(tài)代理技術(shù)來(lái)增加功能.

二.動(dòng)態(tài)代理

在java里動(dòng)態(tài)代理有兩個(gè)實(shí)現(xiàn)方式:

①針對(duì)有接口的類的代理,使用jdk中反射包下的動(dòng)態(tài)代理

②針對(duì)沒(méi)有接口的類的代理,使用第三方的jar包Enhancer

如果一個(gè)類既沒(méi)有接口,又是final,那么不能進(jìn)行增強(qiáng)

1.第一種實(shí)現(xiàn):

基于接口的動(dòng)態(tài)代理,使用java內(nèi)部反射包增強(qiáng)

這種方式創(chuàng)建對(duì)象是目標(biāo)對(duì)象的兄弟對(duì)象.

同樣上面是實(shí)現(xiàn)了接口的兩個(gè)功能的類:

@Service
public class BookSericeImpl implements BookSerice {
 @Override
 public void addOne(BokBean bokBean) {
  System.out.println("執(zhí)行邏輯:插入一本書(shū)");
 }
 @Override
 public void deletOne(Long bookId) {
  System.out.println("執(zhí)行邏輯:刪除一本書(shū)");
 }
}

調(diào)用通過(guò)對(duì)象調(diào)用上面兩個(gè)方法:

public void test2(){

 //創(chuàng)建需要代理的對(duì)象
 BookSerice bookSerice = new BookSericeImpl();
 //根據(jù)對(duì)象的類獲取類加載器
 ClassLoader classLoader = bookSerice.getClass().getClassLoader();
 //獲取被代理對(duì)象說(shuō)實(shí)現(xiàn)的所有接口
 Class<?>[] interfaces = bookSerice.getClass().getInterfaces();
 //新建代理對(duì)象,里面參數(shù)需要(類加載器,一個(gè)對(duì)象所實(shí)現(xiàn)的接口,InvocationHandler接口類的對(duì)象)
 bookSerice = (BookSerice) Proxy.newProxyInstance(classLoader, interfaces, new LogHandler(bookSerice)); 
 bookSerice.addOne(new BokBean());
 bookSerice.deletOne(232L);
}

在創(chuàng)建代理對(duì)象的時(shí)候需要一個(gè)InvocationHandler接口類的對(duì)象,下面創(chuàng)建一個(gè)該類的實(shí)現(xiàn)類

public class LogHandler implements InvocationHandler {

 //通過(guò)構(gòu)造方法接受一個(gè)沒(méi)有被代理的原來(lái)的對(duì)象
 //通過(guò)下面的方法名的反射找到這個(gè)對(duì)象對(duì)應(yīng)方法
 private Object target;
 public LogHandler(Object target) {
  this.target = target;
 }
 //當(dāng)代理對(duì)象調(diào)用原方法的時(shí)候,就會(huì)調(diào)用這個(gè)invoke方法
 @Override
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  String classname = target.getClass().getName();
  String methodName = method.getName();
  System.out.println(classname+"."+methodName+"方法開(kāi)始執(zhí)行");
  //這里實(shí)際是Method類通過(guò)方法名反射調(diào)用了原方法(addone)
  Object value = method.invoke(target, args);
  System.out.println(classname+"."+methodName+"方法執(zhí)行完畢");
  return value;

 }
}

這樣實(shí)現(xiàn)了動(dòng)態(tài)代理之后,不管實(shí)現(xiàn)的接口里有多少個(gè)方法,你只需調(diào)用該方法,就會(huì)增強(qiáng)該方法,而不需要針對(duì)每個(gè)方法寫(xiě)一遍增強(qiáng)功能,

并且這個(gè)增強(qiáng)類LogHandler類和原來(lái)的實(shí)現(xiàn)類BookSericeImpl類并沒(méi)有耦合性,這就是說(shuō)不管你是什么接口類的實(shí)現(xiàn)類,只需要對(duì)該類的對(duì)象進(jìn)行代理即可,就能對(duì)該類的方法添加上這個(gè)新增的功能

總的來(lái)說(shuō),這種動(dòng)態(tài)代理實(shí)現(xiàn)方式就是利用反射技術(shù),找到調(diào)用的方法名,針對(duì)這個(gè)方法進(jìn)行增強(qiáng).

如果當(dāng)不需要對(duì)某方法增加功能時(shí),就不用不帶.

2.第二種實(shí)現(xiàn):

基于類的動(dòng)態(tài)代理,使用cglib框架.
這種方式創(chuàng)建的代理對(duì)象是目標(biāo)對(duì)象的子類對(duì)象

第二種方式是利用第三方j(luò)ar包來(lái)實(shí)現(xiàn),下載CGLIB包:

java中 AOP的原理是什么

利用jar包中的Enhancer類創(chuàng)建增強(qiáng)對(duì)象.

創(chuàng)建增強(qiáng)對(duì)象需要根據(jù)原對(duì)象的類名創(chuàng)建類增強(qiáng)器,還需要根據(jù)原對(duì)象的類型創(chuàng)建子類代理對(duì)象

屬性通過(guò)增強(qiáng)對(duì)象set方法賦值,上一種方式是通過(guò)調(diào)用方法Proxy.newProxyInstance傳參.

public void test3(){

  //創(chuàng)建需要代理增強(qiáng)的對(duì)象
  BookSerice bookSerice = new BookSericeImpl();
  Enhancer enhancer = new Enhancer();
  //用增強(qiáng)器對(duì)象創(chuàng)建類增強(qiáng)器
  enhancer.setClassLoader(bookSerice.getClass().getClassLoader());

  //因?yàn)閯?chuàng)建的代理對(duì)象是目標(biāo)對(duì)象的子類,所以這里填的就是目標(biāo)對(duì)象的類
  enhancer.setSuperclass(bookSerice.getClass());

  //創(chuàng)建代理對(duì)象,這里需要的參數(shù)是Callback接口的對(duì)象,所以需要?jiǎng)?chuàng)建一個(gè)接口的實(shí)現(xiàn)類.
  enhancer.setCallback(new TimeMethodInterceptor(bookSerice));
  //把代理對(duì)象賦給原對(duì)象
  bookSerice = (BookSerice) enhancer.create();
  bookSerice.addOne(new BokBean());
  bookSerice.deletOne(1l);
  
 }

創(chuàng)建Callback接口的實(shí)現(xiàn)類,也就是功能增強(qiáng)部分,

這一部分跟第一種方式的實(shí)現(xiàn)是一樣的,都是通過(guò)反射在添加功能過(guò)程中調(diào)用原方法.

//Callback接口沒(méi)有實(shí)現(xiàn)方法,所以這里實(shí)現(xiàn)的是他的子接口
public class TimeMethodInterceptor implements MethodInterceptor {

 private Object target;

 public TimeMethodInterceptor(Object target) {
  this.target = target;
 }

 @Override
 public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
  //記錄當(dāng)前系統(tǒng)時(shí)間
  //這個(gè)時(shí)間是從1970年1月1日 0點(diǎn)0分到現(xiàn)在的毫秒數(shù)
  long start = System.currentTimeMillis();
  Object value = method.invoke(target, objects);
  long time = System.currentTimeMillis() - start;
  System.out.println("當(dāng)前時(shí)長(zhǎng)"+time+"毫秒");
  return null;
 }
}

總結(jié):

兩種方法的區(qū)別:

第一種是用jdk內(nèi)部方法創(chuàng)建代理對(duì)象,由于創(chuàng)建過(guò)程中需要一個(gè)對(duì)象的接口,所以只能針對(duì)有接口類的對(duì)象進(jìn)行代理.

第二種是利用第三方j(luò)ar包中的增強(qiáng)器(Enhancer)創(chuàng)建代理對(duì)象,通過(guò)set方法給需要的屬性賦值.由于沒(méi)有接口實(shí)現(xiàn),所以創(chuàng)建的是對(duì)

Java的優(yōu)點(diǎn)是什么

1. 簡(jiǎn)單,只需理解基本的概念,就可以編寫(xiě)適合于各種情況的應(yīng)用程序;2. 面向?qū)ο螅?. 分布性,Java是面向網(wǎng)絡(luò)的語(yǔ)言;4. 魯棒性,java提供自動(dòng)垃圾收集來(lái)進(jìn)行內(nèi)存管理,防止程序員在管理內(nèi)存時(shí)容易產(chǎn)生的錯(cuò)誤。;5. 安全性,用于網(wǎng)絡(luò)、分布環(huán)境下的Java必須防止病毒的入侵。6. 體系結(jié)構(gòu)中立,只要安裝了Java運(yùn)行時(shí)系統(tǒng),就可在任意處理器上運(yùn)行。7. 可移植性,Java可以方便地移植到網(wǎng)絡(luò)上的不同機(jī)器。8.解釋執(zhí)行,Java解釋器直接對(duì)Java字節(jié)碼進(jìn)行解釋執(zhí)行。

以上就是java中 AOP的原理是什么,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前標(biāo)題:java中AOP的原理是什么
瀏覽地址:http://aaarwkj.com/article12/pdhidc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、做網(wǎng)站、商城網(wǎng)站小程序開(kāi)發(fā)、營(yíng)銷型網(wǎng)站建設(shè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
日本九州不卡久久精品一区| 日本不卡一二三区在线观看| 欧美成人精品资源在线观看| 欧美一级黄色免费电影| 中文字幕精品人妻在线| 欧美日韩亚洲综合在线| 一卡二卡精品在线免费| 你懂的免费视频中文字幕| 亚洲热久久国产经典视频| 精品熟女少妇av免费久久野外| 国产亚洲精品免费视频| 国产三级在线视频不卡| 91九色精品视频在线观看 | 亚洲欧美日韩综合一区| 亚洲精品在线观看日韩欧美| 亚洲日本国产精品一区| 精品人妻一区二区三区四| 国产精品一区欧美精品| 高清不卡日本一区二区| 色综合婷婷九月中文字幕| 在线亚洲精品一区二区| 欧美黄片在线免费观看| 国产午夜福利片新视觉| 国产国语网站在线观看| 青青草免费在线视频视频| 中文字幕国产精品经典三级 | av天堂精品一区二区三区| 久久久久久亚洲av黄床| 亚洲综合av伊人久久| 欧美亚洲少妇人妻系列| 成人性生交大片免费男同| 深夜毛片一区二区三区| 午夜福利成人在线免费观看| 少妇高潮一区二区三区99| 丰满少妇高潮在线视频| 欧美亚洲综合另类色妞| 中文字幕人成乱码在线观看| 五月婷婷丁香综合中文字幕| 四虎影院成人精品久久| 欧美颜射一区二区三区| 中文字幕日韩av综合在线|