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

