Spring 註解配置(2)——@Autowired

Spring 註解配置(2)——@Autowired

轉自- 博客地址:http://www.cnblogs.com/caoyc/p/5626365.html 

@Autowired 註釋,它可以對類成員變量、方法及構造函數進行標註,完成自動裝配的工作。 通過 @Autowired的使用來消除 set ,get方法。在使用@Autowired之前,我們對一個bean配置起屬性時,是這用用的

<property name="屬性名" value=" 屬性值"/>    

通過這種方式來,配置比較繁瑣,而且代碼比較多。在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或@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

 

分類: Spring

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章