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程式碼 收藏程式碼