Những gì trên thế giới là đậu mùa xuân?


397

Tôi vẫn chưa tìm thấy một định nghĩa cấp cao về đậu mùa xuân mà tôi có thể hiểu. Tôi thấy chúng được tham chiếu thường xuyên trong tài liệu và sách của Grails, nhưng tôi nghĩ rằng việc hiểu những gì chúng sẽ có ích. Vậy đậu xuân là gì? Làm thế nào chúng có thể được sử dụng? Họ có liên quan gì đến Dependency Injection không?


2
Grails được xây dựng vào mùa xuân. Nếu bạn không quen thuộc với Spring, tôi khuyên bạn ít nhất nên đọc một số tài liệu về nó để bạn hiểu các công nghệ bạn đang sử dụng.
Jeff Storey

26
Tôi nghĩ rằng các ý kiến ​​ở đây gặp phải vấn đề tương tự mà OP thấy trong các tài liệu tham khảo trong tài liệu và sách của Grails: chúng chỉ dễ dàng cho những người đã biết ý nghĩa của chúng. Tôi thấy rằng bài viết của Wikipedia mô tả nó tốt hơn nhiều cho người mới bắt đầu.
Elias Dornele

12
@MarcoForberg một trong những lý do mà phiên bản cổ xưa của mùa xuân là top hit trên Google là bởi vì mọi người giữ liên kết đến nó từ những nơi như SO ... static.springsource.org/spring/docs/3.2.x/... sẽ là một tốt hơn nơi để bắt đầu những ngày này.
Ian Roberts

5
+1 @IanRoberts. Đây là một trong những hiện tại .
dmahapatro

Họ không giới thiệu IoC bằng cách nói rằng IoC còn được gọi là DI. Chúng có liên quan với nhau, nhưng IoC rộng hơn nhiều.
Aluan Haddad

Câu trả lời:


212

Các đối tượng tạo thành xương sống của ứng dụng của bạn và được quản lý bởi bộ chứa Spring IoC * được gọi là các bean. Bean là một đối tượng được khởi tạo, lắp ráp và được quản lý bởi bộ chứa Spring IoC. Các bean này được tạo bằng siêu dữ liệu cấu hình mà bạn cung cấp cho vùng chứa, ví dụ, ở dạng <bean/>định nghĩa XML .

Thêm để tìm hiểu về đậu và phạm vi từ SpringSource :

Khi bạn tạo một định nghĩa bean, những gì bạn thực sự tạo là một công thức để tạo các thể hiện thực của lớp được định nghĩa bởi định nghĩa bean đó. Ý tưởng rằng một định nghĩa bean là một công thức rất quan trọng, bởi vì nó có nghĩa là, giống như một lớp, bạn có thể có nhiều đối tượng được tạo từ một công thức duy nhất.

Bạn có thể kiểm soát không chỉ các phụ thuộc và giá trị cấu hình khác nhau được cắm vào một đối tượng được tạo từ một định nghĩa bean cụ thể, mà cả phạm vi của các đối tượng được tạo từ một định nghĩa bean cụ thể. Cách tiếp cận này rất mạnh mẽ và cho phép bạn linh hoạt chọn phạm vi của các đối tượng bạn tạo thông qua cấu hình thay vì phải 'nướng' phạm vi của một đối tượng ở cấp lớp Java. Đậu có thể được định nghĩa sẽ được triển khai ở một trong một số phạm vi

* IoC: Đảo ngược điều khiển


10
Vì vậy, đây là những đối tượng mà container quản lý và tôi không phải chạm vào, nhưng nếu tôi muốn truy cập vào một bean có thể gọi một số phương thức hoặc truy xuất các thuộc tính, thì tôi có thể "hỏi" Spring cho bean không?
Grantmcconnaughey

22
@grantmc Kiểu như vậy, ngoại trừ việc đảo ngược điều được cho là được hiểu là trái với "hỏi": thay vì "hỏi" mọi thứ, bạn "tuyên bố" rằng bạn sẽ cần nó. Và sau đó, khi bạn khởi động ứng dụng, khung sẽ kiểm tra tất cả các khai báo và đặt trường hợp thích hợp.
Elias Dornele

6
@elias Làm thế nào để tôi tuyên bố rằng tôi cần nó? Có phải khi tôi đang sử dụng @Autowired? Hay đơn giản là khi tôi làm imports?
Mikhail Batcer

16
Sẽ rất hữu ích khi xác định ý nghĩa của IoC đối với người mới tham gia Spring.
Lucas

4
@l đồng ý. IoC là "Đảo ngược điều khiển". Xem Hỏi & Đáp xuất sắc: Tiêm phụ thuộc và đảo ngược kiểm soát trong Spring Framework là gì? Đảo ngược kiểm soát là gì? .
mhradek

135

Spring bean chỉ là các đối tượng được quản lý bởi bộ chứa Spring, cụ thể là, chúng được tạo và nối dây bởi khung và đặt vào một "túi đối tượng" (thùng chứa) từ đó bạn có thể lấy chúng sau này.

Phần "nối dây" có nội dung phụ thuộc vào nội dung, ý nghĩa của nó là bạn có thể nói "Tôi sẽ cần thứ này" và khung sẽ tuân theo một số quy tắc để giúp bạn có được ví dụ phù hợp.

Đối với một người không quen với Spring, tôi nghĩ bài viết của Wikipedia Spring có một mô tả hay :

Trung tâm của Spring Framework là sự đảo ngược của thùng chứa điều khiển, nó cung cấp một phương tiện nhất quán để định cấu hình và quản lý các đối tượng Java bằng cách sử dụng sự phản chiếu. Container chịu trách nhiệm quản lý vòng đời đối tượng của các đối tượng cụ thể: tạo các đối tượng này, gọi các phương thức khởi tạo của chúng và cấu hình các đối tượng này bằng cách nối chúng lại với nhau.

Các đối tượng được tạo bởi container cũng được gọi là các đối tượng được quản lý hoặc các bean . Container có thể được cấu hình bằng cách tải các tệp XML hoặc phát hiện các chú thích Java cụ thể trên các lớp cấu hình. Những nguồn dữ liệu này chứa các định nghĩa về bean cung cấp thông tin cần thiết để tạo ra các bean.

Đối tượng có thể thu được bằng cách tra cứu phụ thuộc hoặc tiêm phụ thuộc . Tra cứu phụ thuộc là một mẫu trong đó người gọi hỏi đối tượng container cho một đối tượng có tên cụ thể hoặc của một loại cụ thể. Phép nội xạ phụ thuộc là một mẫu trong đó container chứa các đối tượng theo tên cho các đối tượng khác, thông qua các hàm tạo, thuộc tính hoặc phương thức xuất xưởng.


Một thể hiện chỉ là một từ khác cho các đối tượng. Khi bạn sử dụng "đối tượng" không phải bạn đang nói đối tượng?
Ngọn lửa của udun

Câu hỏi thú vị. Theo Wikipedia tôi nên nói "đối tượng cá thể" thay vào đó: en.wikipedia.org/wiki/Instance_(computer_science)
Elias Dornele

2
Lỗ thỏ đi sâu hơn.
Ngọn lửa của udun

Hôm nay tôi đã nhận ra rằng "các đối tượng đối tượng" (và do đó là các đối tượng đối tượng) thực sự có ý nghĩa đối với tôi bởi vì tôi đã quen với các ngôn ngữ trong đó một lớp cũng là một đối tượng (vì vậy bạn có các đối tượng lớp và, các đối tượng "đối tượng" ). Dù sao, tôi đã cập nhật mô tả để sử dụng "đối tượng cá thể" theo bài viết Wikipedia. ^^
Elias Dornele

1
@Ruizhi một đối tượng thông thường, tức là một thể hiện của một lớp - cuộc thảo luận này là một sự phụ thuộc về việc sử dụng biểu thức chính xác để chỉ một đối tượng. :)
Elias Dornele

50

Trước tiên hãy cho chúng tôi hiểu mùa xuân:

Mùa xuân là một khung nhẹ và linh hoạt.

Sự giống nhau:
nhập mô tả hình ảnh ở đây

Bean: là một đối tượng, được tạo, quản lý và hủy trong Spring Container. Chúng ta có thể đưa một đối tượng vào Spring Container thông qua siêu dữ liệu (xml hoặc chú thích), được gọi là đảo ngược điều khiển.

Tương tự: Chúng ta hãy giả sử nông dân đang có một trang trại canh tác bằng hạt giống (hoặc đậu). Ở đây, Nông dân là Khung mùa xuân, Đất nông nghiệp là Mùa xuân chứa, Đậu là Đậu mùa xuân, Trồng trọt là Chế biến mùa xuân.

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

Giống như vòng đời của đậu, đậu mùa xuân cũng có vòng đời của chính nó.

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

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

nguồn img

Sau đây là chuỗi vòng đời của đậu trong mùa xuân:

  • Khởi tạo: Đầu tiên bộ chứa lò xo tìm định nghĩa của bean từ tệp XML và khởi tạo bean.

  • Thuộc tính dân cư: Sử dụng phép tiêm phụ thuộc, lò xo cư trú tất cả các thuộc tính như được chỉ định trong định nghĩa bean.

  • Đặt tên Bean: Nếu BeanNameAwaregiao diện thực hiện bean , spring sẽ chuyển id của bean thành setBeanName()phương thức.

  • Đặt nhà máy Bean: Nếu Bean thực hiện BeanFactoryAwaregiao diện, lò xo chuyển setBeanFactory()phương thức beanfactory sang phương thức.

  • Tiền khởi tạo: Còn được gọi là quá trình bài của đậu. Nếu có bất kỳ BeanPostProcessors nào liên quan đến bean, postProcesserBeforeInitialization()phương thức gọi Spring .

  • Khởi tạo đậu: Nếu đậu thực hiện IntializingBean, afterPropertySet()phương thức của nó được gọi. Nếu bean có khai báo phương thức init, phương thức khởi tạo được chỉ định sẽ được gọi.

  • Sau khởi tạo: - Nếu có bất kỳ BeanPostProcessorsliên quan đến bean, postProcessAfterInitialization()phương thức của chúng sẽ được gọi.

  • Sẵn sàng để sử dụng: Bây giờ đậu đã sẵn sàng để sử dụng bởi ứng dụng

  • Phá hủy: Nếu bean thực hiện DisposableBean, nó sẽ gọi destroy()phương thức


23

Vâng, bạn hiểu nó một phần. Bạn phải điều chỉnh các hạt đậu theo nhu cầu của mình và thông báo cho Spring container để quản lý nó khi được yêu cầu, bằng cách sử dụng một phương pháp phổ biến được gọi là IoC ( Inversion of Control ) do Martin Fowler đặt ra , còn được gọi là Dependency Injection (DI).

Bạn nối dây cho đậu theo cách để bạn không phải quan tâm đến việc khởi tạo hoặc đánh giá bất kỳ sự phụ thuộc nào vào hạt đậu. Điều này phổ biến được gọi là Nguyên tắc Hollywood .

Google là công cụ tốt nhất để khám phá thêm về điều này ngoài các liên kết bạn sẽ bị ngập trong đây trong câu hỏi này. :)


2
Không thể chỉ ra rằng IoC là khái niệm và DI là (một trong) kỹ thuật có thể được sử dụng để đạt được IoC, chúng không phải là định nghĩa có thể thay thế.
kekko12

9

Mùa xuân có container IoC mang theo Bag Bean; duy trì sáng tạo và xóa là trách nhiệm của Spring Container. Chúng ta có thể đưa hạt đậu vào mùa xuân bằng cách nối dây và tự động nối dây. Đấu dây có nghĩa là chúng tôi tự cấu hình nó thành tệp XML và "Tự động nối dây" nghĩa là chúng tôi đặt các chú thích trong tệp Java sau đó Spring tự động quét bối cảnh gốc trong đó tệp cấu hình java, tạo tệp và đặt vào túi của Spring.

Dưới đây là chi tiết URI nơi bạn có thêm thông tin về Đậu


8

Đậu xuân là lớp học. Thay vì khởi tạo một lớp (bằng cách sử dụng new), bạn lấy một thể hiện dưới dạng beanchuyển sang loại lớp của bạn từ ngữ cảnh ứng dụng, trong đó bean là thứ bạn đã cấu hình trong cấu hình bối cảnh ứng dụng. Bằng cách này, toàn bộ ứng dụng duy trì thể hiện phạm vi đơn trong toàn bộ ứng dụng. Tất cả các bean được khởi tạo theo thứ tự cấu hình của chúng ngay sau khi bối cảnh ứng dụng được khởi tạo. Ngay cả khi bạn không nhận được bất kỳ hạt đậu nào trong ứng dụng của mình, tất cả các phiên bản đậu đã được tạo ngay sau khi bạn tạo bối cảnh ứng dụng.


1
Đậu không phải là các lớp, mà là các đối tượng như các thể hiện của các lớp, được quản lý bằng cách triển khai vùng chứa.
Chatatata

7
  • Đậu mùa xuân chỉ là các thể hiện đối tượng được quản lý bởi bộ chứa Spring IOC.

  • Spring IOC container mang theo Bean Bean. Việc tạo, duy trì và xóa bỏ Spring là trách nhiệm của Spring Container.

  • Chúng ta có thể đưa hạt đậu vào mùa xuân bằng cách nối dây và tự động nối dây.

  • Đấu dây có nghĩa là chúng tôi tự cấu hình nó vào tệp XML.

  • Tự động nối dây có nghĩa là chúng tôi đặt các chú thích trong tệp Java sau đó Spring tự động quét bối cảnh gốc trong đó tệp cấu hình java, tạo nó và đặt vào túi của Spring.


7

Bean là một POJO (Plain Old Java Object), được quản lý bởi container mùa xuân.

Các container mùa xuân chỉ tạo một thể hiện của bean. Bean này được lưu trong bộ nhớ nên tất cả các yêu cầu cho bean sẽ trả về một tham chiếu được chia sẻ cho cùng một bean.

Chú thích @Bean trả về một đối tượng mà mùa xuân đăng ký dưới dạng bean trong ngữ cảnh ứng dụng. Logic bên trong phương thức chịu trách nhiệm tạo cá thể.

Khi nào chúng ta sử dụng chú thích @Bean?

Khi cấu hình tự động không phải là một lựa chọn. Ví dụ: khi chúng tôi muốn nối các thành phần từ thư viện của bên thứ ba, vì mã nguồn không có sẵn nên chúng tôi không thể chú thích các lớp bằng @Component.

Một kịch bản thời gian thực có thể là ai đó muốn kết nối với nhóm Amazon S3. Vì nguồn không có sẵn, anh ta sẽ phải tạo một @bean.

@Bean
public AmazonS3 awsS3Client() {
    BasicAWSCredentials awsCreds = new BasicAWSCredentials(awsKeyId, accessKey);
    return AmazonS3ClientBuilder.standard().withRegion(Regions.fromName(region))
            .withCredentials(new AWSStaticCredentialsProvider(awsCreds)).build();
}

Nguồn cho mã ở trên -> https://www.devglan.com/spring-mvc/aws-s3-java

Bởi vì tôi đã đề cập đến Chú thích @Component ở trên.

@Component Chỉ ra rằng một lớp chú thích là một "thành phần". Các lớp như vậy được coi là ứng cử viên để phát hiện tự động khi sử dụng cấu hình dựa trên chú thích và quét đường dẫn lớp.

Chú thích thành phần đăng ký lớp dưới dạng một bean.


2

Trong Spring, những đối tượng tạo thành xương sống của ứng dụng của bạn và được quản lý bởi bộ chứa Spring IoC được gọi là các bean. Một bean chỉ đơn giản là một đối tượng được khởi tạo, lắp ráp và được quản lý bởi bộ chứa Spring IoC;


1

Đối với mùa xuân, tất cả các đối tượng là đậu! Bước cơ bản trong Spring Framework là xác định các đối tượng của bạn là các bean. Đậu không là gì ngoài các thể hiện đối tượng sẽ được tạo bởi khung công tác mùa xuân bằng cách xem xét các định nghĩa lớp của chúng. Các định nghĩa về cơ bản hình thành siêu dữ liệu cấu hình. Sau đó, khung công tác tạo ra một kế hoạch cho các đối tượng cần được khởi tạo, các phụ thuộc nào cần được đặt và chèn, phạm vi của thể hiện mới được tạo, v.v., dựa trên siêu dữ liệu cấu hình này.

Siêu dữ liệu có thể được cung cấp trong một tệp XML đơn giản, giống như trong chương đầu tiên. Ngoài ra, người ta có thể cung cấp siêu dữ liệu dưới dạng Chú thích hoặc Cấu hình Java.

Sách: Chỉ mùa xuân


1

Cấu hình XML của Spring bao gồm Đậu và Đậu về cơ bản là các lớp. Chúng chỉ là POJO mà chúng tôi sử dụng bên trong ApplicationContext. Xác định Đậu có thể được coi là thay thế từ khóa mới. Vì vậy, bất cứ nơi nào bạn đang sử dụng từ khóa mới trong ứng dụng của bạn, đại loại như:

MyRepository myRepository =new MyRepository ();

Trường hợp bạn đang sử dụng từ khóa mới đó ở đâu đó, bạn có thể xem xét loại bỏ cấu hình đó và đặt nó vào một tệp XML. Vì vậy, chúng tôi sẽ mã như thế này:

<bean name="myRepository " 
      class="com.demo.repository.MyRepository " />

Bây giờ chúng ta chỉ cần sử dụng Setter Injection / Constructor Injection. Tôi đang sử dụng Setter tiêm.

public class MyServiceImpl implements MyService {
    private MyRepository myRepository;
    public void setMyRepository(MyRepository myRepository)
        {
    this.myRepository = myRepository ;
        }
public List<Customer> findAll() {
        return myRepository.findAll();
    }
}
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.