[ SSH框架 ] Spring框架學習之二(Bean的管理和AOP思想)

来源:https://www.cnblogs.com/Kevin-ZhangCG/archive/2018/05/17/9047547.html
-Advertisement-
Play Games

一、Spring的Bean管理(註解方式) 1.1 什麼是註解 要使用註解方式實現Spring的Bean管理,首先要明白什麼是註解。通俗地講,註解就是代碼里的特殊標記,使用註解可以完成相應功能。 註解的寫法:@註解名稱(屬性名稱=屬性值)。 註解的用法:可以使用在類上、方法上和屬性上。 1.2 註解 ...


一、Spring的Bean管理(註解方式)

1.1 什麼是註解

  要使用註解方式實現Spring的Bean管理,首先要明白什麼是註解。通俗地講,註解就是代碼里的特殊標記,使用註解可以完成相應功能。

  註解的寫法:@註解名稱(屬性名稱=屬性值)。

  註解的用法:可以使用在類上、方法上和屬性上。

1.2 註解開發準備工作

  ●  導入jar包,其中包括基本jar包和aop相關的jar包,如下圖:

  

  ●  引入相關約束(除了第一節學習中用到的beans約束,還要加入新的約束),如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" >

1.3 編寫相關的測試類

package com.Kevin.anno;

import org.springframework.stereotype.Component;

/**
 * 使用註解方式在service中調用dao方法
 * @author Kevin
 *
 */

@Component("userDao")      //value屬性名稱可以省略不寫
public class UserDao {
    
    public void add(){
        System.out.println("Dao------");
    }

}

1.4 在配置文件中配置註解掃描

<!-- 開啟註解掃描
        到對應的包里掃描 類、屬性、方法上的註解
     -->
     <context:component-scan base-package="com.Kevin.anno"></context:component-scan>

1.5 在相關的類上添加註解

package com.Kevin.anno;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 使用註解方式在service中調用dao方法
 * @author Kevin
 *
 */

@Service("userService")
public class UserService {
    
    //得到dao對象
    //1.定義dao類型屬性
    //在dao屬性上使用註解完成對象註入
    //@Autowired
    //name屬性值填寫 註解創建dao對象的value值
    @Resource(name="userDao")
    private UserDao userDao;
    
    
    public void add(){
        System.out.println("Service------");
        userDao.add();
    }

}

1.6 編寫測試類進行測試:

package com.Kevin.anno;

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

/**
 * 測試註解創建類對象
 * @author Kevin
 *
 */

public class TestAnno {    
    
    @Test
    public void testService(){
        ApplicationContext context=new ClassPathXmlApplicationContext("beans1.xml");
        
        UserService service=(UserService) context.getBean("userService");
        System.out.println(service);
        service.add();
    }

}

 

二、Spring的Bean管理中常用的註解

2.1 Component組件(作用在類上)

Spring 中提供@Component 的三個衍生註解:(功能目前來講是一致的)

  ●  @Controller:WEB 層

  ●  @Service:業務層

  ●  @Repository:持久層

  這三個註解是為了讓標註類本身的用途清晰,Spring 在後續版本會對其增強

2.2 屬性註入的註解(使用註解註入的方式,可以不用提供set方法)

  ●  @Value:用於註入普通類型。

  ●  @Autowired:自動裝配:

            ①按預設類型進行裝配

            ②按名稱註入:@Qualifier:強制使用名稱註入。

  ●  @Resource:相當於@Autowired和@Qualifier一起使用。

2.3 Bean的作用範圍的註解

  ●  @Scope:

    * singleton:單例

    * prototype:多例

2.4 Bean的生命周期的配置

  ●  @PostConstruct:相當於init-method。

  ●  @PreDestroy:相當於destroy-method。

 

三、Spring的Bean管理方式的比較

XML和註解比較:

  ●  XML:結構清晰.

  ●  註解:開發方便.(屬性註入.)

實際開發中還有一種 XML 和註解整合開發:

  ●  Bean  XML 配置,是使用的屬性使用註解註入。

 

四、AOP的概述

4.1 什麼是AOP

  在軟體業,AOP為Aspect Oriented Programming的縮寫,意為:面向切麵編程,通過預編譯方式和運行期動態代理實現程式功能的統一維護的一種技術。AOP是OOP的延續,是軟體開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生範型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。 

4.2 為什麼學習AOP

  面向切麵編程,擴展功能不通過源代碼修改。AOP採取橫向抽取機制,取代了傳統的縱向繼承體系重覆性代碼。

4.3 Spring的AOP的由來

  AOP 最早由 AOP 聯盟的組織提出的,制定了一套規範.Spring AOP 思想引入到框架中,必須遵守 AOP 聯盟的規範。

4.4 AOP的底層實現

代理機制:

  ●  Spring 的 AOP 的底層用到兩種代理機制:

  ●  JDK 的動態代理 :針對實現了介面的類產生代理.

  ●  Cglib 的動態代理:針對沒有實現介面的類產生代理. 應用的是底層的位元組碼增強的技術 生成當前類的子類對象.

 

五、Spring底層AOP

 

六、Spring 的基於 AspectJ 的 AOP 開發

6.1 AOP開發中相關的術語

  ●  Pointcut切入點,在類中有很多方法可以被增強,而只有實際增強的方法稱為切入點;
  ●  Advice:通知/增強,實際增強的邏輯,被稱為通知/增強,比如拓展日誌功能,日誌功能被稱為通知/增強;

        前置通知:在方法之前執行
        後置通知:在方法之後執行
        異常通知:方法出現異常
        最終通知:在後置之後執行
        環繞通知:在方法之前和之後執行

  ●  Introduction(引介):引介是一種特殊的通知在不修改類代碼的前提下, Introduction 可以在運行期為類動態地添加一些方法或 Field;

  ●  Target(目標對象):代理的目標對象;

  ●  Weaving(織入):是指把增強應用到目標對象來創建新的代理對象的過程(spring 採用動態代理織入,而 AspectJ 採用編譯期織入和類裝在期織入);

  ●  Proxy(代理):一個類被 AOP 織入增強後,就產生一個結果代理類。

  ●  Aspect:切麵,將增強應用到具體方法上的過程稱為切麵(把增強用到切入點過程)
  ●  Joinpoint:連接點,類裡面可以被增強的方法,被稱為連接點

 

七、Spring 使用 AspectJ 進行 AOP 的開發:XML 的方式

7.1 編寫被增強類

package com.Kevin.aop;
/**
 * AOP操作被增強類
 * @author Kevin
 *
 */

public class Book {
    
    public void add(){
        System.out.println("Bookadd-----");
    }

}

7.2 編寫增強類

package com.Kevin.aop;

import org.aspectj.lang.ProceedingJoinPoint;

/**
 * AOP操作增強類
 * 前值增強
 * @author Kevin
 *
 */

public class StrBook {
    
    public void strbefore(){
        System.out.println("Before Strength BookClass---");
    }
    
    public void strafter(){
        System.out.println("Atfer Strentgh BookClass---");        
    }
    
    //環繞增強
    public void straround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        //方法之前
        System.out.println("Before around---");
        //執行被增強方法
        proceedingJoinPoint.proceed();
        //方法之後
        System.out.println("After around---");
    }

}

7.3 編寫測試代碼

package com.Kevin.aop;

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

public class TestUsage {
    
    //AOP前置增強
    @Test
    public void test(){
        ApplicationContext context=new ClassPathXmlApplicationContext("beans3.xml");
        
        Book book=(Book) context.getBean("book");
        book.add();
    }

}

 

八、Spring 的Bean管理:XML+註解 的方式實現 

8.1 使用註解方式註入對象

  創建BookDao和OrdersDao兩個類,在BookService中使用註解的方式註入兩個dao。

package com.Kevin.XMLanno;
/**
 * 配置文件和註解混合使用
 * 創建對象操作使用配置文件方式實現
    註入屬性的操作使用註解方式實現
 * @author Kevin
 *
 */

public class BookDao {
    
    public void book(){
        System.out.println("BookDao----");
    }


}
package com.Kevin.XMLanno;
/**
 * 配置文件和註解混合使用
 * 創建對象操作使用配置文件方式實現
    註入屬性的操作使用註解方式實現
 * @author Kevin
 *
 */

public class OrdersDao {
    
    public void buy(){
        System.out.println("OrdersDao----");
    }


}
package com.Kevin.XMLanno;

import javax.annotation.Resource;

/**
 * 配置文件和註解混合使用
 * 創建對象操作使用配置文件方式實現
    註入屬性的操作使用註解方式實現
 * @author Kevin
 *
 */

public class BookService {
    //得到BookDao和OrdersDao的對象
    @Resource(name="bookDao")
    private BookDao bookDao;
    
    @Resource(name="ordersDao")
    private OrdersDao ordersDao;
    
    public void add(){
        System.out.println("BookService----");
        bookDao.book();
        ordersDao.buy();
    }

}

8.2 用xml配置文件的形式創建對象

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->

    <!-- 開啟註解掃描
        到對應的包里掃描 類、屬性、方法上的註解
     -->
     <context:component-scan base-package="com.Kevin.XMLanno"></context:component-scan>
    
    <!-- 配置對象 -->
    <bean id="bookService" class="com.Kevin.XMLanno.BookService"></bean>
    <bean id="ordersDao" class="com.Kevin.XMLanno.OrdersDao"></bean>
    <bean id="bookDao" class="com.Kevin.XMLanno.BookDao"></bean>

</beans>

 


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

-Advertisement-
Play Games
更多相關文章
  • 目標 使用 PHP 創建 COS 介面所需要的請求簽名,按照官方示例,請求簽名應用在需要身份校驗的場景,即非公有讀許可權時。否則在請求API介面時,就必須攜帶簽名作為請求頭的一部分傳遞。 步驟 準備好用戶信息 1. 將會使用到的用戶信息包括: SecretId:騰訊雲賬號內分配 SecretKey:騰 ...
  • Java開源生鮮電商平臺-賬單模塊的設計與架構(源碼可下載) 補充說明:Java開源生鮮電商平臺-賬單模塊的設計與架構,即用戶的賬單形成過程。 由於系統存在一個押賬功能的需求,(何為押賬,就是形成公司的資金池,類似摩拜單車,ofo單車等等)。目前B2B平臺也是採用押賬的這種功能策略。 這裡有個特別說 ...
  • 今天主要和大家分享的是本人總結的分頁執行方法,也可以說就是分批執行;該篇採用java8新增的表達式來操作,希望能給各位帶來好的幫助和在日常工作中提供便利;同樣的操作流程和邏輯之前用C#代碼寫過一次,有需要的朋友可以看以前的博文; 分頁方式拆分List為多個子集List方法 執行統一方法-無返回值,關 ...
  • Description 補足程式,使得下麵程式輸出的結果是: 100 ~~~~ include include using namespace std; // Your Code Here string Print1() { return " "; } int Print2() { return 1 ...
  • 所有人物的相似圖連接。 關係同上。展示形式為多中心結構 以張無忌的不同身份為中心的網路關係圖。 一、分析結果 實體的不同屬性(張無忌的總多馬甲) 張無忌,無忌,張教主,無忌哥哥,張公子。同一個張無忌有多個身份,不同身份又和不同的人聯繫,有不一樣的相似度。 先來看看圖: 無忌哥哥是過於親密的名字,一般 ...
  • 本文內容: 什麼是集合 Collection Iterator List set Map Collections工具類 首發日期:2018-05-17 什麼是集合: 集合是一種新容器,集合可以存儲數量不固定的元素(數組的空間是固定的,你申請多少空間以後都不能改變),而集合可以動態的增加空間(有些是空... ...
  • 手把手超詳細教程教你Scrapy爬達蓋爾社區,有彩蛋哦! 繁華落盡and曲終人散 2018-05-17 19:11 好了,廢話不多說,學習代碼就是要學以致用的。不能寫了一遍代碼就讓代碼吃灰。下麵就跟我一起來搞吧。 小草網站是個好網站,我們這次實戰的結果,是要把“達蓋爾旗幟”裡面的帖子爬取下來,將帖子 ...
  • "棧“者,存儲貨物或供旅客住宿的地方,可引申為倉庫、中轉站,所以引入到電腦領域里,就是指數據暫時存儲的地方,所以才有進棧、出棧的說法。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...