成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Spring還可以這么學--AOP

chinafgj / 3409人閱讀

摘要:還可以這么學上一篇文章還可以這么學控制反轉(zhuǎn)依賴注入理解什么是,即面向切面編程,可以說是,面向?qū)ο缶幊痰难a充和完善。

Spring還可以這么學--AOP

上一篇文章Spring還可以這么學--IoC(控制反轉(zhuǎn)) / DI(依賴注入)理解

1. 什么是AOP?

AOP(Aspect Oriented Programming),即面向切面編程,可以說是OOP(Object Oriented Programming,面向?qū)ο缶幊蹋┑难a充和完善。

2. AOP的作用?

利用一種稱為"橫切"的技術(shù),剖解開封裝的對象內(nèi)部,并將那些影響了多個類的公共行為封裝到一個可重用模塊,并將其命名為"Aspect",即切面。所謂"切面",簡單說就是那些與業(yè)務無關(guān),卻為業(yè)務模塊所共同調(diào)用的邏輯或責任封裝起來,便于減少系統(tǒng)的重復代碼,降低模塊之間的耦合度,并有利于未來的可操作性和可維護性。

首先我們來看沒有AOP時,如果我們要做日志處理,就得在每個方法中添加

但大多數(shù)日志處理代碼都是相同的,所以我們將日志處理抽離成一個新的方法,但是盡管這樣,我們還得手動插入這些方法。

但這樣代碼的耦合度很高,當我們要更改這個功能時,就得一個個更改

使用AOP后

為了在指定位置執(zhí)行這些橫向的功能,需要知道指定的是什么地方

例如上圖,方法級別的aop實現(xiàn),在一個程序執(zhí)行鏈條中,把method2稱為切點,也就是說在method2執(zhí)行時會執(zhí)行橫切的功能,那么是在method2之前還是之后呢,又是執(zhí)行什么呢?這些都由advice(通知)來指定。
Spring 方面可以使用下面提到的五種通知工作:

3. AOP的核心概念

橫切關(guān)注點:對哪些方法進行攔截,攔截后怎么處理,這些關(guān)注點稱之為橫切關(guān)注點

切面(aspect):類是對物體特征的抽象,切面就是對橫切關(guān)注點的抽象

連接點(joinpoint):被攔截到的點,因為Spring只支持方法類型的連接點,所以在Spring中連接點指的就是被攔截到的方法,實際上連接點還可以是字段或者構(gòu)造器

切入點(pointcut):對連接點進行攔截的定義

通知(advice):所謂通知指的就是指攔截到連接點之后要執(zhí)行的代碼,通知分為前置、后置、異常、最終、環(huán)繞通知五類

目標對象:代理的目標對象

織入(weave):將切面應用到目標對象并導致代理對象創(chuàng)建的過程

引入(introduction):在不修改代碼的前提下,引入可以在運行期為類動態(tài)地添加一些方法或字段

4. 實現(xiàn)方式 Spring AOP的XML實現(xiàn)方式

Employee.java文件

package com.wangc;

public class Employee {
    private String name;
    private int age;
    public String getName() {
        System.out.println("name = "+name);
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        System.out.println("age = "+age);
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void printThrowException() {
        System.out.println("發(fā)生異常");
        throw new IllegalArgumentException();
    }
}

Logging.java文件

package com.wangc;

public class Logging {
    //在一個方法執(zhí)行之前,執(zhí)行通知。
    public void beforeAdvice(){
        System.out.println("執(zhí)行employee的方法之前執(zhí)行.");
    }
    //在一個方法執(zhí)行之后,不考慮其結(jié)果,執(zhí)行通知。
    public void afterAdvice(){
        System.out.println("執(zhí)行employee的方法之后執(zhí)行.");
    }
    //在一個方法執(zhí)行之后,只有在方法成功完成時,才能執(zhí)行通知。
    public void afterReturningAdvice(Object retVal){
        System.out.println("返回:" + retVal.toString() );
    }
    //在一個方法執(zhí)行之后,只有在方法退出拋出異常時,才能執(zhí)行通知。
    public void AfterThrowingAdvice(IllegalArgumentException ex){
        System.out.println("拋出了一個異常: " + ex.toString());   
    }  
}

Beans.xml文件




   
      
      
         
         
         
         
         
         
         
         
         
         
      
   

   
      
            
   

    

MyApp.java文件

package com.wangc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
        Employee employee = (Employee) context.getBean("employee");
        employee.getName();
        employee.getAge();
        employee.printThrowException();
    }
}

執(zhí)行結(jié)果:

執(zhí)行employee的方法之前執(zhí)行.
name = zhangsan
執(zhí)行employee的方法之后執(zhí)行.
返回:zhangsan
執(zhí)行employee的方法之前執(zhí)行.
age = 28
執(zhí)行employee的方法之后執(zhí)行.
返回:28
執(zhí)行employee的方法之前執(zhí)行.
發(fā)生異常
執(zhí)行employee的方法之后執(zhí)行.
拋出了一個異常: java.lang.IllegalArgumentException
Exception in thread "main" java.lang.IllegalArgumentException
......

注意:上面的例子只有一個橫切關(guān)注點,如果有多個橫切關(guān)注點,可以使用aspect里的order屬性來控制橫切關(guān)注點的順序。

......
   
      
         
         
      
      
         
         
      
   
   ......
Spring AOP 的 @AspectJ實現(xiàn)方式

這里只需要在上面的基礎(chǔ)上修改以下兩個文件就可實現(xiàn),修改后的文件如下:
Beans.xml文件




    
    

    
       
             
    

     

Logging.java文件

package com.wangc;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class Logging {
    @Pointcut("execution(* com.wangc.*.*(..))")
    private void all() {
    }
    //在一個方法執(zhí)行之前,執(zhí)行通知。
    @Before("all()")
    public void beforeAdvice(){
        System.out.println("執(zhí)行employee的方法之前執(zhí)行.");
    }
    //在一個方法執(zhí)行之后,不考慮其結(jié)果,執(zhí)行通知。
    @After("all()")
    public void afterAdvice(){
        System.out.println("執(zhí)行employee的方法之后執(zhí)行.");
    }
    //在一個方法執(zhí)行之后,只有在方法成功完成時,才能執(zhí)行通知。
    @AfterReturning(pointcut = "all()", returning="retVal")
    public void afterReturningAdvice(Object retVal){
        System.out.println("返回:" + retVal.toString() );
    }
    //在一個方法執(zhí)行之后,只有在方法退出拋出異常時,才能執(zhí)行通知。
    @AfterThrowing(pointcut = "all()", throwing="ex")
    public void AfterThrowingAdvice(IllegalArgumentException ex){
        System.out.println("拋出了一個異常: " + ex.toString());   
    }  
}

這里做個簡單的說明: 用@Aspect的注解來標識切面,注意不要把它漏了,否則Spring創(chuàng)建代理的時候會找不到它,@Pointcut注解指定了切點,@Before、@After、@AfterReturning和@AfterThrowing指定了運行時的通知。

運行結(jié)果:

執(zhí)行employee的方法之前執(zhí)行.
name = zhangsan
執(zhí)行employee的方法之后執(zhí)行.
返回:zhangsan
執(zhí)行employee的方法之前執(zhí)行.
age = 28
執(zhí)行employee的方法之后執(zhí)行.
返回:28
執(zhí)行employee的方法之前執(zhí)行.
發(fā)生異常
執(zhí)行employee的方法之后執(zhí)行.
拋出了一個異常: java.lang.IllegalArgumentException
Exception in thread "main" java.lang.IllegalArgumentException
......

上一篇文章Spring還可以這么學--IoC(控制反轉(zhuǎn)) / DI(依賴注入)理解

QQ學習交流群:713479727
微信學習交流群:微信群加入方式【公眾號下方菜單欄-->學習資源-->微信群】
微信公眾號:EverydayCoding 或掃描下方二維碼
歡迎大家加入。。。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69322.html

相關(guān)文章

  • Spring AOP就是這么簡單啦

    摘要:是一種特殊的增強切面切面由切點和增強通知組成,它既包括了橫切邏輯的定義也包括了連接點的定義。實際上,一個的實現(xiàn)被拆分到多個類中在中聲明切面我們知道注解很方便,但是,要想使用注解的方式使用就必須要有源碼因為我們要 前言 只有光頭才能變強 上一篇已經(jīng)講解了Spring IOC知識點一網(wǎng)打盡!,這篇主要是講解Spring的AOP模塊~ 之前我已經(jīng)寫過一篇關(guān)于AOP的文章了,那篇把比較重要的知...

    Jacendfeng 評論0 收藏0
  • Aop?看這篇文章就夠了!??!

    摘要:又是什么其實就是一種實現(xiàn)動態(tài)代理的技術(shù),利用了開源包,先將代理對象類的文件加載進來,之后通過修改其字節(jié)碼并且生成子類。 在實際研發(fā)中,Spring是我們經(jīng)常會使用的框架,畢竟它們太火了,也因此Spring相關(guān)的知識點也是面試必問點,今天我們就大話Aop。特地在周末推文,因為該篇文章閱讀起來還是比較輕松詼諧的,當然了,更主要的是周末的我也在充電學習,希望有追求的朋友們也盡量不要放過周末時...

    boredream 評論0 收藏0
  • SpringBoot自動配置原理

    摘要:開啟自動配置功能后文詳解這個注解,學過的同學應該對它不會陌生,就是掃描注解,默認是掃描當前類下的。簡單來說,這個注解可以幫助我們自動載入應用程序所需要的所有默認配置。簡單理解這二者掃描的對象是不一樣的。 前言 只有光頭才能變強。 文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y 回顧前面Spring的文章(以學習...

    Rainie 評論0 收藏0
  • Java編程需要注意的地方

    摘要:學編程真的不是一件容易的事不管你多喜歡或是多會編程,在學習和解決問題上總會碰到障礙。熟練掌握核心內(nèi)容,特別是和多線程初步具備面向?qū)ο笤O計和編程的能力掌握基本的優(yōu)化策略。   學Java編程真的不是一件容易的事,不管你多喜歡或是多會Java編程,在學習和解決問題上總會碰到障礙。工作的時間越久就越能明白這個道理。不過這倒是一個讓人進步的機會,因為你要一直不斷的學習才能很好的解決你面前的難題...

    leanxi 評論0 收藏0
  • SpringBoot就是這么簡單

    摘要:熱加載代表的是我們不需要重啟服務器,就能夠類檢測得到,重新生成類的字節(jié)碼文件無論是熱部署或者是熱加載都是基于類加載器來完成的。驗證階段字節(jié)碼文件不會對造成危害準備階段是會賦初始值,并不是程序中的值。 一、SpringBoot入門 今天在慕課網(wǎng)中看見了Spring Boot這么一個教程,這個Spring Boot作為JavaWeb的學習者肯定至少會聽過,但我是不知道他是什么玩意。 只是大...

    whinc 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<