@Autowired//預設按type注入 @Qualifier(“cusInfoService”)//一般作為@Autowired()的修飾用
@Resource(name=“cusInfoService”)//預設按name注入,可以通過name和type屬性進行選擇性注入
一般@Autowired和@Qualifier一起用,@Resource單獨用。
當然沒有衝突的話@Autowired也可以單獨用
這三個是根據實際情況來使用的,通常使用@Autowired和@Resource多一些,bean的名字不用寫,而UserServiceImpl上面能會這樣寫 @Service(“userService”)。是整個專案設計時候考慮的情況,如果架構設計師考慮的比較精細,要求比較嚴格,要求專案上線後的訪問速度比較好,通常是考慮速度了。這個時候@Autowired沒有@Resource好用,因為@Resource可以根據名字來搜尋,是這樣寫的@Resource(“userService”)。不使用@Autowired @Qualifie(“userService”) 的原因很簡單,有點長,不喜歡,增加工作量。因為根據名字搜尋是最快的,就像查資料庫一樣,根據Id查詢最快。因為這裡的名字與資料庫裡面的ID是一樣的作用。此時工作量自然就增加了。而如果不用註解,用xml檔案的時候,對於注入Bean的時候要求寫一個Id,xml檔案時候的id就相當於這裡的名字。
通常情況一個Bean的註解寫錯了,會報下面這些錯誤,最為常見,No bean named ‘user’ is defined,這個表示沒有找到被命名為user的Bean,通俗的說,就是名字為user的型別,以及它的子型別,出現這個錯誤的原因就是注入時候的型別名字為user,而搜尋的時候找不到,也就是說可能那個搜尋的型別,並沒有命令為user,解決辦法就是找到這個型別,去命令為user,
下面這個錯誤也常見,No qualifying bean of type [com.service.UserService] found for dependency: 這個錯誤的原因就是型別上面沒有加@Service這個注入,不僅僅是@Service,如果是其他層也會出現這個錯誤,這裡我是以Service為例子說明,如果是DAO層就是沒有加@Repository,Controller層,則是沒有加@Controller。
還有,如果還想再簡單點,無論是DAO,Controller,Service三個層,都可以用這個註解,@Component,這個註解通用所有的Bean,但是使用的人比較少,因為 MVC 的分層設計原則,用@Repository,@Service,@Controller,這個可以區別 MVC 原則中的DAO,Service,Controller。便於識別。
-----------常用註解--------
–定義Bean的註解
@Controller
@Controller(“Bean的名稱”)
定義控制層Bean,如Action
@Service
@Service(“Bean的名稱”)
定義業務層Bean
@Repository
@Repository(“Bean的名稱”)
定義DAO層Bean
@Component
定義Bean, 不好歸類時使用.
–自動裝配Bean (選用一種註解就可以)
@Autowired (Srping提供的)
預設按型別匹配,自動裝配(Srping提供的),可以寫在成員屬性上,或寫在setter方法上
@Autowired(required=true)
一定要找到匹配的Bean,否則拋異常。 預設值就是true
@Autowired
@Qualifier(“bean的名字”)
按名稱裝配Bean,與@Autowired組合使用,解決按型別匹配找到多個Bean問題。
@Resource JSR-250提供的
預設按名稱裝配,當找不到名稱匹配的bean再按型別裝配.
可以寫在成員屬性上,或寫在setter方法上
可以通過@Resource(name=“beanName”) 指定被注入的bean的名稱, 要是未指定name屬性, 預設使用成員屬性的變數名,一般不用寫name屬性.
@Resource(name=“beanName”)指定了name屬性,按名稱注入但沒找到bean, 就不會再按型別裝配了.
@Inject 是JSR-330提供的
按型別裝配,功能比@Autowired少,沒有使用的必要。
–定義Bean的作用域和生命過程
@Scope(“prototype”)
值有:singleton,prototype,session,request,session,globalSession
@PostConstruct
相當於init-method,使用在方法上,當Bean初始化時執行。
@PreDestroy
相當於destory-method,使用在方法上,當Bean銷燬時執行。
–宣告式事務
@Transactional