Spring框架第四篇之基於註解的DI註入

来源:http://www.cnblogs.com/Dylansuns/archive/2017/06/30/7096948.html
-Advertisement-
Play Games

一、說明 與@Component註解功能相同,但意義不同的註解還有三個: 1)@Repository:註解在Dao實現類上 2)@Service:註解在Service實現類上 3)@Controller:註解在SpringMVC的處理器上 Bean作用域: @Scope("prototype"):用 ...


一、說明

與@Component註解功能相同,但意義不同的註解還有三個:

1)@Repository:註解在Dao實現類上
2)@Service:註解在Service實現類上
3)@Controller:註解在SpringMVC的處理器上

Bean作用域:
@Scope("prototype"):用於指定對象創建模式,可以是單例模式或者原型模式,預設是singleton

基本類型屬性註入:
@Value

@Autowired:byType方式的註解式註入,即根據類型註解
@Qualifier("mySchool"):byName方式的註解式註入,在使用@Qualifier時必須與@Autowired聯合使用

域屬性註解:
@Resource:不加name屬性則為byType方式的註解式註入,但前提是註入的對象只能有一個
@Resource(name="mySchool"):byName方式的註解式註入

Bean的生命始末:
@PostConstruct:當前Bean初始化剛完畢
@PreDestroy:當前Bean即將被銷毀

@Configuration:表示當前類充當Spring容器,即所有的Bean將由這個類來創建

註意:

  在舉例之前聲明幾個問題:

  1、註解需要依賴spring-aop-4.3.9.RELEASE.jar包,所以需要導入依賴包。

  2、使用註解方式註入,配置文件需要添加約束頭文件:

<?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">

  也可以自己從Spring的說明文檔中找到此頭文件:

  3、如果使用到了SpringJUnit4測試,則還需要導入spring-test-4.3.9.RELEASE.jar包

二、舉例

1、首先創建一個School類:

package com.ietree.spring.basic.annotation.demo1;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("mySchool")
public class School {

    @Value(value = "清華大學")
    private String name;

    public School() {
        super();
    }

    public School(String name) {
        super();
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "School [name=" + name + "]";
    }

}

創建Student類:

package com.ietree.spring.basic.annotation.demo1;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 說明:
 * 與@Component註解功能相同,但意義不同的註解還有三個:
 * 1)@Repository:註解在Dao實現類上
 * 2)@Service:註解在Service實現類上
 * 3)@Controller:註解在SpringMVC的處理器上
 * 
 * Bean作用域:
 * @Scope("prototype"):用於指定對象創建模式,可以是單例模式或者原型模式,預設是singleton
 * 
 * 基本類型屬性註入:
 * @Value
 * 
 * @Autowired:byType方式的註解式註入,即根據類型註解
 * @Qualifier("mySchool"):byName方式的註解式註入,在使用@Qualifier時必須與@Autowired聯合使用
 * 
 * 域屬性註解:
 * @Resource:不加name屬性則為byType方式的註解式註入,但前提是註入的對象只能有一個
 * @Resource(name="mySchool"):byName方式的註解式註入
 * 
 * Bean的生命始末:
 * @PostConstruct:當前Bean初始化剛完畢
 * @PreDestroy:當前Bean即將被銷毀
 */
//@Scope("prototype")
@Component("myStudent")
public class Student {

    @Value(value = "小明")
    private String name;
    
    @Value(value = "25")
    private int age;
    
    //    @Autowired
    //    @Qualifier("mySchool")
    //    @Resource(name="mySchool")
    @Resource
    private School school;// 對象屬性,也叫做域屬性

    public Student() {
        super();
    }
    
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        System.out.println("執行setName()");
        this.name = name;
    }

    public void setAge(int age) {
        System.out.println("執行setAge()");
        this.age = age;
    }

    public void setSchool(School school) {
        this.school = school;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + ", school=" + school + "]";
    }
    
    @PostConstruct
    public void initAfter(){
        System.out.println("當前Bean初始化剛完畢");
    }
    
    @PreDestroy
    public void preDestroy(){
        System.out.println("當前Bean即將被銷毀");
    }
}

創建MyJavaConfig類:

package com.ietree.spring.basic.annotation.demo1;

import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Configuration:表示當前類充當Spring容器,即所有的Bean將由這個類來創建
 */
@Configuration
public class MyJavaConfig {
    
    @Bean(name="mySchool")
    public School mySchoolCreator(){
        return new School("清華大學");
    }
    
    // autowire=Autowire.BY_TYPE:指從當前類這個容器中查找與域屬性的類型具有is-a關係的Bean
    // autowire=Autowire.BY_NAME:指從當前類這個容器中查找與域屬性同名的Bean
    @Bean(name="myStudent", autowire=Autowire.BY_TYPE)
    public Student myStudentCreator(){
        return new Student("小明", 25);
    }
}

創建配置文件:

<?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">
    
    <!-- 掃描 com.ietree.spring.basic.annotation.demo1這個包及其子包 -->
    <context:component-scan base-package="com.ietree.spring.basic.annotation.demo1"/>
    
    <!-- 掃描 com.ietree.spring.basic這個包的子包 -->
    <context:component-scan base-package="com.ietree.spring.basic.*"/>
    
</beans>

創建測試類:

package com.ietree.spring.basic.annotation.demo1;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:com/ietree/spring/basic/annotation/demo1/applicationContext.xml")
public class MyTest {
    
    @Autowired
    private Student student;
    
    @Test
    public void test01() {

        String resource = "com/ietree/spring/basic/annotation/demo1/applicationContext.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(resource);

        School school = (School) ctx.getBean("mySchool");
        System.out.println(school);

        Student student = (Student) ctx.getBean("myStudent");
        System.out.println(student);
        
        ((ClassPathXmlApplicationContext)ctx).close();
    }
    
    public void test02(){
        System.out.println(student);
    }
    
}

 


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

-Advertisement-
Play Games
更多相關文章
  • 前言 ,想利用小程式導航頁面來提升網站的流量,找到 www.xcxdh666.com 該小程式導航網站。 分析網頁 1 發現網站其實也是用非同步分頁請求載入數據的 ,所以根本用不著xpath 解析html,直接分析其請求url 2點擊載入更多找到請求,發現其實就 pageNum ,cagegory 兩 ...
  • 建議 依賴 <package id="Anotar.NLog.Fody" version="3.3.0" targetFramework="net40" developmentDependency="true" /> <package id="Fody" version="2.1.0" target ...
  • 我們習慣在一個單獨的線程中額外執行一些耗時,或者執行一些可能妨礙其他任務的任務的操作,通過多個線程的合理運用,讓客戶端得到更為快速的響應方式。通過利用單獨的線程去執行 CPU 密集型和 IO 密集型的工作,讓用戶界面一直處於活躍狀態。當然,任何事物都具有兩面性,處理不當的話會誘發線程安全的問題。 創 ...
  • ResourcePath屬性 ResourcePath屬性 一、屬性介紹 獲取或設置圖像存儲路徑,預設設置為“image”,表示的ResourcePath是在程式運行路徑下的Image文件夾(bin\Debug\Image); 該屬性可以設置為Resources參數,也可以是實際路徑。使用Resou ...
  • 【增加一條新的數據】 因為使用資料庫先行的模式,所以將數據保存到資料庫的操作變得非常簡單,你只需要寫簡單的幾行代碼就能將對象的實例保存到資料庫中 你也可以使用下麵的方式,將數據保存到資料庫中 當然保存數據也是支持非同步的 【批量數據插入】 Entity Framework提供了AddRange方法,可 ...
  • 在mvvm模式的wpf項目中有個需求需要去載入解決方案的程式集,並且根據程式集去動態載入當前程式集的類,做成下拉框形式。 效果: wpf窗體: ...
  • 本期來討論下,jupyter notebook中怎樣同時安裝python2.7 和python3.x。 ...
  • 介面是什麼,抽象類又是什麼,有了抽象類,我們為什麼還要有介面呢? 抽象類 抽象類的概念: 抽象類是相對於普通類而言的,普通類是一個完善的功能類,可以直接產生實例化對象,並且在普通類中可以包含有構造方法、普通方法、static方法、常量和變數等內容。而抽象類是指在普通類的結構裡面增加抽象方法的組成部分 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...