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
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...