@Autowired用法詳解


  • @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

 

轉自:https://www.cnblogs.com/caoyc/p/5626365.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM