真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

springAOP的三種實現(xiàn)方式分別是什么

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)springAOP的三種實現(xiàn)方式分別是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)公司是一家專業(yè)提供威縣企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、成都網(wǎng)站建設(shè)H5頁面制作、小程序制作等業(yè)務(wù)。10年已為威縣眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計公司優(yōu)惠進(jìn)行中。

springAOP的實現(xiàn)方式

三種
純XML方式,XML+注解,純注解方式。

Spring 實現(xiàn)AOP思想使?的是動態(tài)代理技術(shù)
默認(rèn)情況下, Spring會根據(jù)被代理對象是否實現(xiàn)接?來選擇使?JDK還是CGLIB。當(dāng)被代理對象沒有實現(xiàn)

任何接?時, Spring會選擇CGLIB。當(dāng)被代理對象實現(xiàn)了接?, Spring會選擇JDK官?的代理技術(shù),不過

我們可以通過配置的?式,讓Spring強制使?CGLIB。

接下來我們開始實現(xiàn)aop,
需求是:橫切邏輯代碼是打印?志,希望把打印?志的邏輯織?到?標(biāo)?法的特定位置(service層transfer?法)

純XML方式

引入aop相關(guān)的jar包


   org.springframework
   spring-aop
   5.1.12.RELEASE
   org.aspectj
   aspectjweaver
   1.9.4

TransferServiceImpl.java文件:

package com.lagou.edu.service.impl;import com.lagou.edu.dao.AccountDao;import com.lagou.edu.pojo.Account;import com.lagou.edu.service.TransferService;import com.lagou.edu.utils.ConnectionUtils;import com.lagou.edu.utils.TransactionManager;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.ImportResource;import org.springframework.stereotype.Component;import org.springframework.stereotype.Service;/**
 * @author 應(yīng)癲
 */@Service("transferService")public class TransferServiceImpl implements TransferService {    // 最佳狀態(tài)
    // @Autowired 按照類型注入 ,如果按照類型無法唯一鎖定對象,可以結(jié)合@Qualifier指定具體的id
    @Autowired
    @Qualifier("accountDao")    private AccountDao accountDao;    @Override
    public void transfer(String fromCardNo, String toCardNo, int money) throws Exception {        /*try{
            // 開啟事務(wù)(關(guān)閉事務(wù)的自動提交)
            TransactionManager.getInstance().beginTransaction();*/
            System.out.println("執(zhí)行轉(zhuǎn)賬業(yè)務(wù)邏輯");
            Account from = accountDao.queryAccountByCardNo(fromCardNo);
            Account to = accountDao.queryAccountByCardNo(toCardNo);
            from.setMoney(from.getMoney()-money);
            to.setMoney(to.getMoney()+money);
            accountDao.updateAccountByCardNo(to);            //int c = 1/0;
            accountDao.updateAccountByCardNo(from);
    }
}

打印日志Util:

package com.lagou.edu.utils;/**
 * @author 應(yīng)癲
 */public class LogUtils {    /**
     * 業(yè)務(wù)邏輯開始之前執(zhí)行
     */
    
    public void beforeMethod(JoinPoint joinPoint) {
          Object[] args = joinPoint.getArgs();        for (int i = 0; i < args.length; i++) {
            Object arg = args[i];
            System.out.println(arg);
        }
        System.out.println("業(yè)務(wù)邏輯開始執(zhí)行之前執(zhí)行.......");
    }    /**
     * 業(yè)務(wù)邏輯結(jié)束時執(zhí)行(無論異常與否)
     */
    public void afterMethod() {
        System.out.println("業(yè)務(wù)邏輯結(jié)束時執(zhí)行,無論異常與否都執(zhí)行.......");
    }    /**
     * 異常時時執(zhí)行
     */
    public void exceptionMethod() {
        System.out.println("異常時執(zhí)行.......");
    }    /**
     * 業(yè)務(wù)邏輯正常時執(zhí)行
     */
    public void successMethod(Object retVal) {
        System.out.println("業(yè)務(wù)邏輯正常時執(zhí)行.......");
    }
}public Object arroundMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("環(huán)繞通知中的beforemethod....");
        Object result = null;        try{            // 控制原有業(yè)務(wù)邏輯是否執(zhí)行
            // result = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs());
        }catch(Exception e) {
            System.out.println("環(huán)繞通知中的exceptionmethod....");
        }finally {
            System.out.println("環(huán)繞通知中的after method....");
        }        return result;
    }

applicationContext.xml


    
   
   
    
        
           
           
           
           
         
           
           
            
           
           
            
           
            
        
    -->

測試:

    /**
     * 測試xml aop
     */
    @Test
    public void testXmlAop() throws Exception {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        TransferService transferService = applicationContext.getBean(TransferService.class);
        transferService.transfer("6029621011000","6029621011001",100);
    }

環(huán)繞通知不和前置及后置通知一起使用,因為環(huán)繞通知可以實現(xiàn)前置和后置的功能,并且可以控制原有業(yè)務(wù)邏輯是否執(zhí)行,非常強大。

XML+注解方式

將上面純XML方式改為注解方式
將applicationContext.xml中的內(nèi)容取掉,改為類中添加注解:

package com.lagou.edu.utils;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;import org.springframework.stereotype.Component;/**
 * @author 應(yīng)癲
 */@Component@Aspectpublic class LogUtils {    @Pointcut("execution(* com.lagou.edu.service.impl.TransferServiceImpl.*(..))")    public void pt1(){
    }    /**
     * 業(yè)務(wù)邏輯開始之前執(zhí)行
     */
    @Before("pt1()")    public void beforeMethod(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();        for (int i = 0; i < args.length; i++) {
            Object arg = args[i];
            System.out.println(arg);
        }
        System.out.println("業(yè)務(wù)邏輯開始執(zhí)行之前執(zhí)行.......");
    }    /**
     * 業(yè)務(wù)邏輯結(jié)束時執(zhí)行(無論異常與否)
     */
    @After("pt1()")    public void afterMethod() {
        System.out.println("業(yè)務(wù)邏輯結(jié)束時執(zhí)行,無論異常與否都執(zhí)行.......");
    }    /**
     * 異常時時執(zhí)行
     */
    @AfterThrowing("pt1()")    public void exceptionMethod() {
        System.out.println("異常時執(zhí)行.......");
    }    /**
     * 業(yè)務(wù)邏輯正常時執(zhí)行
     */
    @AfterReturning(value = "pt1()",returning = "retVal")    public void successMethod(Object retVal) {
        System.out.println("業(yè)務(wù)邏輯正常時執(zhí)行.......");
    }    /**
     * 環(huán)繞通知
     *
     */
    /*@Around("pt1()")*/
    public Object arroundMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("環(huán)繞通知中的beforemethod....");
        Object result = null;        try{            // 控制原有業(yè)務(wù)邏輯是否執(zhí)行
            // result = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs());
        }catch(Exception e) {
            System.out.println("環(huán)繞通知中的exceptionmethod....");
        }finally {
            System.out.println("環(huán)繞通知中的after method....");
        }        return result;
    }
}

在application.xml中配置注解驅(qū)動:

    
    

純注解模式

我們只需要替換掉xml+注解模式中的注解驅(qū)動的部分即可,

    
    

改為 @EnableAspectJAutoProxy //開啟spring對注解AOP的?持,在項目中添加到任意個配置類上即可。

上述就是小編為大家分享的springAOP的三種實現(xiàn)方式分別是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


分享標(biāo)題:springAOP的三種實現(xiàn)方式分別是什么
當(dāng)前地址:http://weahome.cn/article/ippsdp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部