2015-05-20 12 views
6

Tôi đang đọc sách bắt đầu mùa xuân (wiley press). Trong chương 2 có một ví dụ về cấu hình Java và @Autowired. Nó cung cấp @Configuration lớp nàyCó phải Spring @Autowired tiêm đậu theo tên hoặc theo loại không?

@Configuration 
public class Ch2BeanConfiguration { 

    @Bean 
    public AccountService accountService() { 
     AccountServiceImpl bean = new AccountServiceImpl(); 
     return bean; 
    } 

    @Bean 
    public AccountDao accountDao() { 
     AccountDaoInMemoryImpl bean = new AccountDaoInMemoryImpl(); 
     //depedencies of accountDao bean will be injected here... 
     return bean; 
    } 

    @Bean 
    public AccountDao accountDaoJdbc() { 
     AccountDaoJdbcImpl bean = new AccountDaoJdbcImpl(); 
     return bean; 
    } 
} 

và lớp này đậu thường xuyên

public class AccountServiceImpl implements AccountService { 

    @Autowired 
    private AccountDao accountDao; 

    public void setAccountDao(AccountDao accountDao) { 
     this.accountDao = accountDao; 
    } 
    ... 
} 

Khi tôi chạy mã này, nó hoạt động. Nhưng tôi mong đợi một ngoại lệ vì tôi đã xác định 2 hạt có cùng loại trong cấu hình.

tôi nhận ra nó hoạt động như thế này:

  • nếu mùa xuân gặp nhiều đậu với cùng loại nó sẽ kiểm tra tên trường.
    • nếu tìm thấy đậu có tên của trường mục tiêu, nó sẽ đưa hạt đó vào trường.

Điều này không đúng? Có lỗi trong xử lý cấu hình Java của Spring không?

Trả lời

5

Các documentation giải thích điều này

Đối với một trận đấu dự phòng, tên đậu được coi là một vòng loại mặc định giá trị. Vì vậy, bạn có thể xác định bean có id "main" thay vì phần tử vòng loại lồng nhau, dẫn đến cùng một kết quả phù hợp. Tuy nhiên, mặc dù bạn có thể sử dụng Công ước này để tham khảo đậu cụ thể theo tên, @Autowired là cơ bản về loại-driven tiêm với vòng loại ngữ nghĩa không bắt buộc. Điều này có nghĩa là các giá trị vòng loại, ngay cả với tên dự phòng bean, luôn có ngữ nghĩa thu hẹp trong tập hợp các loại đối sánh; chúng không diễn đạt một cách semantically một tham chiếu vào một id bean duy nhất

Vì vậy, không, đó không phải là lỗi, đó là hành vi dự định. Id bean (name) sẽ được sử dụng như một dự phòng nếu một autowiring by-type không tìm thấy một bean phù hợp.

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