@Autowired用法詳解
@Autowired 注釋,它可以對類成員變數、方法及建構式進行標注,完成自動裝配的作業。 通過 @Autowired的使用來消除 set ,get方法。在使用@Autowired之前,我們對一個bean配置起屬性時,是這用用的
<property name="屬性名" value="https://bbs.csdn.net/topics/ 屬性值"/>
通過這種方式來,配置比較繁瑣,而且代碼比較多。在Spring 2.5 引入了 @Autowired 注釋
下面用案例來具體說明
UserRepository.java
復制代碼
1 package com.proc.bean.repository;
2
3 public interface UserRepository {
4
5 void save();
6 }
復制代碼
這里定義了一個UserRepository介面,其中定義了一個save方法
UserRepositoryImps.java
復制代碼
復制代碼
1 package com.proc.bean.repository;
2
3 import org.springframework.stereotype.Repository;
4
5 @Repository("userRepository")
6 public class UserRepositoryImps implements UserRepository{
7
8 @Override
9 public void save() {
10 System.out.println("UserRepositoryImps save");
11 }
12 }
復制代碼
復制代碼
定義一個UserRepository介面的實作類,并實作save方法,在這里指定了該bean在IoC中識別符號名稱為userRepository
UserService.java
復制代碼
復制代碼
1 package com.proc.bean.service;
2
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.stereotype.Service;
5
6 import com.proc.bean.repository.UserRepository;
7
8 @Service
9 public class UserService {
10
11 @Autowired
12 private UserRepository userRepository;
13
14 public void save(){
15 userRepository.save();
16 }
17 }
復制代碼
復制代碼
這里需要一個UserRepository型別的屬性,通過@Autowired自動裝配方式,從IoC容器中去查找到,并回傳給該屬性
applicationContext.xml配置
<context:component-scan base-package="com.proc.bean" />
測驗代碼:
1 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
2
3 UserService userService=(UserService) ctx.getBean("userService");
4 userService.save();
輸出結果:UserRepositoryImps save
那么使用@Autowired的原理是什么?
其實在啟動spring IoC時,容器自動裝載了一個AutowiredAnnotationBeanPostProcessor后置處理器,當容器掃描到@Autowied、@Resource(是CommonAnnotationBeanPostProcessor后置處理器處理的)或@Inject時,就會在IoC容器自動查找需要的bean,并裝配給該物件的屬性
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
注意事項:
在使用@Autowired時,首先在容器中查詢對應型別的bean
如果查詢結果剛好為一個,就將該bean裝配給@Autowired指定的資料
如果查詢的結果不止一個,那么@Autowired會根據名稱來查找。
如果查詢的結果為空,那么會拋出例外。解決方法時,使用required=false
舉例說明:
在上面例子中,我們在定一個類來實作UserRepository介面
復制代碼
復制代碼
package com.proc.bean.repository;
import org.springframework.stereotype.Repository;
@Repository
public class UserJdbcImps implements UserRepository {
@Override
public void save() {
System.out.println("UserJdbcImps save");
}
}
復制代碼
復制代碼
這時在啟動容器后,在容器中有兩個UserRepository型別的實體,一個名稱為userRepository,另一個為userJdbcImps。在UserService中
@Autowired
private UserRepository userRepository;
輸出結果:UserRepositoryImps save
這里由于查詢到有兩個該型別的實體,那么采用名稱匹配方式,在容器中查找名稱為userRepository的實體,并自動裝配給該引數。
如果這里想要裝載userJdbcImps的實體,除了將欄位userRepository名稱改成userJdbcImps外,可以提供了一個@Qualifier標記,來指定需要裝配bean的名稱,代碼這樣寫
1 @Autowired
2 @Qualifier("userJdbcImps")
3 private UserRepository userRepository;
輸出結果:UserJdbcImps save
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/231608.html
標籤:Java SE
下一篇:springcloud啟動報錯
