spring筆記--通過註解(annotation)配置Bean

来源:http://www.cnblogs.com/fingerboy/archive/2016/03/15/5281780.html
-Advertisement-
Play Games

Spring能夠在classpath下自動掃描,偵測和實例化具有特定註解的組件,這在Spring中成為組件掃描(Component scanning). @Component:基本註解,標識了一個受spring管理的組件. @Repository:標識持久層組件 @Service:標識服務層(業務層


  Spring能夠在classpath下自動掃描,偵測和實例化具有特定註解的組件,這在Spring中成為組件掃描(Component scanning).

特定組件的註解包括:

    @Component:基本註解,標識了一個受spring管理的組件.

      @Repository:標識持久層組件

    @Service:標識服務層(業務層)組件

    @Controller:標識表現層組件

      對於掃描上的組件,Spring有預設的命名策略,使用非限定類名,第一個字母小寫,也可以在註解中通過value屬性值表示組件的名稱.

  當在組件上使用了特定的註解之後,還需要在spring的配置文件中聲明:

 <context:component-scan base-package="com.wang" resource-pattern="dao/*.class"></context:component-scan>

  其中bese-package是必須的屬性,resource-pattern是可選的屬性

    bese-package:制定一個需要掃描的基類包Spring容器將會掃描這個基類包及其子類包中的所有類.當需要掃描多個包時,可以使用逗號隔開.

    resource-pattern:如果僅希望掃描特定的類,而非基包下的所有類,可以使用這個屬性過濾特定的類.如上即表示只掃描com.wang的子包dao中的所有類.

組件裝配:

  <context:component-scan>元素還會自動註冊AutowiredAnnotationBeanPostProcessor實例,該實例可以自動裝配具有@autowired,@Resource,@Inject註解的屬性.

使用@Autowired自動裝配bean:

  @Autowired註解自動裝配具有相容類型的單個Bean屬性:

    構造器,普通欄位,一切具有參數的方法上都可以使用@autowired

    預設情況下,所有使用@Autowired註解的屬性都需要被設置,當Spring找不到匹配的Bean裝配屬性時,會拋出異常,如果某一屬性允許不被設置,可以設置@Autowired註解的required=false

    預設情況下,當IOC容器中存在多個類型相容的bean時,通過類型的自動裝配將無法工作,此時可以在@Qualifier註解里提供Bean的名稱.

    @Autowired註解也可以應用在數組類型,集合屬性,Map類型上.

 

下麵通過一個例子,來應用一下上面的知識點,包結構和類如下,是一個簡單的mvc結構對User實現增刪改查的例子:

User類:

//主要演示註解,這裡不再定義屬性
public class User {

}

UserDao介面:

public interface UserDao {

    public void add();
    public void delete();
    public void update();
    public void search();
}

UserDaoImpl類:

@Repository
public class UserDaoImpl implements UserDao {

    @Override
    public void add() {
        System.out.println("添加用戶");
    }
    @Override
    public void delete() {
        System.out.println("刪除用戶");
    }
    @Override
    public void update() {
        System.out.println("更新用戶");
    }
    @Override
    public void search() {

        System.out.println("查詢用戶");
    }

}

UserService類:

@Service
public class UserService {

    @Autowired
    private UserDao userDao;
    
    
    public void add() {
        userDao.add();
        System.out.println("service add..");
        
    }
    public void delete() {
        userDao.delete();
        System.out.println("service delete..");
        
    }
    public void update() {
        userDao.update();
        System.out.println("service update..");
        
    }
    public void search() {
        userDao.search();
        System.out.println("service search..");
        
    }
}

UserAction類:

@Controller
public class UserAction {

    @Autowired
    private UserService userService;
    
    @Autowired(required=false)
    private User user;
    public String add(){
    
        userService.add();
        System.out.println("UserAction add..");
        System.out.println(user);
        return null;
    }
    public String delete(){
        
        userService.delete();
        System.out.println("UserAction delete..");
        return null;
    }
    public String update(){
        
        userService.update();
        System.out.println("UserAction update..");
        return null;
    }
    public String search(){
        
        userService.search();
        System.out.println("UserAction search..");
        return null;
    }
    
}

配置文件beans.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:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        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-4.2.xsd">
   
<context:component-scan base-package="com.wang" />

</beans>

測試代碼:

public class Test1 {

    public static void main(String[] args) {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
        
    UserAction userAction=(UserAction) ctx.getBean("userAction");
    userAction.add();
    
    }
}

列印結果:

添加用戶
service add..
UserAction add..
null

因為在User類中,我們沒有添加任何註解信息,而在UserAction類中定義屬性user時,又在@Autowired中添加了required="false",所有列印出來的user為null.


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

-Advertisement-
Play Games
更多相關文章
  • 放養的小爬蟲 京東定向爬蟲(AJAX獲取價格數據) === 筆者聲明:只用於學習交流,不用於其他途徑。源代碼已上傳github。githu地址:https://github.com/Erma Wang/Spider 筆者聲明:只用於學習交流,不用於其他途徑。源代碼已上傳github。githu地址:
  • 1.Java線程間通信對程式員透明,但是其記憶體可見性問題會引發其他怪異的問題; 2.在並法編程中,需要考慮兩個關鍵問題:1.線程間如何通信 2.線程間如何同步 3.在命令式編程中,線程之間的通信有兩種:1.共用記憶體 2.消息傳遞 4.共用記憶體->線程之間共用程式的公共狀態,通過讀—寫該記憶體中公共狀態
  • 工作忙的已經與世隔絕了! 這一年多加班,看著刷臉機上入職時的照片,現在的自己蒼老了至少五歲! 自己的引擎依然沒有時間弄,甚至連開發工具都沒有時間更新 早前幾年一直在合租房子,所以總有和MM的故事,最近幾年都是一個人住,艷遇就沒再發生過! 不過前幾天隔壁的隔壁的一個94年的小丫頭竟然在我門上貼了一個要
  • 本篇分為兩部分: 一、柯里化的基本使用 柯里化(Currying):也就是把接受多個參數的方法變換成接受第一個參數的方法,並且返回接受餘下的參數並且返回結果的新方法。 然後通過只傳入第一個括弧內的參數進行調用,這樣將返回另一個方法 二、柯里化的使用場景 柯里化是一種量產相似方法的好辦法,可以通過柯里
  • 一個模塊(以*.dll或*.blp的文件格式)要被框架所載入 可依據以下規範 創建一個單元文件 XXXXModule.pas,比如 StarModuleOneModule.pas 引用 StarOfficeModule.pas,這裡定義了一個導出函數 GetStarModuleClass 同時XXX
  • 自增運算符++有首碼和尾碼兩種,在搭配間接訪問運算符*時,因為順序、括弧和結合關係的影響,很容易讓人產生誤解,產生錯誤的結果,這篇文章來詳細分析一下這幾種運算符的不同搭配情況。 ++、--和*的優先順序順序 在C語言運算符的優先順序順序中,尾碼的++和--運算符運算優先順序16,結合關係是從左到右;簡介訪...
  • 以下內容基於jdk1.7.0_79源碼; 基於哈希表的一個Map介面實現,存儲的對象是一個鍵值對對象(Entry<K,V>); 基於數組和鏈表實現,內部維護著一個數組table,該數組保存著每個鏈表的表頭結點;查找時,先通過hash函數計算hash值,再根據hash值計算數組索引,然後根據索引找到鏈
  • 在hibernate中我們知道如果要從資料庫中得到一個對象,通常有兩種方式,一種是通過session.get()方法,另一種就是通過session.load()方法,然後其實這兩種方法在獲得一個實體對象時是有區別的,在查詢性能上兩者是不同的。 當使用load方法來得到一個對象時,此時hibernat
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...