剖析Spring自動注入中的註解

2021-07-04 06:30:46 字數 1676 閱讀 8310

學習spring的自動注入時, 對幾個註解非常模稜兩可,不知道使用的本質, 只因為大家都這樣用,所以我一直這樣使用。 下面列出@autowired和@resource這兩個註解他們的使用關係。在做範例之前,先介紹一下這兩個註解,下摘自網友的總結:

spring 不但支援自己定義的@autowired註解,還支援幾個由jsr-250規範定義的註解,它們分別是@resource、@postconstruct以及@predestroy。

@resource的作用相當於@autowired,只不過@autowired按bytype自動注入,而@resource預設按 byname自動注入罷了。

@resource有兩個屬性是比較重要的,分別是name和type,spring將@resource註解的name屬性解析為bean的名字,而type屬性則解析為bean的型別。所以如果使用name屬性,則使用byname的自動注入策略,而使用type屬性時則使用bytype自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byname自動注入策略。

@resource裝配順序

如果同時指定了name和type,則從spring上下文中找到唯一匹配的bean進行裝配,找不到則丟擲異常。

如果指定了name,則從上下文中查詢名稱(id匹配的bean進行裝配,找不到則丟擲異常。

如果指定了type,則從上下文中找到型別匹配的唯一bean進行裝配,找不到或者找到多個,都會丟擲異常。

如果既沒有指定name,又沒有指定type,則自動按照byname方式進行裝配,如果沒有匹配,則回退為乙個原始型別(userdao)進行匹配,如果匹配則自動裝配。

測試發現:

當指定了@service的name值時, 在@resource中要麼不指示,如果指示的話,則要與之相對應。

當沒有指定@service的name值是,在@resource中隨意。但是前提是,實現該介面的只有這乙個類。

所以,建議是最好在@service和@resoure中同時指定名稱,並且做到一一對應。

如果採用@autowired來註解,則同樣無需指定name屬性,若是實現該介面有多個類,則需要通過@qualifier來做區分

如下是文件結構:

userservice、userservice2是實現iuserservice的兩個實現類,

類中@service的註解分別是

@service("userservice1")

public

class userservice implements iuserservice {}

@service("userservice2")

public

class userservice2 implements iuserservice {}

那麼在testmethod中測試方法,使用介面iuserservice時,使用的@autowired來標註時,需要使用註解@qualifier來做區分

@autowired

@qualifier("userservice2")

private iuserservice userservice;

剖析Spring自動注入中的註解

學習spring的自動注入時,對幾個註解非常模稜兩可,不知道使用的本質,只因為大家都這樣用,所以我一直這樣使用。下面列出 autowired和 resource這兩個註解他們的使用關係。在做範例之前,先介紹一下這兩個註解,下摘自的總結 spring 不但支援自己定義的 autowired註解,還支援...

spring注入方式 Set注入 構造方法注入

spring注入方式 set方法注入 構造方法注入 eg beanid myservice class com.etc.service.impl.userserviceimpl bean 自動注入 beans xmlns xmlns xsi xmlns aop xmlns tx xsi schema...

spring 依賴注入之 Resource注入

public propertyvalues postprocessproperties propertyvalues pvs,object bean,string beanname catch throwable ex return pvs private injectionmetadata fin...