1. 程式人生 > >20、自動裝配[email protected]&@Qualifier&am

20、自動裝配[email protected]&@Qualifier&am

20、自動裝配[email protected]&@Qualifier&@Primary

  • 自動裝配:Spring 利用依賴注入(DI),完成對IOC容器中各個依賴關係賦值

20.1 @Autowired :自動注入

  • 預設優先按照型別去容器中找對應的元件,applicationContext.getBean(BookRepository.class),找到就賦值。
  • 如果找到多個相同型別的元件,再將屬性名稱作為元件的id 去容器中查詢applicationContext.getBean("bookRepository")
  • 使用 @Qualifier("bookRepository")
    指定裝配元件
  • 自動裝配預設一定要將屬性賦值好,沒有就會報錯。可以使用@Autowired(required = false)來配置非必須的注入,有則注入,沒有就算了。
  • @Primary 讓Spring進行自動裝配的時候,預設選擇需要裝配的bean,也可以繼續使用@Qualifier 指定需要裝配的bean的名稱
  • @Qualifier 的權重大於 @Primary,如果指定了@Qualifier@Primary失效

20.2 程式碼例項

  • MainConfigOfAutowired.java
package com.hw.springannotation.config;

import com.hw.springannotation.dao.BookRepository;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.management.relation.RelationType;

/**
 * @Description 自動裝配:
 * <p>
 * Spring 利用依賴注入(DI),完成對IOC容器中各個依賴關係賦值
 * 1. @Autowire
 * @Author hw
 * @Date 2018/11/29 16:04
 * @Version 1.0
 */
@Configuration
@ComponentScan({"com.hw.springannotation.service", "com.hw.springannotation.controller", "com.hw.springannotation.dao"})
public class MainConfigOfAutowired {

    @Primary // 首選裝配bean
    @Bean("bookRepository2")
    public BookRepository bookRepository() {
        return new BookRepository("2");
    }
}
  • BookService.java
@Service
public class BookService {

    @Autowired(required = false)
    // @Qualifier("bookRepository")
    private BookRepository bookRepository2;

    public void print() {
        System.out.println("bookRepository2。。。");
    }

    @Override
    public String toString() {
        return "BookService{" +
                "bookRepository=" + bookRepository2 +
                '}';
    }
}
  • 測試用例
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAutowired.class);

@Test
public void test1() {
    BookService bookService = applicationContext.getBean(BookService.class);
    System.out.println(bookService);

    applicationContext.close();
}