詳細(xì)易懂帶你了解Spring中的注解
Spring注解
Spring的一個核心是IOC,是將Bean初始化加載到容器中,Bean是如何加載到容器的,可以使用Spring注解方式或者Spring XML配置方式。
Spring注解方式減少了配置文件內(nèi)容,更加便于管理,并且使用注解可以大大提高了開發(fā)效率!
注解本身是沒有功能的,和xml一樣,注解和xml都是一種元數(shù)據(jù),元數(shù)據(jù)即解釋數(shù)據(jù)的數(shù)據(jù),也就是所謂的配置。
聲明bean的注解
- @Component: 普通的注解
- @Service :業(yè)務(wù)邏輯層以及Service層
- @Controller: 外部層
- @Repository :dao層即持久層
注:@Controller、@Service、@Repository都可以稱為@Component
注入bean的注解
@Autowired (根據(jù)屬性類型自動裝配)
當(dāng)在將一個類上標(biāo)注@Service或者@Controller或@Component或@Repository注解之后,spring的組件掃描就會自動發(fā)現(xiàn)它,并且會將其初始化為spring應(yīng)用上下文中的bean。
當(dāng)需要使用這個bean的時(shí)候,加上==@Autowired==注解的時(shí)候,這個bean就會被創(chuàng)建。而且初始化是根據(jù)無參構(gòu)造函數(shù)。
- @Autowired可以標(biāo)注在屬性上、方法上和構(gòu)造器上,來完成自動裝配。
- 默認(rèn)是根據(jù)屬性類型,spring自動將匹配到的屬性值進(jìn)行注入
當(dāng)@Autowired標(biāo)注的屬性是接口時(shí),其實(shí)注入的是這個接口的實(shí)現(xiàn)類, 如果這個接口有多個實(shí)現(xiàn)類,只使用@Autowired就會報(bào)錯,因?yàn)樗J(rèn)是根據(jù)類型找,然后就會找到多個實(shí)現(xiàn)類bean,所有就不知道要注入哪個。然后它就會根據(jù)屬性名去找。所以如果有多個實(shí)現(xiàn)類可以配合@Qualifier(value=“類名”)來使用
@Autowired
private UserServiceImpl userService;
@GetMapping("{id}")
public Result<List<OrderDTO>> selectById(@PathVariable Integer id) {
List<OrderDTO> list = userService.selectById(id);
return Result.ok(list);
}@Resource (可以根據(jù)類型注入,也可以根據(jù)名稱注入)
@Resource有兩個重要屬性,分別是name和type
spring將name屬性解析為bean的名字,而type屬性則被解析為bean的類型。
所以如果使用name屬性,則使用byName的自動注入策略,如果使用type屬性則使用byType的自動注入策略。
如果都沒有指定,則通過反射機(jī)制使用byName自動注入策略。
@Resource(name="gender")
private String gender;
@Resource(name="age")
private String age;<bean name="gender" class="java.lang.String">
<constructor-arg value="${oos.gender}"/>
</bean>
<bean name="age" class="java.lang.String">
<constructor-arg value="${oos.age}"/>
</bean>@Resource和@Autowired注解都是實(shí)現(xiàn)依賴注入的。
只是@AutoWried按by type自動注入,而@Resource默認(rèn)按byName自動注入。
@Qualifier (根據(jù)屬性名稱進(jìn)行注入)
@Qualifier的使用要和上面的@Autowired一起使用,讓系統(tǒng)知道了我們具體要引入哪個實(shí)現(xiàn)類,當(dāng)有多個實(shí)現(xiàn)類的時(shí)候,我們可以使用此方法
@Autowired
@Qualifier(value = "userDaoImpl")
private UserDao userDao;@Value 注入普通類型的注入
通過@Value注解指定系統(tǒng)屬性的名稱susan.test.userName,該名稱需要使用${}包起來。
@Value注解中指定的系統(tǒng)屬性名,必須跟配置文件中的相同。
@Service
public class UserService {
@Value("${test.userName}")
private String userName;
public String test() {
System.out.println(userName);
return userName;
}
}而配置文件中配置的系統(tǒng)屬性名是:
test.user-name=張三
最后獲取數(shù)據(jù)時(shí),會發(fā)現(xiàn)userName竟然可能會出現(xiàn)亂碼:
手動將ISO-8859-1格式的屬性值,轉(zhuǎn)換成UTF-8格式。
到此這篇關(guān)于詳細(xì)易懂帶你了解Spring中的注解的文章就介紹到這了,更多相關(guān)Spring中的注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot配置Swagger2登錄密碼的實(shí)現(xiàn)
本文主要介紹了Springboot配置Swagger2登錄密碼的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
SpringBoot JS-SDK自定義微信分享的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot JS-SDK自定義微信分享的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
基于FlashPaper實(shí)現(xiàn)JSP在線閱讀代碼示例
這篇文章主要介紹了基于FlashPaper實(shí)現(xiàn)JSP在線閱讀代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
JAVA 開發(fā)之用靜態(tài)方法返回類名的實(shí)例詳解
這篇文章主要介紹了JAVA 開發(fā)之用靜態(tài)方法返回類名的實(shí)例詳解的相關(guān)資料,這里主要說明使用異常來得到類名,希望能幫助到大家,需要的朋友可以參考下2017-08-08
SpringBoot集成quartz實(shí)現(xiàn)定時(shí)任務(wù)
這篇文章主要介紹了如何使用SpringBoot整合Quartz,并將定時(shí)任務(wù)寫入庫中(持久化存儲),還可以任意對定時(shí)任務(wù)進(jìn)行如刪除、暫停、恢復(fù)等操作,需要的可以了解下2023-09-09
舉例說明Java設(shè)計(jì)模式編程中ISP接口隔離原則的使用
這篇文章主要介紹了Java設(shè)計(jì)模式編程中ISP接口隔離原則的使用,接口隔離原則主張一個類對另外一個類的依賴性應(yīng)當(dāng)是建立在最小的接口上,需要的朋友可以參考下2016-02-02
Java 設(shè)計(jì)模式之責(zé)任鏈模式及異步責(zé)任鏈詳解
顧名思義,責(zé)任鏈模式(Chain of Responsibility Pattern)為請求創(chuàng)建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發(fā)送者和接收者進(jìn)行解耦。這種類型的設(shè)計(jì)模式屬于行為型模式2021-11-11
利用spring的攔截器自定義緩存的實(shí)現(xiàn)實(shí)例代碼
這篇文章主要介紹了利用spring的攔截器自定義緩存的實(shí)現(xiàn)實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02

