Spring基于xml半注解開發

目錄

@Component的使用

依賴注解的使用

非自定義Bean的注解開發


@Component的使用

基本Bean注解,主要是使用注解的方式替代原有的xml的<bean>標簽及其標簽屬性的配置,使用@Component注解替代<bean>標簽中的id以及class屬性,而對于是否延遲加載或是Bean的作用域,則是其他注解

xml配置

注解

描述

<bean scope="">

@Scope

在類上或使用了@Bean標注的方法上,標注Bean的作用范圍,取值為singleton或prototype

<bean lazy-init="">

@Lazy

在類上或使用了@Bean標注的方法上,標注Bean是否延遲加載,取值為true或false

<bean init-method="">

@PostConstruct

在方法上使用,標注Bean的實例化后執行的方法

<bean destroy-method="">

@PreDestroy

在方法上使用,標注Bean的銷毀前執行方法

下面就是基于注解的測試案例

首先需要開啟自動掃描注解功能,這個功能還是需要在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 https://www.springframework.org/schema/context/spring-context.xsd"><!--開啟自動掃描--><context:component-scan base-package="com.zmt"/>
</beans>
@Component("userService")
@Lazy(true)//開啟懶加載
@Scope("singleton")//單例模式
public class UserServiceImpl implements UserService {public UserServiceImpl() {System.out.println("UserService被構造");}@PostConstructprivate void init(){System.out.println("執行init方法");}@PreDestroyprivate void destroy(){System.out.println("執行銷毀方法");}
}

測試代碼?

public class Test {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");Object bean = context.getBean("userService");System.out.println(bean);context.close();}
}

執行結果如下

UserService被構造
執行init方法
com.zmt.service.impl.UserServiceImpl@45afc369
執行銷毀方法

為了方便區分不同的業務層,@Component注解又衍生了三個注解

  • @Service:Component的派生注解,多添加在Service的實現類上
  • @Controller:Component的派生注解,多添加在Controller類上
  • @Repository:Component的派生注解,多添加在Dao實現類上

依賴注解的使用

Bean的依賴注入的注解,主要是替代xml中的<property>標簽中的注入操作

<bean id="" class=""><property name="" ref=""/><property name="" value=""/>
</bean>

Spring提供的注解如下,用于Bean內部進行屬性注入的

屬性注入注解

描述

@Value

使用在字段或方法上,用于注入普通數據

@Autowired

使用在字段或方法上,用于根據類型(byType)注入引用數據

@Qualifier

使用在字段或方法上,結合@Autowired使用,根據名稱注入

@Resource

使用在字段或方法上,根據類型或名稱進行注入

這些注解的工作原理實際上是通過暴力反射然后賦值,因此不需要set方法,但是添加了set方法在set方法上添加注解也可以使用。

下面是簡單的使用案例

@Value該注解可以對普通數據類型進行賦值,一種是直接指定需要注入的值,一種是通過占位符讀取需要注入的值信息

<?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 https://www.springframework.org/schema/context/spring-context.xsd"><!--開啟自動掃描--><context:component-scan base-package="com.zmt"/><!--將test.txt文件加載到Spring中,供賦值使用--><context:property-placeholder location="classpath:test.txt"/>
</beans>

@Component("userService")
public class UserServiceImpl implements UserService {
//    @Value("zhangsan")@Value("${name}")private String name;@Overridepublic void show() {System.out.println(name);}
}

以上兩種都可以將值賦值給name變量,但前者使用的意義不大,因此通常我們使用后者去讀取配置文件中的值。


@Autowired的使用默認是根據類型注入,但如果相同類型存在多個,則根據名稱進行注入,但是如果不存在屬性變量名的Bean對象,那么注入失敗

@Component("userService")
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Autowiredpublic void setUserDao(UserDao userDao) {this.userDao = userDao;}//以上兩種寫一個即可@Overridepublic void show() {}
}

@Qualifier需要搭配@Autowired注解使用,特定指定在多個相同類型的Bean對象時,注入哪個名稱的bean對象

@Component("userService")
public class UserServiceImpl implements UserService {@Autowired@Qualifier("userDao")private UserDao userDao2;@Overridepublic void show() {}
}

這里即使屬性變量名為userDao2但是實際上注入的還是名為userDao的bean對象。


@Resource既可以類型注入也可以名稱注入,如果指定名稱,那么只能根據名稱注入

@Component("userService")
public class UserServiceImpl implements UserService {@Resource(name = "userDao")private UserDao userDao2;//實際上注入的是名稱為userDao的bean對象@Overridepublic void show() {}
}

@Autowired的擴展使用,實際上該注解不僅僅可以添加在set方法上,可以添加在任何方法上,下面是一個測試案例

@Component("userService")
public class UserServiceImpl implements UserService {@Overridepublic void show() {}@Autowiredpublic void xxx(UserDao userDao){System.out.println("xxx:"+userDao);}@Autowiredpublic void yyy(List<UserDao> userDaoList){System.out.println("yyy:"+userDaoList);}
}

運行結果如下

非自定義Bean的注解開發

對于非自定義的Bean我們需要使用工廠來進行加載,需要使用@Bean注解,如果需要參數,對于基本類型需要@Value注解,對于引用類型,只要Spring中存在,可以直接根據類型注入。

@Component
public class OtherBean {@Beanpublic DataSource dataSource(@Value("${name}") String name){DataSource dataSource = new DataSource();System.out.println(name);return dataSource;}
}

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

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

相關文章

算法Day26 數位統計

數位統計 Description 給你一個整數n&#xff0c;統計并返回各位數字都不同的數字x的個數&#xff0c;其中0 ≤ x < 10^n。 Input 輸入整數n 0≤n≤13 Output 輸出整數個數 Sample 代碼 import java.util.Scanner;public class Main {public static void main(String[] ar…

一個Oracle Application Container的實例

本例基本涵蓋了Oracle Multitenant功能中application container的以下內容&#xff1a; 創建application container/root創建application PDB創建application SEED在application root中安裝application在application root中升級application同步application 整個過程如下 創建…

Epoll服務器(ET工作模式)

目錄 Epoll ET服務器設計思路Connection類TcpServer類 回調函數Accepter函數Recever函數Sender函數Excepter函數 事件處理套接字相關接口封裝運行Epoll服務器 Epoll ET服務器 設計思路 在epoll ET服務器中&#xff0c;我們需要處理如下幾種事件&#xff1a; 讀事件&#xff…

基于javeweb實現的圖書借閱管理系統

一、系統架構 前端&#xff1a;jsp | js | css | jquery 后端&#xff1a;servlet | jdbc 環境&#xff1a;jdk1.7 | mysql | tocmat 二、代碼及數據庫 三、功能介紹 01. 登錄頁 02. 首頁 03. 圖書管理 04. 讀者管理 05. 圖書分類管理 06. 圖書借閱信息 07. 圖書歸還信…

CDN加速技術:降低服務器與網站成本的智慧選擇

隨著互聯網的飛速發展&#xff0c;網站的訪問量不斷攀升&#xff0c;服務器負載壓力逐漸增大。為了提高用戶體驗、降低服務器成本&#xff0c;并確保網站的高可用性&#xff0c;CDN&#xff08;內容分發網絡&#xff09;加速技術應運而生。本文將從服務器與網站成本的角度分析C…

NLP項目實戰01--電影評論分類

介紹&#xff1a; 歡迎來到本篇文章&#xff01;在這里&#xff0c;我們將探討一個常見而重要的自然語言處理任務——文本分類。具體而言&#xff0c;我們將關注情感分析任務&#xff0c;即通過分析電影評論的情感來判斷評論是正面的、負面的。 展示&#xff1a; 訓練展示如下…

比較不同聚類方法的評估指標

歸一化互信息&#xff08;NMI&#xff09; 要求&#xff1a;需要每個序列的真實標簽&#xff08;分類信息&#xff09;

你在地鐵上修過bug嗎?

作為技術人員&#xff0c;有沒有遇到下班路上收到老板電話&#xff0c;系統故障&#xff0c;然后地鐵上掏出電腦&#xff0c;修bug的場景。自己負責的業務線上出現問題&#xff0c;負責人心里是很慌的&#xff0c;在這種心理狀態下做事很容易二次犯錯&#xff0c;造成更大的問題…

SAP UI5 walkthrough step10 Descriptor for Applications

在這一步&#xff0c;我們將會把所有的應用相關的描述性的文件獨立放到manifest.json 新建一個manifest.json文件 webapp/manifest.json (New) {"_version": "1.58.0","sap.app": {"id": "ui5.walkthrough","i18n&q…

【已解決】No module named ‘sklearn‘

問題描述 No module named ‘sklearn‘ 解決辦法 pip install scikit-learn 完結撒花 契約、包容、感恩、原則……這些成年人該有的基本精神&#xff0c;為什么我在他們身上找不到呢&#xff1f;

圖像疊加中文字體

目錄 1) 前言2) freetype下載3) Demo3.1) 下載3.2) 編譯3.3) 運行3.4) 結果3.5) 更詳細的使用見目錄中說明 4) 積少成多 1) 前言 最近在做圖片、視頻疊加文字&#xff0c;要求支持中文&#xff0c;基本原理是將圖片或視頻解碼后疊加文字&#xff0c;之后做圖片或視頻編碼即可。…

ASP.NET Core概述-微軟已經收購了mono,為什么還搞.NET Core呢

一、.NET Core概述 1、相關歷程 .NET在設計之初也是考慮像Java一樣跨平臺&#xff0c;.NET Framework是在Windows下運行的&#xff0c;大部分類是可以兼容移植到Linux下&#xff0c;但是沒有人做這個工作。 2001年米格爾為Gnome尋找桌面開發技術&#xff0c;在研究了微軟的.…

數據庫版本管理框架-Flyway(從入門到精通)

一、flyway簡介 Flyway是一個簡單開源數據庫版本控制器&#xff08;約定大于配置&#xff09;&#xff0c;主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL&#xff08;PL/SQL、T-SQL&#xff09;方式和Java方式&#xff0c;支持命令行客戶端等&am…

TCP對數據的拆分

應用程序的數據一般都比較大&#xff0c;因此TCP會按照網絡包的大小對數據進行拆分。 當發送緩沖區中的數據超過MSS的長度&#xff0c;數據會被以MSS長度為單位進行拆分&#xff0c;拆分出來的數據塊被放進單獨的網路包中。 根據發送緩沖區中的數據拆分情況&#xff0c;當判斷…

ffmpeg編譯問題

利用ffmpeg實現一個播放器&#xff0c;ffmpeg提供動態庫&#xff0c;但是編譯鏈接的時候遇到下面的問題&#xff1a; ../ffmpegWidgetPlayer/videoplayerwidget.cpp:23: error: undefined reference to sws_freeContext(SwsContext*) ../ffmpegWidgetPlayer/videoplayerwidget.…

JWT介紹及演示

JWT 介紹 cookie(放在瀏覽器) cookie 是一個非常具體的東西&#xff0c;指的就是瀏覽器里面能永久存儲的一種數據&#xff0c;僅僅是瀏覽器實現的一種數據存儲功能。 cookie由服務器生成&#xff0c;發送給瀏覽器&#xff0c;瀏覽器把cookie以kv形式保存到某個目錄下的文本…

JavaScript 金額元轉化為萬

function dealNum(price){if (price 0) {return 0元}const BASE 10000const decimal 0const SIZES ["", "萬", "億", "萬億"];let i undefined;let str "";if (price) {if ((price > 0 && price < BASE…

p標簽的水平居中和垂直居中

1行內塊元素水平居中垂直居中 行內元素和行內塊元素水平居中&#xff0c;給其父元素添加text-align:center&#xff1b;所以案例里面給one加了 text-align: center之后span就會水平居中了。在設置span行高和高都是一樣的 20px;這樣就實現上下居中了。 2塊級元素P元素水平居中…

通過命令行輸入參數控制激勵

1)在命令行的仿真參數&#xff08;SIM_OPT&#xff09;加上&#xff1a;“var_a100 var_b99” 2)在環境中調用&#xff1a; $test$plusargs("var_a")&#xff1b;如果命令行存在這個字符&#xff0c;返回1&#xff0c;否則返回0&#xff1b; $value$plusargs(&qu…

vue2 el-input里實現打字機 效果

vue2 el-input里實現打字機 效果 <el-col :span"24" v-if"ifshowOtherDesc""><el-form-item label"分析" prop"otherDesc"><el-input type"textarea" :disabled"disabled" autofocus"t…