2015-08-14 19 views
7

Tôi đang có cấu hình sau đây, trong đó có hai bean Spring có cùng tên từ hai lớp cấu hình khác nhau.Khởi động mùa xuân không phàn nàn về hai hạt có cùng tên

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.client.RestTemplate; 

@Configuration 
public class RestTemplateConfiguration { 

    @Bean 
    public RestTemplate restTemplate() { 
     return new RestTemplate(); 
    } 
} 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.client.RestTemplate; 

@Configuration 
public class OtherRestTemplateConfiguration { 

    @Bean 
    public RestTemplate restTemplate() { 
     return new RestTemplate(); 
    } 
} 

Và tôi tiêm (và sử dụng) đậu này như thế này:

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 
import org.springframework.web.client.RestTemplate; 

@Component 
public class SomeComponent { 

    @Autowired 
    private RestTemplate restTemplate; 

} 

Bây giờ, câu hỏi của tôi là: tại sao mùa xuân không phàn nàn về việc có nhiều đậu với cùng tên? Tôi mong đợi một ngoại lệ ở đây và phải thêm chú thích @Primary để đảm bảo rằng chú thích đúng được sử dụng.

Lưu ý phụ: ngay cả khi tôi thêm @Primary thì vẫn không phải lúc nào cũng tiêm đúng.

+1

Bạn không thể có đậu có cùng tên, kết quả cuối cùng sẽ là một hạt duy nhất như là một hạt đậu đè khác, do cùng tên. Do đó chỉ có một hạt duy nhất trong ngữ cảnh. Để nhận được nhiều bean, hãy cung cấp cho chúng các tên khác nhau và chú thích một tên bằng '@ Primary'. –

Trả lời

3

Một trong những hạt cà phê được trọng kia vì bạn sử dụng cùng một tên. Nếu tên gọi khác nhau đã được sử dụng như @ Paweł-głowacz đề nghị, sau đó trong trường hợp sử dụng

@Autowired 
private RestTemplate myRestTemplate; 

mùa xuân sẽ phàn nàn vì nó tìm thấy hai đậu với loại RestTemplate cùng và doesnt biết mà sử dụng. Sau đó, bạn áp dụng @Primary cho một trong số chúng.

Nhiều lời giải thích ở đây: more info

+0

Tôi đã tiêm đậu theo tên và mùa xuân không phàn nàn. Đã cập nhật câu hỏi. – wjans

+1

của nó không phàn nàn bởi vì 1 là overriden bởi 2nd, bởi vì cùng một tên được sử dụng :) hãy xem vào các bản ghi, bạn sẽ tìm thấy thông báo bắt đầu với 'định nghĩa bean Overriding cho bean 'restTemplate'' – freakman

+0

Ok, do đó, một trong số họ được overriden . Nhưng ngay cả khi tôi thêm '@ Primary' vào đúng, nó vẫn không lấy cái đó. (Đó là những gì tôi đã cố gắng ở nơi đầu tiên). Phần nhật ký ghi đè thậm chí đề cập đến việc thay thế '... primary = true ...' bằng '... primary = false ...' – wjans

0

Bạn cần phải đặt tên cho rằng đậu vậy:

@Configuration 
public class RestTemplateConfiguration { 

    @Bean(name="bean1") 
    public RestTemplate restTemplate() { 
     return new RestTemplate(); 
    } 
} 

@Configuration 
public class OtherRestTemplateConfiguration { 

    @Bean(name="bean2") 
    public RestTemplate restTemplate() { 
     return new RestTemplate(); 
    } 
} 
+0

Tôi không muốn phân biệt giữa hai người. Tôi muốn chú thích cái tôi muốn sử dụng với '@ Primary', nhưng câu hỏi của tôi là tại sao nó không bị xung đột mà không có chú giải. – wjans

+0

Khi bạn đánh dấu bằng '@ Bean' bạn nói với mùa xuân rằng:' Này bạn, bạn sẽ quản lý các đối tượng đó'. Vì vậy, mùa xuân tạo proxy cho các đối tượng đó. Theo mùa xuân quản lý với chú thích '@ Bean' mùa xuân cần phải có đậu độc đáo. Trong ví dụ trên để làm cho điều đó xảy ra, bạn phải đánh dấu đậu với tên duy nhất để giải quyết xung đột cuộc gọi mùa xuân đó. Nếu không có chú thích '@ Bean' mùa xuân sẽ không biết gì về đậu đó và sẽ không có lỗi –

+0

Vâng, tôi hiểu điều đó, nhưng tại sao nó không phàn nàn khi họ có cùng tên? – wjans

Các vấn đề liên quan