三種配置Spring程序的方法

1 使用XML文件配置Spring程序

在XML文件中使用bean標簽,將其交給容器管理

  • class: 指定bean對應的類型的全限定名稱
  • id: 用于指定一個名稱,作為該bean的唯一標識符,如果不需要id,也可不指定該屬性
  • name: 用于指定bean的別名,多個的使用空格或逗號或分號分割
  • scope: 指定bean的范圍,決定了bean實例化的數量
    scope有效值:
    ? ? ? ? singleton: 默認值,單例,每次請求一個bean,返回的是同一個共享實例
    ? ? ? ? prototype: 原型,每次請求一個bean,獲取的是一個新的實例
    ? ? ? ? 其他值包括:request, session, application, websocket等,是在web程序中使用
<bean id="dog" name="gou,quan" class="com.qdu.bean.Dog"scope="prototype" /><bean id="sheep" class="com.qdu.bean.Sheep" /><bean class="com.qdu.bean.Pig" />
  • 對于單例的bean,容器啟動的時候就會實例化 ,如果將lazy-init設置為true,則單例的bean在第一次請求的時候被實例化。scope為prototype的bean在每次請求的時候被實例化
  • init-method指定初始化時要調用的方法
  • destroy-method指定bean被摧毀前要調用的方法
<bean id="singleDog" class="com.qdu.bean.SingleDog"lazy-init="true" init-method="init" destroy-method="destroy" />

在程序中獲取bean的方式有:

  1. 可以根據bean的id獲取bean的實例
  2. 可以根據bean的name獲取bean的實例
  3. 可以根據bean的類型獲取bean的實例
// 可以根據bean的id獲取bean的實例
Dog d1 = (Dog) ctx.getBean("dog"); 
d1.eat();// 也可根據bean的name(別名)獲取bean的實例
Dog d2 = (Dog) ctx.getBean("gou"); 
d2.eat();// 還可以根據bean的類型獲取bean實例
Dog d3 = ctx.getBean(Dog.class); 
d3.eat();

2 使用Java代碼配置Spring程序

如果使用的是java配置類,而不是xml配置文件,則需要使用ApplicationContext接口的AnnotationConfigApplicationContext實現類來創建容器。

可以傳入一個或多個配置類的類型,這樣形成的容器管理這些配置類注冊的bean

ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig1.class, SpringConfig2.class);

在com.qdu下創建一個config包來存儲Java配置類

相應注解:

  • @Configuration說明類是一個java配置類
  • @Bean表示方法返回的對象成為Spring管理的bean。默認一個bean是單例范圍,也就是不管請求該bean多少次,返回的是同一個共享實例。這種方式注冊的spring bean的名稱是方法名;可通過@Bean注解的name屬性指定bean的一個主名稱和多個別名,如果指定了名稱,則方法名就不作為bean的名稱了
  • 可通過@Bean注解的initMethod指定初始化時要調用的方法,方法名稱隨便起,但是不能有參數
  • 可通過@Bean注解的destroyMethod指定bean摧毀前要調用的方法,方法名稱隨便起,但是不能有參數
  • @Scope注解用于指定bean的范圍,默認是singleton,還可以是prototype, request, session, application等
  • @Lazy指示bean使用懶加載/延遲加載,默認單例的bean是容器啟動就實例化。如果使用該注解,則是第一次請求該bean的時候實例化。

SpringConfig1.class:

@Configuration 
public class SpringConfig1 {@Bean(name= {"dog","gou","quan"})@Scope("prototype") public Dog dog() {return new Dog();}@Beanpublic Sheep sheep() {return new Sheep();}@Bean(initMethod="init",destroyMethod="destroy")@Lazy public SingleDog singleDog() {return new SingleDog();}
}

在程序中獲取bean的方式有:

  1. 可以根據bean的id獲取bean的實例
  2. 可以根據bean的name獲取bean的實例
  3. 可以根據bean的類型獲取bean的實例
Dog d1 = (Dog) ctx.getBean("dog");
d1.eat();Dog d2 = (Dog) ctx.getBean("gou");
d2.eat();Dog d3 = ctx.getBean(Dog.class);
d3.eat();

?3?使用注解配置Spring程序

若要使用注解配置,則需要在SpringConfig類中開啟包掃描:

@Configuration
@ComponentScan(basePackages= {"com.qdu.bean"})
public class SpringConfig {}

同2, 在這里我們使用的是java配置類,而不是xml配置文件,則需要使用ApplicationContext接口的AnnotationConfigApplicationContext實現類來創建容器。

ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

?在Dog類中別忘記添加注解@Component!!!

@Component //將一個bean注冊為spring管理的bean,默認名稱是首字母小寫的類名
@Scope("prototype") //指定bean的范圍,默認是singleton
public class Dog {public Dog() {System.out.println("實例化了Dog!!!");}public void eat() {System.out.println("這是一只狗,狗吃骨頭!");}
}

除此之外,常用注解還有:

  • @Lazy:延遲加載
  • @PostConstruct:修飾的方法用于執行初始化工作
  • @PreDestroy:修飾的方法在bean摧毀前調用,用于執行如釋放資源等操作
  • 方法名可以隨便起,但是方法不能有參數!!!

在這里獲取bean的方式有兩種:

  1. 可以根據bean的id獲取bean的實例
  2. 可以根據bean的類型獲取bean的實例
// 可以根據bean的id獲取bean的實例
Dog d1 = (Dog) ctx.getBean("dog"); 
d1.eat();// 還可以根據bean的類型獲取bean實例
Dog d2 = ctx.getBean(Dog.class); 
d2.eat();

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210324.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210324.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210324.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【小米電腦管家】安裝使用教程--非小米電腦

安裝說明功能體驗下載資源 Xiaomi HyperOS發布后&#xff0c;小米妙享電腦端獨立版本也走向終點&#xff0c;最新的【小米電腦管家】將會內置妙享實現萬物互聯。那么本篇文章將分享非小米電腦用戶如何繞過設備識別驗證安裝使用【小米電腦管家】實現萬物互聯 安裝說明 1.解壓文…

如何用Python編寫俄羅斯方塊Tetris游戲?

在本文中&#xff0c;我們將用Python代碼構建一個令人驚嘆的項目&#xff1a;俄羅斯方塊游戲。在這個項目中&#xff0c;我們將使用pygame庫來構建游戲。要創建此項目&#xff0c;請確保您的系統中安裝了最新版本的Python。讓我們開始吧&#xff01; Pygame是一組跨平臺的Pyth…

wireshark過濾包小技巧

1、過濾包含某個字符串的數據包&#xff1a; 或者&#xff1a; 2、過濾包含某一連續十六進制的數據包&#xff1a; 或者&#xff1a; 3、過濾精確到位數位置 或者&#xff1a;

關于使用EB tresos出現無法激活的情況解決

EB安裝完成時需要激活才能使用的&#xff0c;不然都無法建立工程。 我在安裝eb studio時就是在激活方面有問題導致無法使用&#xff0c;下面講解出現了什么問題以及我如何去解除的。 1.出現的錯誤提示&#xff1f; ERROR&#xff1a;flexActAPPActivationSend按照在官網中&…

低代碼:輕松構建應用程序的新時代

在當今數字化時代&#xff0c;應用程序對于日常企業業務的開展&#xff0c;已經成為一種剛需。然而&#xff0c;應用程序開發的過程往往耗時耗力&#xff0c;對于企業來講&#xff0c;是一筆不小的成本開支。低代碼問世以來&#xff0c;一直在嘗試為業務人員賦能&#xff0c;讓…

扁平按鈕樣式

上圖 代碼&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>扁平按鈕</title><style>body {margin: 0;padding: 0;height: 100vh;display: flex;justify-content: center;ali…

Web漏洞-XSS繞過和pikachu靶場4個場景(三)

★★實戰前置聲明★★ 文章中涉及的程序(方法)可能帶有攻擊性&#xff0c;僅供安全研究與學習之用&#xff0c;讀者將其信息做其他用途&#xff0c;由用戶承擔全部法律及連帶責任&#xff0c;文章作者不承擔任何法律及連帶責任。 1、XSS漏洞挖掘與繞過 1.1、XSS漏洞挖掘 數據…

排序算法---冒泡排序

1. 原理 對數組進行遍歷&#xff0c;每次對相鄰的兩個元素進行比較&#xff0c;如果大的在前面&#xff0c;則交換兩個元素的位置&#xff0c;完成一趟遍歷后&#xff0c;數組中最大的數值到了數組的末尾。再對前面n-1個數值進行相同的遍歷。一共完成n-1趟遍歷就實現了排序。 1…

代碼隨想錄 63. 不同路徑 II

題目 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish”&#xff09;。 現在考慮網格中有障礙物。那么從左上角到右下…

UI界面程序鼠標右鍵彈出菜單的一些事

1.概述 在做客戶端UI程序時&#xff0c;鼠標右鍵彈出菜單這種操作非常常見&#xff0c;一般在鼠標右鍵按下或者鼠標右鍵抬起事件中響應操作&#xff0c;顯示菜單即可&#xff0c;但是有時涉及到鼠標的移動&#xff0c;就是鼠標按下右鍵且移動時&#xff0c;則不需要彈出菜單&a…

104. 二叉樹的最大深度(Java)

目錄 解法&#xff1a; 官方解答&#xff1a; 方法一&#xff1a;深度優先搜索 方法二&#xff1a;廣度優先搜索 思路與算法 復雜度分析 時間復雜度&#xff1a; 空間復雜度&#xff1a; 給定一個二叉樹 root &#xff0c;返回其最大深度。 二叉樹的 最大深度 是指從根…

【密碼學引論】數字簽名

第八章 數字簽名 1、數字簽名體制包括兩個方面&#xff1a;施加簽名、驗證簽名 SIG(M,Kd)S VER(S,Ke)bool&#xff08;真、假&#xff09; 2、數字簽名和信息加密的區別&#xff08;從密碼學五個組成部分來回答 3、安全性要求&#xff1a;先簽名后加密&#xff1b;針對哈希函…

如何入門網絡安全_網絡安全自學

由于我之前寫了不少網絡安全技術相關的故事文章&#xff0c;不少讀者朋友知道我是從事網絡安全相關的工作&#xff0c;于是經常有人在微信里問我&#xff1a; 我剛入門網絡安全&#xff0c;該怎么學&#xff1f;要學哪些東西&#xff1f;有哪些方向&#xff1f;怎么選&#xff…

算法:合并兩個有序數組(雙指針)

時間復雜度 O(m n)&#xff0c;空間復雜度 O(1) /*** param {number[]} nums1* param {number} m* param {number[]} nums2* param {number} n* return {void} Do not return anything, modify nums1 in-place instead.*/ var merge function(nums1,m,nums2,n) {let p1 m-1…

harmonyOS學習筆記之@Styles裝飾器與@Extend裝飾器

Styles裝飾器 定義組件重用樣式 自定義樣式函數使用裝飾器 可以定義在組件內或全局,內部優先級>外部,內部不需要function,外部需要function 定義在組件內的styles可以通過this訪問組件內部的常量和狀態變量,可以在styles里通過事件來改變狀態變量 弊端:只支持通用屬性和通用…

深度模型訓練時CPU或GPU的使用model.to(device)

一、使用device控制使用CPU還是GPU device torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # 單GPU或者CPU.先判斷機器上是否存在GPU&#xff0c;沒有則使用CPU訓練 model model.to(device) data data.to(device)#或者在確定有GPU的…

解決 Cannot read properties of undefined (reading ‘getUserMedia‘) 報錯

[TOC](解決 Cannot read properties of undefined (reading ‘getUserMedia’) 報錯) 0. 背景 使用瀏覽器輸入語音時&#xff0c;瀏覽器的控制臺里面有下面錯誤信息。 Cannot read properties of undefined (reading getUserMedia)1. 解決方法 在瀏覽器中訪問 chrome://fla…

半導體材料

半導體材料 電子元器件百科 文章目錄 半導體材料前言一、半導體材料是什么二、半導體材料的類別三、半導體材料的應用實例四、半導體材料的作用原理總結前言 半導體材料具有獨特的電學性質,使其在電子器件和集成電路中有廣泛的應用。通過控制半導體材料中載流子的濃度和運動方…

數字化浪潮下,你的企業數字化轉型了嗎?

企業數字化轉型面臨的挑戰 技術轉型挑戰&#xff1a;數字化轉型涉及到各種新技術、新軟件和新硬件&#xff0c;需要企業有一定的技術實力和專業知識&#xff0c;并且需要不斷學習和適應變化。對于傳統企業來說&#xff0c;可能面臨技術門檻高、技術更新快等問題。組織結構轉型…

如何用flex布局設計登錄頁?

使用 Flex 布局設計登錄頁是一種簡單而靈活的方式&#xff0c;讓頁面在不同屏幕大小下都能有良好的布局。以下是一個簡單的例子&#xff0c;演示如何使用 Flex 布局設計登錄頁&#xff1a; HTML 結構&#xff1a; <!DOCTYPE html> <html lang"en"> <…