1. 程式人生 > >Spring中註解的實現原理-Autowired和Resource的區別

Spring中註解的實現原理-Autowired和Resource的區別

@Autowired和@Resource的區別:

在Java中使用@Autowired和@Resource註解進行裝配,這兩個註解分別是:
1、@Autowired按照預設型別(類名稱)裝配依賴物件,預設情況下它要求依賴物件必須存在,如果允許為null,可以設定它的required屬性為false
如果我們按名稱裝配,可以結合@Qualifie註解一起使用。
如:
@Autowired @qualifie(“personDaoBean”)
private PersonDaoBean personDaoBean;

@Resource預設按照名稱(name=”test”)進行裝配,名稱可以通過@resource的name屬性設定,當找不到與名稱匹配的bean才會按型別裝配

注意:如果沒有指定name屬性,並且安裝預設的名稱依然找不到依賴物件時,@Resource會回退到按型別裝配。但一旦指定了name屬性,就只能按名稱裝配了。

下面的示例來簡單的講述spring註解原理:
本例實現了在set方法上和在欄位屬性上註解的處理解析。
1、定義註解
Java程式碼 收藏程式碼
package com.yt.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* @Description:定義註解
* @ClassName: ZxfResource
* @Project: spring-aop
*/
// 在執行時執行
@Retention(RetentionPolicy.RUNTIME)
// 註解適用地方(欄位和方法)
@Target({ ElementType.FIELD, ElementType.METHOD })
public @interface ZxfResource {

//註解的name屬性  
public String name() default "";  

}
2、帶有註解的服務類
Java程式碼 收藏程式碼
package com.yt.annotation;

/**
* @Description: 帶有註解的服務
* @ClassName: UserDaoImpl
* @Project: spring-aop
*/
public class UserServiceImpl {

public UserDaoImpl userDao;  
public User1DaoImpl user1Dao;  

// 欄位上的註解,可以配置name屬性  
@ZxfResource  
public User2DaoImpl user2Dao;  

// set方法上的註解,帶有name屬性  
@ZxfResource(name = "userDao")  
public void setUserDao(UserDaoImpl userDao) {  
    this.userDao = userDao;  
}  

// set方法上的註解,沒有配置name屬性  
@ZxfResource  
public void setUser1Dao(User1DaoImpl user1Dao) {  
    this.user1Dao = user1Dao;  
}  

public void show() {  
    userDao.show();  
    user1Dao.show1();  
    user2Dao.show2();  
    System.out.println("這裡是Service方法........");  
}  

}
3、要注入的DAO
Java程式碼 收藏程式碼
package com.yt.annotation;

/**
* @Description: 要注入的DAo類
* @ClassName: UserDaoImpl
* @Project: spring-aop
*/
public class UserDaoImpl {

String name ;  

public void show(){  
    System.out.println("這裡是dao方法........");  
}  

}
Xml程式碼 收藏程式碼