Spring中的@AutoWired與@Resource及@Qualifier注解詳解
@AutoWired與@Resource及@Qualifier注解
spring不但支持自己定義的@Autowired注解(所以Autowired與Spring是強(qiáng)相關(guān)性,只能在spring框架中使用,而后幾個注解則不然),還支持幾個由JSR-250規(guī)范定義的注解,它們分別是@Resource、@PostConstruct以及@PreDestroy。
@PostConstruct
相當(dāng)于init-method,使用在方法上,當(dāng)Bean初始化時執(zhí)行,執(zhí)行順序在@Autowire注解之后。
@PreDestroy
相當(dāng)于destory-method,使用在方法上,當(dāng)Bean銷毀時執(zhí)行。
@Autowired
@Autowired 注解可以用于 Setter 方法、字段、構(gòu)造函數(shù)。
也可用于普通方法,前提是方法必須有至少一個參數(shù),很少用,此時會產(chǎn)生一個副作用,就是在容器初始化該 Bean 實(shí)例的時候就會調(diào)用該方法。
當(dāng)然,前提是執(zhí)行了自動裝配,對于不滿足裝配條件的情況,該方法也不會被執(zhí)行。
附:最近見到了不少將此注解標(biāo)注在構(gòu)造函數(shù)上的情況,如以下場景:
類A需要在初始化立刻執(zhí)行某個操作method,但此操作需要必須在屬性attribute初始化之后才能進(jìn)行,方案有多種
1.實(shí)現(xiàn)InitializingBean接口,在afterPropertiesSet方法中執(zhí)行method
2.實(shí)現(xiàn)ApplicationListener<ContextRefreshedEvent>接口,在onApplicationEvent方法中執(zhí)行method
3.使用@postConstruct注解method方法,此注解標(biāo)注的方法會在所有屬性注入完成后,獲取此bean前執(zhí)行
4.屬性attribute不使用自動裝配,使用@Autowired注解構(gòu)造函數(shù),并注入attribute
@Autowired public A(Attribute attribute) { this.attribute = attribute; method(); }
@Autowired按byType自動注入,查找指定類型的Bean。找不到則拋出異常(可以給 @Autowired 標(biāo)注增加一個 required=false 屬性,以改變這個行為)。 如果找到多個bean,按以下方案進(jìn)行:
- 選擇其中帶有Primary注解的bean,如果只有一個直接注入,如果有多個bean帶有Primary注解則報錯。
- 選擇與@Qualifier注解的value值名稱相同的Bean,如下,如果有名為zhangsan的User Bean,則注入,無則報錯
@Autowired @Qualifier("zhangsan") public User user; // 注解在set方法上的例子 @Autowired public void setUserDao(@Qualifier("userDao") UserDao userDao) { this.userDao = userDao; }
@Resource
- @Resource默認(rèn)按 byName自動注入。@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型。所以如果使用name屬性,則使用byName的自動注入策略(同時也會判斷該name的Bean是否類型匹配,不存在或不匹配將拋出異常),而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機(jī)制使用byName自動注入策略。
- Resource裝配順序:
- 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進(jìn)行裝配,找不到則拋出異常
- 如果指定了name,則從上下文中查找名稱(id)匹配的bean進(jìn)行裝配,找不到則拋出異常
- 如果指定了type,則從上下文中找到類型匹配的唯一bean進(jìn)行裝配,找不到或者找到多個,都會拋出異常
- 如果既沒有指定name,又沒有指定type,則自動按照byName方式進(jìn)行裝配;如果沒有匹配,則回退為一個原始類型進(jìn)行匹配,如果成功則自動裝配;
其他擴(kuò)展
常見定義Bean的注解:
@Controller
@Controller(“Bean的名稱”)
定義控制層Bean,如Action
@Service
@Service(“Bean的名稱”)
定義業(yè)務(wù)層Bean
@Repository
@Repository(“Bean的名稱”)
定義DAO層Bean
@Component
它是一個通用泛化的注解,當(dāng)某個組件不能通過業(yè)務(wù)進(jìn)行歸類時,可以使用這個注解進(jìn)行標(biāo)注。@Controller、@Repository、@Service是基于此注解的擴(kuò)展,查看源碼可以發(fā)現(xiàn)這三個注解上都標(biāo)注了@Component 注解
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Controller { @AliasFor( annotation = Component.class ) String value() default ""; }
以上幾個注解效果是完全一樣的,只是后三個用于方便標(biāo)示該Bean的業(yè)務(wù)范圍。
注:這幾個注解都依賴于類的無參構(gòu)造,如果未提供,則會在啟動時報錯
No default constructor found; nested exception is java.lang.NoSuchMethodException
到此這篇關(guān)于Spring中的@AutoWired與@Resource及@Qualifier注解詳解的文章就介紹到這了,更多相關(guān)@AutoWired與@Resource及@Qualifier注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot v2.0.3版本多數(shù)據(jù)源配置方法
這篇文章主要介紹了springboot v2.0.3版本多數(shù)據(jù)源配置方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下2018-11-11基于SpringMVC接受JSON參數(shù)詳解及常見錯誤總結(jié)
下面小編就為大家分享一篇基于SpringMVC接受JSON參數(shù)詳解及常見錯誤總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03詳解java并發(fā)之重入鎖-ReentrantLock
這篇文章主要介紹了java并發(fā)之重入鎖-ReentrantLock,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Spring Data JPA 建立表的聯(lián)合主鍵
這篇文章主要介紹了Spring Data JPA 建立表的聯(lián)合主鍵。本文詳細(xì)的介紹了2種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階)
本篇文章主要介紹了詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11