Spring註解AOP及單元測試junit(6)

来源:https://www.cnblogs.com/bencoper/archive/2019/03/10/10507146.html
-Advertisement-
Play Games

2019-03-10/20:19:56 演示:將xml配置方式改為註解方式 靜態以及動態代理推薦博客:https://blog.csdn.net/javazejian/article/details/56267036 junit單元測試jar包:https://share.weiyun.com/5p ...


2019-03-10/20:19:56

演示:將xml配置方式改為註解方式

靜態以及動態代理推薦博客:https://blog.csdn.net/javazejian/article/details/56267036

junit單元測試jar包:https://share.weiyun.com/5pKuXVL

1.註解配置業務類

  使用@Component("s") 註解ProductService 類表示業務類的Bean名字為 s 

 1 package service;
 2  
 3 import org.springframework.stereotype.Component;
 4  
 5 @Component("s")
 6 public class ProductService {
 7     public void doSomeService(){
 8         System.out.println("doSomeService");
 9     }
10      
11 }

 

2.註解配置切麵AOP

  @Aspect 註解表示這是一個切麵
  @Component 表示這是一個bean,由Spring進行管理
  在切麵類的具體的方法前加上一句,表示這個切點被觸發的時候,執行該函數,用Around方式,相當於把這個切點和這個切點的處理方法關聯起來。

  @Around(value = "execution(* service.ProductService.*(..))") 表示對service.ProductService 這個類中的所有方法進行切麵操作.

  含義就是,當expression中的函數被調用時,就會用around形式來觸發切麵函數,這條語句放在誰前面,誰就被定義為切麵函數,也就是輔助功能。 

 1 package aspect;
 2 import org.aspectj.lang.ProceedingJoinPoint;
 3 import org.aspectj.lang.annotation.Around;
 4 import org.aspectj.lang.annotation.Aspect;
 5 import org.springframework.stereotype.Component;
 6  
 7 @Aspect
 8 @Component
 9 public class LoggerAspect {
10      
11     @Around(value = "execution(* service.ProductService.*(..))")
12     public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
13         System.out.println("start log:" + joinPoint.getSignature().getName());
14         Object object = joinPoint.proceed();
15         System.out.println("end log:" + joinPoint.getSignature().getName());
16         return object;
17     }
18 }

 

3.配置文件applicationContext.xml

  去掉原有的配置添加三行配置  

<context:component-scan base-package="aspect"/>      定義切麵類 <context:component-scan base-package="service"/>     定義業務類   <aop:aspectj-autoproxy/>       找到被註解了的切麵類,進行切麵配置    Spring為了支撐AOP運行,用到了動態代理這種設計模式,這句話的意思就是啟動對AOP的支持。  動態代理以及靜態代理的概念博主也是參考其他的資料在引用中提供了地址  
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:aop="http://www.springframework.org/schema/aop"
 5     xmlns:tx="http://www.springframework.org/schema/tx"
 6     xmlns:context="http://www.springframework.org/schema/context"
 7     xsi:schemaLocation="
 8    http://www.springframework.org/schema/beans
 9    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
10    http://www.springframework.org/schema/aop
11    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
12    http://www.springframework.org/schema/tx
13    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
14    http://www.springframework.org/schema/context     
15    http://www.springframework.org/schema/context/spring-context-3.0.xsd">
16   
17     <context:component-scan base-package="aspect"/>
18     <context:component-scan base-package="service"/>
19     <aop:aspectj-autoproxy/> 
20    
21 </beans>

 

 4.單元測試junit

  1.下載jar包地址在文章引用部分   junit-4.12.jar和hamcrest-all-1.3.jar    記得Add

  2.修改TestSpring

  @RunWith(SpringJUnit4ClassRunner.class) 表示這是一個Spring的測試類

  @ContextConfiguration("classpath:applicationContext.xml")定位Spring的配置文件

  @Autowired給這個測試類裝配Category對象

  @Test測試邏輯,列印c對象的名稱

  3.單元測試用的例子是博主SpringIOC/DI這篇文章中的例子參考鏈接https://www.cnblogs.com/bencoper/p/10494369.html

  4.所有代碼

 TestSpring 

 1 package test;
 2  
 3 import org.junit.Test;
 4 import org.junit.runner.RunWith;
 5 import org.springframework.beans.factory.annotation.Autowired;
 6 import org.springframework.test.context.ContextConfiguration;
 7 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 8  
 9 import pojo.Category;
10  
11 @RunWith(SpringJUnit4ClassRunner.class)
12 @ContextConfiguration("classpath:applicationContext.xml")
13 public class TestSpring {
14     @Autowired
15     Category c;
16  
17     @Test
18     public void test(){
19         System.out.println(c.getName());
20     }
21 }

 

 1 package com.how2java.test;
 2 
 3 import org.springframework.context.ApplicationContext;
 4 
 5 import org.springframework.context.support.ClassPathXmlApplicationContext;
 6 
 7 import pojo.Category;
 8 
 9 public class TestSpringOldWay {
10 
11     public static void main(String[] args) {
12         ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
13 
14         Category c = (Category) context.getBean("c");
15 
16         System.out.println(c.getName());
17     }
18 }
TestSpringOldWay
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:aop="http://www.springframework.org/schema/aop"
 5     xmlns:tx="http://www.springframework.org/schema/tx"
 6     xmlns:context="http://www.springframework.org/schema/context"
 7     xsi:schemaLocation="
 8    http://www.springframework.org/schema/beans 
 9    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
10    http://www.springframework.org/schema/aop 
11    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
12    http://www.springframework.org/schema/tx 
13    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
14    http://www.springframework.org/schema/context      
15    http://www.springframework.org/schema/context/spring-context-3.0.xsd">
16  
17     <bean name="c" class="pojo.Category">
18         <property name="name" value="category 1" />
19     </bean>
20  
21 </beans>
applicationContext.xml
 1 package pojo;
 2  
 3 public class Category {
 4     private int id;
 5     private String name;
 6  
 7     public int getId() {
 8         return id;
 9     }
10     public void setId(int id) {
11         this.id = id;
12     }
13     public String getName() {
14         return name;
15     }
16     public void setName(String name) {
17         this.name = name;
18     }
19 
20 }
Category.java

 測試結果

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 忙瘋警告,這兩天可能進度很慢,下午打了一下午訓練賽,訓練賽的題我就不拿過來的,pta就做了一點點,明天又是滿課的一天,所以進度很慢啦~ L1-021 重要的話說三遍 這道超級簡單的題目沒有任何輸入。 你只需要把這句很重要的話 —— “I'm gonna WIN!”——連續輸出三遍就可以了。 註意每遍 ...
  • 因為極驗官網給的是用session作為驗證的,而我們做前後端分離的用的是token,而不是session,所以對於目前來說就不適用了,所以需要根據具體業務邏輯來改動。當然,大佬可以直接忽略 好的,直接上例子: 還是用的 Python高級應用(3)—— 為你的項目添加驗證碼 這文章最後的Lo... ...
  • 新聞 ".NET Core 3預覽版3之宣告" .NET Core 3.0將在2019年下半年發佈 .NET Standard 2.1的首個預覽版 Docker與cgroup的記憶體限制 "LambdAle 2019徵文" "使用TypeShape生成透鏡" "為什麼使用Ply(F的高性能TPL類庫) ...
  • Problem Description In this problem, your task is to calculate SUM(n) = 1 + 2 + 3 + ... + n. Input The input will consist of a series of integers n, o ...
  • 一、什麼是AOP? Aspect oritention programming(面向切麵編程),AOP是一種思想,高度概括的話是“橫向重覆,縱向抽取”,如何理解呢?舉個例子:訪問頁面時需要許可權認證,如果每個頁面都去實現方法顯然是不合適的,這個時候我們就可以利用切麵編程。 每個頁面都去實現這個方法就是 ...
  • 參考鏈接:1. 解析H264的SPS信息 https://blog.csdn.net/lizhijian21/article/details/80982403 2. h.264的POC計算 https://www.cnblogs.com/TaigaCon/p/3551001.html 3. 視音頻數 ...
  • 綠茶小說系統是綠茶科技旗下自主開發的小說系統,可以​‌‌支持定製小說網站,小說網站開發,小說網站系統,小說網站源碼,小說網站開發建設,小說網站程式,微信小說網站源碼,一套小說網站管理系統,完整版小說,付費看小說,小說下載等欄目版塊,可以支持定製電腦版+手機版+微信版+小程式版+APP版,由10年的技 ...
  • I. 數據類型 Python3將程式中的任何內容統稱為對象(Object),基本的數據類型有數字和字元串等,也可以使用自定義的類(Classes)創建新的類型。 Python3中有六個標準的數據類型: Number(數字) String(字元串) List(列表) Tuple(元組) Set(集合) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...