簡體   English   中英

使用 Spring Autowired 注解的要求

[英]Requirements to use Spring Autowired annotation

我上周開始學習 Spring Boot,所以我仍然掌握了一切。 Autowired 看起來不錯,但是在存儲庫等字段上使用它時,我偶爾會遇到麻煩。 我已經嘗試搜索使用它的要求,但我真的找不到明確的來源。

例如,如果有錯誤,請糾正其中任何一個,我知道:

  • 不要自己實例化該字段。 否則,自動裝配將不起作用。
  • object 不能是 static,因為 static 字段是在 Z38008DD81C2F4D798ZCED 之前設置的,但是有一個解決方法1)。
  • 字段所在的 class 必須至少有 @Component 或從它派生的東西。
  • 帶有 Autowired 字段的 package 必須等於或低於帶有 @SpringBootApplication(或 @ComponentScan)的 package。

我必須自己找到第 2、3 和 4 點。 它們沒有在任何地方列出,我只在其他 StackOverflow 答案中遇到過它們。

那里還有什么? 本質上,我有:

@Component
public class BookSearchClient {

    @Autowired
    private BookRepository bookRepository;

    public List<Book> processBookResult(String json) {
        GoogleBook googleBooks = JsonUtil.googleBookFromJson(json);
        List<Book> bookList = ConversionUtil.googleBooksToSimpleBooks(googleBooks);
        for (Book book : bookList) {
            bookList.add(book);
            if (findBook(book) == null) {
                bookRepository.save(book);
            }
        }
        return bookList;
    }

    private Book findBook(Book book) {
        Book foundBook = bookRepository.findByIsbn13(book.getIsbn13());
        if (foundBook == null) {
            foundBook = bookRepository.findByIsbn10(book.getIsbn10());
        }

        return foundBook;
    }
}

接着:

@Repository
public interface BookRepository extends CrudRepository<Book, Long> {
    Book findByIsbn10(String isbn10);
    Book findByIsbn13(String isbn13);
}

到目前為止,我遇到了所有這些問題,但仍然收到 bookRepository 的 null 指針異常。 控制器在沒有我在存儲庫上使用@Repository的情況下工作,但我想我會添加它以查看它是否有幫助(它沒有幫助)。 我有類似的類也符合上面列表中概述的模式(特別是@RestController s),但在這種情況下它不起作用。 我知道我錯過了一些東西,我只是不知道它是什么。

我還通過制作BookSearchClient Autowired解決了這個問題。 我想在上面的列表中添加另一個點(並且不相關,可能根據@sarcode 刪除第 3 點),似乎整個鏈上的每個 object 也需要@Autowired

試試這個。 它應該工作。

@RestController
public class BookController
{
        @Autowired
        BookSearchClient bookSearchClient;
}

@Service
public class BookSearchClient {

    @Autowired
    private BookRepository bookRepository;

    public List<Book> processBookResult(String json) {
        GoogleBook googleBooks = JsonUtil.googleBookFromJson(json);
        List<Book> bookList = ConversionUtil.googleBooksToSimpleBooks(googleBooks);
        for (Book book : bookList) {
            bookList.add(book);
            if (findBook(book) == null) {
                bookRepository.save(book);
            }
        }
        return bookList;
    }

    private Book findBook(Book book) {
        Book foundBook = bookRepository.findByIsbn13(book.getIsbn13());
        if (foundBook == null) {
            foundBook = bookRepository.findByIsbn10(book.getIsbn10());
        }

        return foundBook;
    }
}

@Repository
public interface BookRepository extends CrudRepository<Book, Long> {
    Book findByIsbn10(String isbn10);
    Book findByIsbn13(String isbn13);
}

你的第三點是無效的。 您可以在配置 class 中顯式創建一個 bean 實例,並通過 @Autowired 注釋調用它。

@Configuration
public class BookConfig
{
 @Bean
 public <className>  getBean()
  {
       return new <className>();
  }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM