2016-03-04 24 views
5

Tôi rất mới đến mùa xuân, vì vậy tôi có thể đặt câu hỏi ngớ ngẩn nhưng dù sao ...sử dụng @Autowired nhiều lần

Tôi đã xây dựng ứng dụng Spring MVC 4.0.

thiết lập của tôi là như thế này:

điều khiển >> Dịch vụ >> DAO

ở mức điều khiển tôi sử dụng khoảng 4-5 @Autowired biến khác nhau như thế này

@Autowired 
private ClientService clientService; 
@Autowired 
private CommentService commentService; 
@Autowired 
private SearchService searchService; 

Trong Dịch vụ cấp I Autowire cũng có một số DAOs

@Autowired 
SearchDAO searchDAO; 

@Autowired 
private ActivityDAO activityDAO; 

@Autowired 
private UserService userService; 

I có khoảng 10 bộ điều khiển khác nhau và phần lớn trong số chúng tôi @Autowire cùng một dịch vụ, Vì vậy, câu hỏi của tôi là ok hay không?

Tôi có thể sử dụng @Autowire nhiều lần nếu cần hoặc sẽ sử dụng quá nhiều bộ nhớ không? Nó sẽ có một số hiệu ứng khác trên ứng dụng của tôi?

tôi sử dụng Spring 4,0 + ngủ đông JPA

+4

tôi sẽ không lo lắng về việc sử dụng bộ nhớ nhưng rất nhiều phụ thuộc có thể là một dấu hiệu của vi phạm 'Nguyên tắc trách nhiệm duy nhất'. Nó không phải là một quy tắc cứng rắn và nhanh chóng, nhưng có khả năng là các lớp học của bạn có quá nhiều trách nhiệm. Có thể bạn có thể chia chúng thành các dịch vụ nhỏ hơn. –

+1

đậu trong mùa xuân là singleton theo mặc định, vì vậy chỉ có một trường hợp tồn tại. Không có vấn đề về bộ nhớ – Jens

+0

Tôi đồng ý với Ali. Bạn có thể muốn phân chia bộ điều khiển của bạn cũng như – Schrieveslaach

Trả lời

4

Không có vấn đề với @Autowired.

Tự động tìm thấy hạt trong ngữ cảnh mùa xuân và gán cho biến. Nó chỉ là tham chiếu đến cùng một đối tượng của Service/Dao bean. Nó sẽ không tạo bản sao.

Nhưng có quá nhiều đối tượng được tiêm vào một lớp là dấu hiệu của một lớp đang làm rất nhiều. Kiểm tra khả năng tái cấu trúc lớp thành nhiều lớp bất cứ khi nào có thể.

0

@Autowired sẽ tạo một bản sao đơn lẻ của một dịch vụ cụ thể trong ứng dụng của bạn, vì vậy tôi đoán có nhiều autowires cùng một dịch vụ trong bộ điều khiển khác nhau không phải là vấn đề bộ nhớ, trừ khi phạm vi của bean là "nguyên mẫu" trong trường hợp đó, spring sẽ tạo ra nhiều cá thể.

+0

Autowired sẽ không tạo ra cá thể nhưng tìm đậu và gán cho biến. Nguyên mẫu phạm vi được áp dụng cho vị trí mà bean được tạo và không được Autowired. –

0

Tôi có khoảng 10 bộ điều khiển khác nhau và trong phần lớn chúng tôi @Autowire cùng một dịch vụ, Vì vậy, câu hỏi của tôi là ok hay không?

Bạn có thể sử dụng lại các dịch vụ giữa các bộ điều khiển. Điều đó nói rằng, tôi sẽ ngần ngại sử dụng nhiều hơn một vài dịch vụ trong mỗi bộ điều khiển và cấu trúc lại mã để bộ điều khiển không phát triển "quá béo". Nói chung, tôi cố gắng giữ cho bộ điều khiển của tôi như một lớp bản đồ giữa thế giới HTTP và thế giới Java và đẩy tất cả logic nghiệp vụ xuống lớp dịch vụ.

Mùa xuân sẽ tạo hạt với singelton scope theo mặc định, có nghĩa là nếu bạn tự động lấy cùng một bean trong nhiều bộ điều khiển, chúng sẽ chia sẻ cùng một cá thể bean.

Bạn có thể sử dụng @Autowire bao nhiêu lần tùy thích hoặc sẽ sử dụng quá nhiều bộ nhớ không? Nó sẽ có một số hiệu ứng khác trên ứng dụng của tôi?

Tự động tự động không đòi hỏi nhiều bộ nhớ, nó chỉ là tham chiếu đến một cá thể đối tượng Java.Thông thường, Spring bean không chứa bất kỳ trạng thái nào (chúng ủy nhiệm cho các thành phần như cache và cơ sở dữ liệu), trừ khi bạn làm điều gì đó đặc biệt, bạn không phải lo lắng về việc sử dụng bộ nhớ.

Một điều cần lưu ý là nếu bạn nên tránh tạo phụ thuộc vòng tròn giữa các hạt. Vì bạn đang sử dụng trường tiêm, Spring sẽ ném một ngoại lệ trong quá trình khởi tạo ứng dụng và bạn cần phải cấu trúc lại ứng dụng của bạn.

1

Câu trả lời và một số nhận xét đã đưa ra câu trả lời về những lo ngại về bộ nhớ của bạn. Về câu hỏi khác của bạn

Tôi có khoảng 10 bộ điều khiển khác nhau và trong phần lớn trong số họ tôi dịch vụ @Autowire cùng, Vì vậy, câu hỏi của tôi là thế này ok hay không?

Từ quan điểm thiết kế, nó nghe có vẻ rất tệ. Ali Deghani đã đề cập đến nguyên tắc Trách nhiệm duy nhất. Trong thực tế, nếu bạn đã di chuyển dịch vụ của bạn từ autowiring như trường để autowiring qua constructor nó ngay lập tức sẽ gợi ý nếu bạn nên xem xét cấu trúc lại, amongst other benefits

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