国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring還可以這么學(xué)--AOP

chinafgj / 3405人閱讀

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

Spring還可以這么學(xué)--AOP

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

1. 什么是AOP?

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

2. AOP的作用?

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

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

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

但這樣代碼的耦合度很高,當(dāng)我們要更改這個(gè)功能時(shí),就得一個(gè)個(gè)更改

使用AOP后

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

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

3. AOP的核心概念

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

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

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

切入點(diǎn)(pointcut):對(duì)連接點(diǎn)進(jìn)行攔截的定義

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

目標(biāo)對(duì)象:代理的目標(biāo)對(duì)象

織入(weave):將切面應(yīng)用到目標(biāo)對(duì)象并導(dǎo)致代理對(duì)象創(chuàng)建的過程

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

4. 實(shí)現(xiàn)方式 Spring AOP的XML實(shí)現(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 {
    //在一個(gè)方法執(zhí)行之前,執(zhí)行通知。
    public void beforeAdvice(){
        System.out.println("執(zhí)行employee的方法之前執(zhí)行.");
    }
    //在一個(gè)方法執(zhí)行之后,不考慮其結(jié)果,執(zhí)行通知。
    public void afterAdvice(){
        System.out.println("執(zhí)行employee的方法之后執(zhí)行.");
    }
    //在一個(gè)方法執(zhí)行之后,只有在方法成功完成時(shí),才能執(zhí)行通知。
    public void afterReturningAdvice(Object retVal){
        System.out.println("返回:" + retVal.toString() );
    }
    //在一個(gè)方法執(zhí)行之后,只有在方法退出拋出異常時(shí),才能執(zhí)行通知。
    public void AfterThrowingAdvice(IllegalArgumentException ex){
        System.out.println("拋出了一個(gè)異常: " + 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í)行.
拋出了一個(gè)異常: java.lang.IllegalArgumentException
Exception in thread "main" java.lang.IllegalArgumentException
......

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

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

這里只需要在上面的基礎(chǔ)上修改以下兩個(gè)文件就可實(shí)現(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() {
    }
    //在一個(gè)方法執(zhí)行之前,執(zhí)行通知。
    @Before("all()")
    public void beforeAdvice(){
        System.out.println("執(zhí)行employee的方法之前執(zhí)行.");
    }
    //在一個(gè)方法執(zhí)行之后,不考慮其結(jié)果,執(zhí)行通知。
    @After("all()")
    public void afterAdvice(){
        System.out.println("執(zhí)行employee的方法之后執(zhí)行.");
    }
    //在一個(gè)方法執(zhí)行之后,只有在方法成功完成時(shí),才能執(zhí)行通知。
    @AfterReturning(pointcut = "all()", returning="retVal")
    public void afterReturningAdvice(Object retVal){
        System.out.println("返回:" + retVal.toString() );
    }
    //在一個(gè)方法執(zhí)行之后,只有在方法退出拋出異常時(shí),才能執(zhí)行通知。
    @AfterThrowing(pointcut = "all()", throwing="ex")
    public void AfterThrowingAdvice(IllegalArgumentException ex){
        System.out.println("拋出了一個(gè)異常: " + ex.toString());   
    }  
}

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

運(yùn)行結(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í)行.
拋出了一個(gè)異常: java.lang.IllegalArgumentException
Exception in thread "main" java.lang.IllegalArgumentException
......

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/69322.html

相關(guān)文章

  • Spring AOP就是這么簡單啦

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

    Jacendfeng 評(píng)論0 收藏0
  • 學(xué)Aop?看這篇文章就夠了!!!

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

    boredream 評(píng)論0 收藏0
  • SpringBoot自動(dòng)配置原理

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

    Rainie 評(píng)論0 收藏0
  • 學(xué)Java編程需要注意的地方

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

    leanxi 評(píng)論0 收藏0
  • SpringBoot就是這么簡單

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

    whinc 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<