spring依賴注入原理與用法實(shí)例分析
本文實(shí)例講述了spring依賴注入原理與用法。分享給大家供大家參考,具體如下:
一 點(diǎn)睛
控制反轉(zhuǎn)和依賴注入在Spring環(huán)境下是等同的概念,控制反轉(zhuǎn)是通過(guò)依賴注入實(shí)現(xiàn)的。所謂依賴注入指的是容器負(fù)責(zé)創(chuàng)建對(duì)象和維護(hù)對(duì)象間的依賴關(guān)系,而不是通過(guò)對(duì)象本身負(fù)責(zé)自己的創(chuàng)建和解決自己的依賴。
依賴注入的主要目的是為了解耦,體現(xiàn)一種組合的概念。如果你希望你的類具備某項(xiàng)功能的時(shí)候,是繼承自一個(gè)具有次功能的父類好呢?還是組合另外一個(gè)具有此功能的類好呢?答案是不言而喻的,繼承一個(gè)父類,子類和父類耦合了,組合另外一個(gè)類則使耦合度大大降低了。
Spring IoC 容器(ApplicationContext)負(fù)責(zé)創(chuàng)建Bean,并通過(guò)容器將功能Bean注入到你需要的Bean中。
Spring提供使用xml、注解、Java配置、groovy配置實(shí)現(xiàn)Bean的創(chuàng)建和注入。
無(wú)論是xml配置、注解還是Java配置,都被稱為配置元數(shù)據(jù),所謂元數(shù)據(jù)即描述數(shù)據(jù)的數(shù)據(jù)。元數(shù)據(jù)本身不具備任何可執(zhí)行的能力,只有通過(guò)外界代碼來(lái)對(duì)這些元數(shù)據(jù)進(jìn)行解析后進(jìn)行一些有意義的操作。Spring容器解析這些元數(shù)據(jù)進(jìn)行Bean初始化,配置和管理依賴。
二 聲明Bean的注解
- @Component組件:沒有明確的角色。
- @Service:在業(yè)務(wù)邏輯層(service層)使用。
- @Respository:在數(shù)據(jù)訪問層(dao層)使用。
- @Controller:在展現(xiàn)層(MVC->Spring MVC)使用。
三 注入Bean的注解
- @Autowired:Spring提供的注解
- @Inject:JSR-330提供的注解
- @Resource:JSR-250提供的注解
- @Autowired、@Inject、@Resource可注解set方法上或者屬性上,一般習(xí)慣注解在屬性上,優(yōu)點(diǎn)是代碼更少、層次更清晰。
四 實(shí)戰(zhàn)
1 編寫功能類的Bean
package com.wisely.highlight_spring4.ch1.di; import org.springframework.stereotype.Service; //使用@Service注解聲明當(dāng)前FunctionService類是Spring管理的一個(gè)Bean。 //使用@Component、@Service、@Respository、@Controller是等效的,可 //根據(jù)需要選擇 @Service public class FunctionService { public String sayHello(String word){ return "Hello " + word +" !"; } }
2 使用功能類Bean
package com.wisely.highlight_spring4.ch1.di; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service //使用@Service注解聲明當(dāng)前UseFunctionService類是Spring管理的一個(gè)Bean public class UseFunctionService { //使用@Autowired 將FunctionService的實(shí)體Bean注入到UseFunctionService中 //讓UseFunctionService具備FunctionService的功能,此處使用JSR-330的Inject //注解或者JSR-250的@Resource注解等效 @Autowired FunctionService functionService; public String SayHello(String word){ return functionService.sayHello(word); } }
3 配置類
package com.wisely.highlight_spring4.ch1.di; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration //@Configuration聲明當(dāng)前類是一個(gè)配置類。 //使用@ComponentScan,自動(dòng)掃描包下所有@Component、@Service、@Respository、@Controller //的類,并注冊(cè)為Bean @ComponentScan("com.wisely.highlight_spring4.ch1.di") public class DiConfig { }
4 運(yùn)行類
package com.wisely.highlight_spring4.ch1.di; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args) { //使用AnnotationConfigApplicationContext作為Spring容器,接收 //一個(gè)配置類作為參數(shù) AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DiConfig.class); //獲得聲明配置UseFunctionService的Bean UseFunctionService useFunctionService = context.getBean(UseFunctionService.class); System.out.println(useFunctionService.SayHello("world")); context.close(); } }
五 測(cè)試
Hello world !
更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Spring框架入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
- Spring入門配置和DL依賴注入實(shí)現(xiàn)圖解
- 詳解Spring依賴注入:@Autowired,@Resource和@Inject區(qū)別與實(shí)現(xiàn)原理
- Spring bean的實(shí)例化和IOC依賴注入詳解
- SpringBoot的攔截器中依賴注入為null的解決方法
- 淺談Spring IoC容器的依賴注入原理
- 理解Spring中的依賴注入和控制反轉(zhuǎn)
- Spring依賴注入的三種方式實(shí)例詳解
- Spring quartz Job依賴注入使用詳解
- Spring依賴注入的三種方式小結(jié)
- 因Spring AOP導(dǎo)致@Autowired依賴注入失敗的解決方法
- Spring依賴注入的兩種方式(根據(jù)實(shí)例詳解)
- Spring 依賴注入的幾種方式詳解
- Spring 依賴注入實(shí)現(xiàn)示例
相關(guān)文章
java實(shí)現(xiàn)隨機(jī)抽取獎(jiǎng)品工具類
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)隨機(jī)抽取獎(jiǎng)品工具類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05Java 中的 BufferedWriter 介紹_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
BufferedWriter 是緩沖字符輸出流。它繼承于Writer。接下來(lái)通過(guò)本文給大家分享Java 中的 BufferedWriter知識(shí),需要的朋友參考下吧2017-05-05Springboot 使用具體化類和配置來(lái)縮短單元測(cè)試時(shí)間
這篇文章主要介紹了Springboot 使用具體化類和配置來(lái)縮短單元測(cè)試時(shí)間,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11解決IDEA中Maven下載依賴包過(guò)慢或報(bào)錯(cuò)的問題
由于公司項(xiàng)目迭代,越來(lái)越多的項(xiàng)目開始轉(zhuǎn)型新版本,由于我對(duì)Java一直不感冒,但要順應(yīng)公司項(xiàng)目要求,遂自己要逐步開始完善Java相關(guān)的知識(shí)層面,此篇是我在學(xué)習(xí)SpringBoot時(shí)對(duì)一些不懂地方及遇到問題時(shí)的記錄,需要的朋友可以參考下2024-02-02springmvc字符編碼過(guò)濾器CharacterEncodingFilter的使用
這篇文章主要介紹了springmvc字符編碼過(guò)濾器CharacterEncodingFilter的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2021-08-08kafka?消息隊(duì)列中點(diǎn)對(duì)點(diǎn)與發(fā)布訂閱的區(qū)別說(shuō)明
這篇文章主要介紹了kafka?消息隊(duì)列中點(diǎn)對(duì)點(diǎn)與發(fā)布訂閱的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05解決springboot 連接 mysql 時(shí)報(bào)錯(cuò) using password: NO的方案
在本篇文章里小編給大家整理了關(guān)于解決springboot 連接 mysql 時(shí)報(bào)錯(cuò) using password: NO的方案,有需要的朋友們可以學(xué)習(xí)下。2020-01-01SpringData JPA實(shí)現(xiàn)查詢分頁(yè)demo
本篇文章主要介紹了SpringData JPA實(shí)現(xiàn)查詢分頁(yè)demo,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03Java結(jié)合redis實(shí)現(xiàn)接口防重復(fù)提交
本文主要介紹了Java結(jié)合redis實(shí)現(xiàn)接口防重復(fù)提交,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09