Chính xác thì Spring Framework để làm gì? [đóng cửa]


623

Tôi nghe nhiều về Spring , mọi người đang nói trên web rằng Spring là một khuôn khổ tốt để phát triển web. Chính xác thì Spring Framework để làm gì?


10
Tôi hiểu rằng câu hỏi rất rộng, nhưng tôi nghĩ rằng trong trường hợp rất cụ thể này, câu hỏi rất quan trọng đối với các nhà phát triển Junion, những người thường nói về Spring bởi những người cho rằng nó đủ phổ biến mà thậm chí không cần phải nói gì nó làm Sau tất cả, hãy giơ tay nếu bạn chưa bao giờ nghe về Instagram và mục đích của nó là gì .... (thú nhận: Tôi chưa bao giờ sử dụng Insta)
usr-local-

2
Câu hỏi đã được hỏi cách đây 10 năm và vào thời điểm đó, Spring nhỏ hơn một chút so với bây giờ với tất cả các dự án phụ của nó, chẳng hạn như Spring Boot, Spring Data, Spring Rest, v.v. Và thực sự đó là lý do tại sao nó gần hơn một năm trước, bởi vì sự rộng rãi của câu hỏi này Tại thời điểm tôi hỏi câu hỏi này, tôi chỉ muốn hiểu DI và tại sao nó lại cần thiết.
Maksim

Câu trả lời:


713

Về cơ bản mùa xuân là một khuôn khổ cho đó là một mô hình cho phép xây dựng các hệ thống tách rời.

Vấn đề

Ví dụ: giả sử bạn cần liệt kê người dùng của hệ thống và do đó khai báo giao diện có tên UserLister:

public interface UserLister {
    List<User> getUsers();
}

Và có thể một triển khai truy cập cơ sở dữ liệu để có được tất cả người dùng:

public class UserListerDB implements UserLister {
    public List<User> getUsers() {
        // DB access code here
    }
}

Theo quan điểm của bạn, bạn sẽ cần truy cập một thể hiện (chỉ là một ví dụ, hãy nhớ):

public class SomeView {
    private UserLister userLister;

    public void render() {
        List<User> users = userLister.getUsers();
        view.render(users);
    }
}

Lưu ý rằng mã ở trên không khởi tạo biến userLister. Chúng ta nên làm gì? Nếu tôi rõ ràng khởi tạo đối tượng như thế này:

UserLister userLister = new UserListerDB();

... Tôi muốn kết hợp quan điểm với việc triển khai lớp truy cập DB. Điều gì xảy ra nếu tôi muốn chuyển từ triển khai DB sang một cái khác lấy danh sách người dùng từ tệp được phân tách bằng dấu phẩy (hãy nhớ, đó là một ví dụ)? Trong trường hợp đó, tôi sẽ đi đến mã của mình một lần nữa và thay đổi dòng trên thành:

UserLister userLister = new UserListerCommaSeparatedFile();

Điều này không có vấn đề gì với một chương trình nhỏ như thế này nhưng ... Điều gì xảy ra trong một chương trình có hàng trăm lượt xem và số lớp kinh doanh tương tự? Việc bảo trì trở thành một cơn ác mộng!

Cách tiếp cận mùa xuân (tiêm phụ thuộc)

Những gì Spring làm là kết nối các lớp bằng cách sử dụng tệp hoặc chú thích XML, theo cách này, tất cả các đối tượng được khởi tạo và khởi tạo bởi Spring và được chèn vào đúng chỗ (Servlets, Web Frameworks, Business class, DAO, v.v., v.v. ...).

Quay trở lại ví dụ trong Spring, chúng ta chỉ cần có một trình thiết lập cho userListertrường và có một tệp XML như thế này:

<bean id="userLister" class="UserListerDB" />

<bean class="SomeView">
    <property name="userLister" ref="userLister" />
</bean>

hoặc đơn giản hơn là chú thích các tệp trong lớp xem của chúng tôi với @Inject:

@Inject
private UserLister userLister;

Bằng cách này, khi quan điểm được tạo ra nó một cách kỳ diệu sẽ có UserListersẵn sàng làm việc.

List<User> users = userLister.getUsers();  // This will actually work
                                           // without adding any line of code

Nó thật tuyệt! Phải không?

  • Điều gì nếu bạn muốn sử dụng một thực hiện UserListergiao diện khác của bạn ? Chỉ cần thay đổi XML.
  • Điều gì xảy ra nếu không có UserListersẵn một triển khai? Chương trình thực hiện giả thời gian UserListervà dễ dàng phát triển quan điểm.
  • Nếu tôi không muốn sử dụng Spring nữa thì sao? Đừng sử dụng nó! Ứng dụng của bạn không được kết hợp với nó. Đảo ngược điều khiển trạng thái: "Ứng dụng kiểm soát khung, không phải khung kiểm soát ứng dụng".

Có một số tùy chọn khác cho Dependency Injection xung quanh đó, theo ý kiến ​​của tôi đã khiến Spring trở nên nổi tiếng bên cạnh sự đơn giản, thanh lịch và ổn định của nó là các chàng trai của SpringSource đã lập trình nhiều POJO giúp tích hợp Spring với nhiều khung công tác chung khác mà không cần xâm nhập vào ứng dụng của bạn. Ngoài ra, Spring có một số tiểu dự án tốt như Spring MVC, Spring WebFlow, Spring Security và một lần nữa một danh sách loooong của vveteras.

Hi vọng điêu nay co ich. Dù sao, tôi khuyến khích bạn đọc bài viết của Martin Fowler về Dependency Injection và Inversion of Control bởi vì anh ấy làm điều đó tốt hơn tôi. Sau khi hiểu những điều cơ bản, hãy xem Tài liệu mùa xuân , theo tôi, nó được sử dụng để trở thành cuốn sách Mùa xuân hay nhất từ ​​trước đến nay.


148
Có gì khác biệt giữa việc phải thay đổi một dòng mã và một dòng XML? Nỗ lực và bảo trì địa ngục là hoàn toàn giống nhau, hoặc thậm chí tệ hơn, vì các tệp xml bên ngoài được cho là thêm phức tạp? Xin lỗi nhưng tôi không nhận được nó, tôi không thấy bất kỳ lợi ích nào cả. Xin vui lòng điền tôi nếu tôi thiếu một cái gì đó.
fred

23
@fred - Hãy tưởng tượng bạn đang làm bài kiểm tra đơn vị. Nếu không có sự phụ thuộc (DI có thể được sử dụng với các chú thích hoặc với XML), bạn không thể kiểm tra chính xác, vì bạn không thể chế giễu các phụ thuộc.
Petar Minchev

18
@fred - Xác định tất cả nội dung trong XML thực sự có ý nghĩa rất nhỏ. Đó là một chi phí lớn để duy trì. Do đó EJB đã giới thiệu khái niệm chú thích cho các điểm tiêm. Những cái đó đơn giản hơn nhiều và một thể hiện mặc định sẽ được đưa vào (đối với các bài kiểm tra đơn vị, điều này có thể được thay đổi một lần). Điều này làm việc rất tốt đến nỗi Spring đã sao chép phương pháp này. Lưu ý rằng nếu cần (nhưng chỉ khi thực sự cần) các chú thích vẫn có thể được ghi đè bằng XML trong EJB.
Mike Braun

36
Hoặc, bạn biết, sử dụng một phương pháp tĩnh nhà máy. Thay đổi loại trả về của nhà máy và bây giờ tất cả các lớp sử dụng giá trị trả về đó đều được thay đổi. Presto Spring bây giờ không còn cần thiết nữa ...
Qix - MONICA ĐƯỢC PHÂN BIỆT

16
@mmcrae Tôi thà thực hiện một cuộc gọi tái cấu trúc trong IDE của mình hơn là viết XML.
Qix - MONICA ĐƯỢC PHÂN BIỆT

63

Spring chứa ( như Skaffman đã chỉ ra đúng ) một khung MVC. Để giải thích ngắn gọn ở đây là đầu vào của tôi. Spring hỗ trợ phân tách lớp dịch vụ, lớp web và lớp nghiệp vụ, nhưng điều thực sự tốt nhất là "tiêm" các đối tượng. Vì vậy, để giải thích rằng với một ví dụ hãy xem xét ví dụ dưới đây:

public interface FourWheel
{
   public void drive();
}

public class Sedan implements FourWheel
{
   public void drive()
   {
      //drive gracefully
   }
}

public class SUV implements FourWheel
{
   public void drive()
   {
      //Rule the rough terrain
   }
}

Bây giờ trong mã của bạn, bạn có một lớp được gọi là RoadTrip như sau

public class RoadTrip
{
    private FourWheel myCarForTrip;
}

Bây giờ bất cứ khi nào bạn muốn một ví dụ của Trip; đôi khi bạn có thể muốn một chiếc SUV khởi tạo FourWheel hoặc đôi khi bạn có thể muốn có Sedan. Nó thực sự phụ thuộc vào những gì bạn muốn dựa trên tình hình cụ thể.

Để giải quyết vấn đề này, bạn muốn có một Mô hình Nhà máy làm mẫu sáng tạo. Trường hợp một nhà máy trả lại đúng ví dụ. Vì vậy, cuối cùng bạn sẽ kết thúc với rất nhiều mã keo chỉ để khởi tạo các đối tượng một cách chính xác. Spring làm công việc mã keo tốt nhất mà không cần mã keo đó. Bạn khai báo ánh xạ trong XML và nó tự động khởi tạo các đối tượng. Nó cũng sử dụng nhiều kiến ​​trúc singleton và giúp tối ưu hóa việc sử dụng bộ nhớ.

Điều này cũng được gọi là Inversion Of Control. Các khuôn khổ khác để làm điều này là Google guice, Pico container, v.v.

Ngoài ra, Spring có khung xác nhận, hỗ trợ rộng rãi cho lớp DAO phối hợp với JDBC, iBatis và Hibernate (và nhiều hơn nữa). Cung cấp kiểm soát giao dịch tuyệt vời đối với các giao dịch cơ sở dữ liệu.

Có rất nhiều điều về Mùa xuân có thể được đọc trong những cuốn sách hay như "Mùa xuân chuyên nghiệp".

Các URL sau cũng có thể giúp ích.
http://static.springframework.org/docs/Spring-MVC-step-by-step/
http://en.wikipedia.org/wiki/Spring_Framework
http://www.theserverside.com/tt/articles/article .tss? l = SpringFramework


5
Spring chứa một khung MVC. Nhưng nó rất nhiều, nhiều hơn thế.
skaffman

Không muốn nit quá nhiều, WebMVC là một phần của bản phân phối mùa xuân cốt lõi. Webflow, RCP et al thì không.
skaffman

1
Thật tuyệt, tôi không biết rằng bạn có thể khởi tạo các đối tượng thuộc loại Giao diện trong Java - đó là bất hợp pháp @skaffman giúp tôi hiểu câu trả lời này (xem Instance of FourWheel)
Jossie Calderon

47

Ngày xưa, Spring là một khung tiêm phụ thuộc chỉ hoạt động như ( Guice , PicoContainer , ...), nhưng ngày nay nó là một giải pháp tổng thể để xây dựng Ứng dụng Doanh nghiệp của bạn .

Tiêm phụ thuộc vào mùa xuân, tất nhiên, trái tim của mùa xuân vẫn còn đó (và bạn có thể xem lại các câu trả lời hay khác ở đây), nhưng có nhiều hơn từ mùa xuân ...

Mùa xuân bây giờ có rất nhiều dự án, mỗi dự án có một số dự án phụ ( http://spring.io/projects ). Khi ai đó nói về mùa xuân, bạn phải tìm hiểu xem anh ấy đang nói về dự án mùa xuân nào , đó chỉ là cốt lõi của mùa xuân, được gọi là khung mùa xuân , hay đó là một dự án mùa xuân khác.

Một số dự án mùa xuân đáng được đề cập là:

Nếu bạn cần thêm một số tính năng chỉ định cho ứng dụng của mình, bạn cũng có thể tìm thấy nó ở đó:

  • Khung lô Spring Batch được thiết kế để cho phép phát triển
    ứng dụng lô
  • Spring HATEOAS dễ dàng tạo API REST dựa trên hiệu trưởng HATEOAS
  • Spring MobileSpring Andriod để phát triển ứng dụng di động
  • Spring Shell xây dựng một ứng dụng shell (còn gọi là dòng lệnh) đầy đủ tính năng
  • Luồng dữ liệu Spring CloudSpring Cloud cho các ứng dụng đám mây

Ngoài ra còn có một số dự án nhỏ ở đó, ví dụ như spring-social-facebook ( http://projects.spring.io/spring-social-facebook/ )

Bạn có thể sử dụng mùa xuân để phát triển web vì nó có Spring MVCmô-đun là một phần của dự án Spring Framework . Hoặc bạn có thể sử dụng mùa xuân với một khung web khác, như struts2 .


1
Tôi thực sự muốn thấy mvc, dữ liệu, jpa và các phần khác của Spring có tùy chọn không sử dụng DI lõi của Spring, nhưng thay vào đó hãy đặt Dagger vào trung tâm của Spring.
dlamblin

25

Mùa xuân để làm gì? Tôi sẽ trả lời câu hỏi đó ngay, nhưng trước tiên, chúng ta hãy xem xét lại ví dụ của người chiến thắng hugo. Đây không phải là một ví dụ tuyệt vời vì nó không chứng minh sự cần thiết của một khung công tác mới.

public class BaseView {
  protected UserLister userLister;

  public BaseView() {
    userLister = new UserListerDB(); // only line of code that needs changing
  }
}

public class SomeView extends BaseView {
  public SomeView() {
    super();
  }

  public void render() {
    List<User> users = userLister.getUsers();
    view.render(users);
  }
}

Làm xong! Vì vậy, ngay cả khi bạn có hàng trăm hoặc hàng nghìn lượt xem, bạn vẫn chỉ cần thay đổi một dòng mã, như trong cách tiếp cận Spring XML. Nhưng việc thay đổi một dòng mã vẫn đòi hỏi phải biên dịch lại thay vì chỉnh sửa XML mà bạn nói? Vâng, người bạn khó tính của tôi, sử dụng Ant và script đi!

Vậy mùa xuân để làm gì? Nó được dùng để:

  1. Những nhà phát triển mù theo bầy đàn
  2. Nhà tuyển dụng không bao giờ muốn thuê lập trình viên tốt nghiệp vì họ không dạy những khuôn khổ như vậy tại Uni
  3. Các dự án bắt đầu với một thiết kế xấu và cần chắp vá (như thể hiện qua ví dụ của người chiến thắng hugo)

Đọc thêm: http://discuss.joelonsoftware.com/?joel.3.219431.12


11
Thất vọng sang một bên, tôi tự hỏi về lập luận của bạn. Tôi không biết bất kỳ công cụ lập trình nào mà bạn không thể sử dụng để tạo ra thiết kế xấu. Những gì bạn nhắm đến là sử dụng các khung công tác bạn có thể làm cho mã xấu làm nhiều thứ. Điều đó hoàn toàn đúng và không đặc trưng cho mùa xuân. Nếu không thì vấn đề là gì? Bạn không nghĩ rằng các nhà phát triển có năng lực có thể tận dụng tốt những gì Spring cung cấp - cụ thể là công cụ nào trong khung công tác họ sử dụng? Ít nhất tôi khá chắc chắn rằng bạn không ngụ ý rằng không có nhà phát triển Spring nào từng nghe nói về việc mở rộng các lớp. Việc đọc thêm là vui nhộn, mặc dù.
sthzg

2
Hơn nữa, ví dụ của bạn hoạt động vì chế độ xem chỉ cần một dịch vụ được tiêm ( UserLister), nhưng nếu nó cần một số dịch vụ, không được chia sẻ giữa các BaseViewtrẻ em khác nhau thì sao? (May mắn thay) không có nhiều kế thừa trong Java.
Edouard Berthe

@EdouardBerthe Điểm công bằng. Câu trả lời của tôi không phải là một nỗ lực coi thường DI, nó chỉ nêu ra ví dụ thể hiện trong câu trả lời được chấp nhận không phải là lớn nhất; kịch bản bạn đang đề xuất rất có thể sẽ hoạt động tốt hơn. Điểm tôi thực sự cố gắng không phải là bạn không cần DI, mà là bạn không cần toàn bộ khuôn khổ để làm điều đó.
Tro

19

Tóm tắt rất ngắn gọn, tôi sẽ nói rằng Spring là "chất keo" trong ứng dụng của bạn. Nó được sử dụng để tích hợp các khung khác nhau và mã của riêng bạn.


15

Mùa xuân là ba điều.

  1. Spring xử lý Dependency Injection và tôi khuyên bạn nên đọc phần giới thiệu tuyệt vời của Martin Fowler về tiêm phụ thuộc.
  2. Điều thứ hai mà Spring thực hiện là bao bọc các thư viện Java xuất sắc theo cách rất thanh lịch để sử dụng trong các ứng dụng của bạn. Để có một ví dụ tốt, hãy xem cách Spring kết thúc các Trình thực thi tác vụ và Trình lập lịch biểu thạch anh.
  3. Thứ ba Spring cung cấp một loạt các triển khai các công cụ web như REST, một khung web MVC và hơn thế nữa. Họ cho rằng vì bạn đang sử dụng Spring cho hai người đầu tiên, có lẽ bạn chỉ có thể sử dụng nó cho mọi thứ mà ứng dụng web của bạn cần.

Vấn đề là Spring DI thực sự được cân nhắc kỹ lưỡng, các trình bao bọc xung quanh những thứ khác thực sự được suy nghĩ kỹ ở chỗ những điều khác nghĩ mọi thứ ra ngoài và Spring chỉ đơn giản là kết thúc tốt đẹp. Việc triển khai Spring của MVC và REST và tất cả các công cụ khác không được thực hiện tốt (YMMV, IMHO) nhưng vẫn có trường hợp ngoại lệ (Spring Security là da bom). Vì vậy, tôi có xu hướng sử dụng Spring cho DI, và các trình bao bọc thú vị của nó nhưng thích các công cụ khác cho Web (tôi thích Tapestry rất nhiều), REST (Jersey thực sự mạnh mẽ), v.v.


9
YMMV, IMHO - Mileage của bạn có thể khác nhau, trong ý kiến ​​khiêm tốn của tôi cho những người không thông thạo chữ viết tắt như tôi ...
Sakamoto Kazuma

11

Những gì bạn có thể muốn trong một ứng dụng web với Spring -

  • Spring MVC, với 2.5+ cho phép bạn sử dụng POJO làm các lớp Trình điều khiển, nghĩa là bạn không phải mở rộng từ bất kỳ khung cụ thể nào (như trong Struts hoặc Spring pre-2.5). Các lớp điều khiển cũng rất đơn giản để kiểm tra nhờ một phần vào phép tiêm phụ thuộc
  • Tích hợp mùa xuân với Hibernate, công việc đơn giản hóa công việc với giải pháp ORM đó (đối với hầu hết các trường hợp)
  • Sử dụng Spring cho ứng dụng web cho phép bạn sử dụng Đối tượng miền của mình ở tất cả các cấp của ứng dụng - các lớp giống nhau được ánh xạ bằng Hibernate là các lớp bạn sử dụng làm "biểu mẫu đậu". Về bản chất, điều này sẽ dẫn đến một mô hình miền mạnh mẽ hơn, một phần vì nó sẽ cắt giảm số lượng các lớp.
  • Thẻ biểu mẫu mùa xuân giúp dễ dàng tạo biểu mẫu mà không gặp nhiều rắc rối.

Ngoài ra, Spring rất LỚN - vì vậy có rất nhiều thứ khác bạn có thể quan tâm khi sử dụng trong một ứng dụng web như Spring AOP hoặc Spring Security. Nhưng bốn điều được liệt kê ở trên mô tả các thành phần phổ biến của Spring được sử dụng trong một ứng dụng web.


9

Tôi thấy hai phần này:

  1. "Chính xác là mùa xuân cho" -> xem câu trả lời được chấp nhận bởi người chiến thắng hugo.
  2. "[...] Spring là [một] khuôn khổ tốt để phát triển web" -> mọi người nói điều này đang nói về Spring MVC. Spring MVC là một trong nhiều phần của Spring và là một khung web sử dụng các tính năng chung của Spring, như tiêm phụ thuộc. Đó là một khung chung chung ở chỗ nó rất có thể cấu hình: bạn có thể sử dụng các lớp db khác nhau (Hibernate, iBatis, JDBC đơn giản), các lớp khung nhìn khác nhau (JSP, Velocity, Freemarker ...)

Lưu ý rằng bạn hoàn toàn có thể sử dụng Spring trong một ứng dụng web mà không cần sử dụng Spring MVC. Tôi muốn nói rằng hầu hết các ứng dụng web Java làm điều này, trong khi sử dụng các khung web khác như Wicket, Struts, Seam, ...


8

Mùa xuân là tuyệt vời để dán các trường hợp của các lớp với nhau. Bạn biết rằng các lớp Hibernate của bạn sẽ luôn cần một nguồn dữ liệu, Spring nối chúng lại với nhau (và cũng có triển khai nguồn dữ liệu).

Các đối tượng truy cập dữ liệu của bạn sẽ luôn cần truy cập Hibernate, Spring kết nối các lớp Hibernate vào DAO cho bạn.

Ngoài ra, Spring về cơ bản cung cấp cho bạn các cấu hình vững chắc của một loạt các thư viện và trong đó, cung cấp cho bạn hướng dẫn về những lib bạn nên sử dụng.

Mùa xuân thực sự là một công cụ tuyệt vời. (Tôi không nói về Spring MVC, chỉ là khung cơ sở).


5

Câu trả lời được chấp nhận không liên quan đến việc sử dụng chú thích kể từ khi Spring giới thiệu hỗ trợ cho các chú thích khác nhau cho cấu hình.

Cách tiếp cận mùa xuân (tiêm phụ thuộc)

Có một cách khác để kết nối các lớp cùng với việc sử dụng tệp XML: các chú thích. Hãy dùng ví dụ từ câu trả lời được chấp nhận và đăng ký đậu trực tiếp trên lớp bằng một trong những chú thích @Component, @Service, @Repositoryhoặc @Configuration:

@Component
public class UserListerDB implements UserLister {
    public List<User> getUsers() {
        // DB access code here
    }
}

Theo cách này, khi chế độ xem được tạo, nó sẽ có UserLister sẵn sàng hoạt động.

Tuyên bố trên là hợp lệ với một phần thưởng nhỏ không cần sử dụng và sử dụng tệp XML với một chú thích khác @Autowiredtìm thấy một triển khai có liên quan và đưa nó vào.

@Autowired
private UserLister userLister;

Sử dụng @Beanchú thích trên một phương thức được sử dụng để thực hiện bean để tiêm.


Sai lầm. Bạn không thể sử dụng @Beanchú thích ở cấp độ lớp. Phải là một trong những @Component, @Service, @Repository, vv Nghỉ ngơi là chính xác. Bạn cũng có thể chỉ ra rằng Tự động cài đặt Giao diện theo cách này sẽ chỉ hoạt động nếu chỉ có 1 lớp ứng viên trong đường dẫn phù hợp để tiêm, nếu không thì lỗi ứng dụng Spring.
Stefano L

@StefanoL: Vâng, bạn nói đúng. Tôi tự hỏi mọi người bỏ qua sai lầm của tôi. Cảm ơn các bình luận.
Nikolas

4

Ưu điểm là Dependency Injection (DI) . Nó có nghĩa là thuê ngoài nhiệm vụ tạo đối tượng. Hãy giải thích với tôi bằng một ví dụ.

public interface Lunch
{
   public void eat();
}

public class Buffet implements Lunch
{
   public void eat()
   {
      // Eat as much as you can 
   }
}

public class Plated implements Lunch
{
   public void eat()
   {
      // Eat a limited portion
   }
}

Bây giờ trong mã của tôi, tôi có một lớp Bữa trưa như sau:

public class LunchDecide {
    private Lunch todaysLunch;
    public LunchDecide(){
        this.todaysLunch = new Buffet(); // choose Buffet -> eat as much as you want
        //this.todaysLunch = new Plated(); // choose Plated -> eat a limited portion 
    }
}

Trong lớp trên, tùy thuộc vào tâm trạng của chúng tôi, chúng tôi chọn Buffet () hoặc Mạ (). Tuy nhiên, hệ thống này được liên kết chặt chẽ. Mỗi khi chúng ta cần một loại Object khác nhau, chúng ta cần thay đổi mã. Trong trường hợp này, bình luận ra một dòng! Hãy tưởng tượng có 50 lớp khác nhau được sử dụng bởi 50 người khác nhau. Nó sẽ là một địa ngục của một mớ hỗn độn. Trong trường hợp này, chúng ta cần tách rời hệ thống. Hãy viết lại lớp lunchDecide.

public class LunchDecide {
    private Lunch todaysLunch;
    public LunchDecide(Lunch todaysLunch){
        this.todaysLunch = todaysLunch
        }
    }

Lưu ý rằng thay vì tạo một đối tượng bằng từ khóa mới, chúng tôi đã chuyển tham chiếu đến một đối tượng của Loại Bữa trưa làm tham số cho hàm tạo của chúng tôi. Ở đây, việc tạo đối tượng được thuê ngoài. Mã này có thể được nối dây bằng cách sử dụng tệp cấu hình Xml (di sản) hoặc Chú thích Java (hiện đại). Dù bằng cách nào, quyết định Loại đối tượng nào sẽ được tạo sẽ được thực hiện ở đó trong thời gian chạy. Một đối tượng sẽ được Xml đưa vào mã của chúng tôi - Mã của chúng tôi phụ thuộc vào Xml cho công việc đó. Do đó, tiêm phụ thuộc (DI). DI không chỉ giúp làm cho hệ thống của chúng tôi được ghép lỏng lẻo, nó đơn giản hóa việc viết các bài kiểm tra Đơn vị vì nó cho phép các phụ thuộc bị chế giễu. Cuối cùng nhưng không kém phần quan trọng, DI hợp lý hóa Lập trình hướng đối tượng (AOP) dẫn đến việc tách rời và tăng tính mô đun hơn nữa. Cũng lưu ý rằng ở trên DI là Con Contortor tiêm.


Nhưng ngay cả trong trường hợp của mùa xuân, chúng ta vẫn sẽ xác định đậu. và id đậu sẽ được cung cấp trong mã, phải không? Vì vậy, nếu bạn thay đổi bean vào ngày mai, bạn vẫn phải thay đổi mã, phải không? vậy lợi ích là gì
Arpan Hội trưởng

@ArpanAW Tôi nghĩ rằng lợi ích của mùa xuân là bạn có thể chọn một triển khai khác mà không cần biên dịch lại bất kỳ mã nào (miễn là việc triển khai khác đã tồn tại). Tôi là người mới bắt đầu, vì vậy tôi có thể sai.
byxor

4
  • Spring là một khung nhẹ và linh hoạt so với J2EE.
  • Spring container hoạt động như một sự đảo ngược của kiểm soát.
  • Spring sử dụng AOP tức là proxy và các mẫu Thiết kế Phương thức Mẫu, Nhà máy và Mẫu.
  • Kiến trúc theo tầng: Tách các mối quan tâm và các lớp Tái sử dụng và Bảo trì dễ dàng.

nhập mô tả hình ảnh ở đây


1
Spring Framework help you with several things like, don't reinvent the wheel. you can connect very easily with some database just using Spring Data, or create schedule tasks like CronJob or Windows Task. amazing !
tomj0101

3

Spring là một sự thay thế tốt cho công nghệ Enterprise JavaBeans (EJB) . Nó cũng có khung web và thành phần khung dịch vụ web.


1
Tôi có thể sửa không? Đã được thay thế cho (khủng khiếp) EJB 2 ... có vẻ như "EJB mới" (một phần, JPA 2, v.v.) đã được chấp nhận. "Giờ hạnh phúc" của phần mùa xuân "một loại EJB" dường như đã là quá khứ. quảng cáo 2015
Jacek Cz

1

Spring bắt đầu như một hệ thống tiêm phụ thuộc khá đơn giản. Bây giờ nó là rất lớn và có tất cả mọi thứ trong đó (ngoại trừ bồn rửa nhà bếp tục ngữ).

Nhưng đừng sợ, nó khá mô-đun để bạn có thể sử dụng chỉ những phần bạn muốn.

Để xem tất cả bắt đầu từ đâu:

http://www.amazon.com/Expert-One-Design-Development-Programmer/dp/0764543857/ref=sr_1_1?ie=UTF8&s=books&qid=1246374863&sr=1-1

Nó có thể cũ nhưng nó là một cuốn sách tuyệt vời.

Đối với một cuốn sách hay khác lần này dành riêng cho mùa xuân, xem:

http://www.amazon.com/Prof Profession-Java-Development-Baby-Frework / dp / 0474564833 / ref = sr_1_2? i = DIF8 & s = books & qid = 1246374863 & sr = 1-2

Nó cũng tham khảo các phiên bản cũ hơn của Spring nhưng chắc chắn đáng xem.


1

Mùa xuân là sự tiêm phụ thuộc vào lúc bắt đầu, sau đó thêm vua của các hàm bao cho hầu hết mọi thứ (bao bọc trên các triển khai JPA, v.v.).

Câu chuyện dài ... hầu hết các phần của giải pháp XML preffer XML (công cụ kịch bản XML ... brrrr), vì vậy đối với DI tôi sử dụng Guice

Thư viện tốt, nhưng với depnedenciec đang phát triển, ví dụ Spring JDBC (có thể là một giải pháp jdbc Java với các tham số tên thật) lấy từ maven 4-5 tiếp theo.

Sử dụng Spring MVC (một phần của "mùa xuân lớn") để phát triển web ... đó là khung "dựa trên yêu cầu", có chiến tranh thần thánh "request vs thành phần" ... tùy thuộc vào Bạn


1
Tôi tin rằng bây giờ Spring framework đang cố gắng chuyển từ XML sang Chú thích và cấu hình Java.
Maksim

0

Trong quá khứ tôi đã nghĩ về khung mùa xuân từ quan điểm hoàn toàn kỹ thuật.

Có một số kinh nghiệm làm việc nhóm và phát triển Webapps doanh nghiệp - Tôi sẽ nói rằng Spring là để phát triển nhanh hơn các ứng dụng (ứng dụng web) bằng cách tách rời các yếu tố riêng lẻ (đậu). Phát triển nhanh hơn làm cho nó rất phổ biến. Spring cho phép chuyển trách nhiệm xây dựng (nối dây) ứng dụng vào khung Spring. Phép tiêm phụ thuộc của khung công tác Spring chịu trách nhiệm kết nối / nối dây các hạt riêng lẻ vào một ứng dụng hoạt động.

Bằng cách này, các nhà phát triển có thể tập trung nhiều hơn vào việc phát triển các thành phần riêng lẻ (đậu) ngay khi giao diện giữa các hạt được xác định.

Việc kiểm tra ứng dụng này rất dễ dàng - trọng tâm chính được dành cho từng hạt đậu. Chúng có thể dễ dàng tách rời và chế giễu, do đó kiểm tra đơn vị là nhanh chóng và hiệu quả.

Spring framework định nghĩa nhiều bean chuyên dụng như @Controll ( @Restcontroll ), @Rep repository , @Component để phục vụ các mục đích web. Spring cùng với Maven cung cấp một cấu trúc trực quan cho các nhà phát triển. Làm việc nhóm rất dễ dàng và nhanh chóng vì có các yếu tố riêng biệt được tách rời và có thể được sử dụng lại.


0

Spring framework chắc chắn tốt cho phát triển web và cụ thể hơn cho các dịch vụ api yên tĩnh.

Nó tốt cho những điều trên vì sự phụ thuộc và tích hợp với các mô-đun khác như bảo mật mùa xuân mùa xuân , lò xo , khung mvc , microservice

Với trong bất kỳ ứng dụng nào, bảo mật có lẽ là một yêu cầu.
Nếu bạn định xây dựng một sản phẩm cần bảo trì lâu dài, thì bạn sẽ cần sử dụng khái niệm Aop.

Nếu ứng dụng của bạn có lưu lượng truy cập nhiều do đó làm tăng tải, bạn cần sử dụng khái niệm microservice.

Spring đang cung cấp tất cả các tính năng này trong một nền tảng. Hỗ trợ với nhiều mô-đun .
Quan trọng nhất, mùa xuân là nguồn mở và một khung mở rộng, có một cái móc ở khắp mọi nơi để tích hợp mã tùy chỉnh trong vòng đời.

Spring Data là một dự án cung cấp tích hợp với dự án của bạn.


Vì vậy, mùa xuân có thể phù hợp với hầu hết mọi yêu cầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.