Spring là một trong những Java EE framework được sử dụng rộng rãi nhất. Các khái niệm cốt lõi của Spring framework là "Dependency Injection" và "Aspect Oriented Programming".
Spring framework có thể được sử dụng trong các ứng dụng java thông thường cũng để đạt được sự kết hợp lỏng lẻo giữa các thành phần khác nhau bằng cách thực hiện Dependency Injection và chúng ta có thể thực hiện các tác vụ xuyên suốt như ghi nhật ký và xác thực bằng cách sử dụng hỗ trợ Spring cho lập trình hướng khía cạnh.
Tôi thích Spring vì nó cung cấp rất nhiều tính năng và các mô-đun khác nhau cho các tác vụ cụ thể như Spring MVC và Spring JDBC. Vì đây là một khung mã nguồn mở với nhiều tài nguyên trực tuyến và các thành viên tích cực trong cộng đồng, nên việc làm việc với Spring framework rất dễ dàng và thú vị.
Nên đọc: Spring Framework
2. Một số tính năng và lợi thế quan trọng của Spring Framework là gì?
Spring Framework được xây dựng dựa trên hai khái niệm thiết kế - Dependency Injection và Aspect Oriented Programming.
Một số tính năng của Spring Framework là:
👉 Nhẹ và rất ít chi phí sử dụng framework cho sự phát triển của chúng tôi.
👉 Dependency Injection hoặc Inversion of Control để ghi các thành phần độc lập với nhau, spring container sẽ đảm nhận việc kết nối chúng với nhau để đạt được công việc của chúng ta.
👉 Spring IoC container quản lý vòng đời của Spring Bean và các cấu hình cụ thể của dự án như tra cứu JNDI.
👉 Spring MVC framework có thể được sử dụng để tạo các ứng dụng web cũng như các dịch vụ web hoàn chỉnh có khả năng trả về XML cũng như phản hồi JSON.
👉 Hỗ trợ quản lý giao dịch, hoạt động JDBC, tải lên tệp, xử lý ngoại lệ, v.v. với rất ít cấu hình, bằng cách sử dụng chú thích hoặc tệp cấu hình spring bean.
Một số lợi ích của việc sử dụng Spring Framework là:
👉 Giảm phụ thuộc trực tiếp giữa các thành phần khác nhau của ứng dụng, thường Spring IoC container chịu trách nhiệm khởi tạo tài nguyên hoặc bean và đưa chúng vào làm phụ thuộc.
👉 Việc viết các trường hợp kiểm thử đơn vị rất dễ dàng trong Spring framework vì logic nghiệp vụ của chúng tôi không có phụ thuộc trực tiếp với các lớp triển khai tài nguyên thực tế. Chúng tôi có thể dễ dàng viết một cấu hình thử nghiệm và đưa các hạt giả của chúng tôi vào cho các mục đích thử nghiệm.
👉 Giảm số lượng mã boiler-plate, chẳng hạn như khởi tạo đối tượng, mở / đóng tài nguyên. Tôi thích lớp JdbcTemplate rất nhiều vì nó giúp chúng tôi loại bỏ tất cả mã boiler-plate đi kèm với lập trình JDBC.
👉 Spring framework được chia thành nhiều mô-đun, nó giúp chúng tôi giữ cho ứng dụng của mình nhẹ. Ví dụ: nếu chúng ta không cần các tính năng quản lý giao dịch Spring, chúng ta không cần thêm sự phụ thuộc đó vào dự án của mình.
👉 Spring framework hỗ trợ hầu hết các tính năng Java EE và thậm chí nhiều hơn nữa. Nó luôn dẫn đầu về các công nghệ mới, chẳng hạn như có một dự án Spring dành cho Android để giúp chúng tôi viết mã tốt hơn cho các ứng dụng Android gốc. Điều này làm cho Spring framework trở thành một gói hoàn chỉnh và chúng ta không cần phải xem xét các framework khác nhau cho các yêu cầu khác nhau.
3. Bạn hiểu gì về Dependency Injection?
Mẫu thiết kế Dependency Injection cho phép chúng tôi loại bỏ các phần phụ thuộc được mã hóa cứng và làm cho ứng dụng của chúng tôi được liên kết lỏng lẻo, có thể mở rộng và có thể bảo trì. Chúng ta có thể triển khai Dependency Injection để chuyển độ phân giải phụ thuộc từ compile-time sang runtime.
Một số lợi ích của việc sử dụng Dependency Injection là Separation of Concerns (chia các phần), Giảm mã Boilerplate, Configurable components (Cấu hình các thành phần) và dễ dàng kiểm tra đơn vị.
Đọc thêm tại Dependency Injection Tutorial. Chúng tôi cũng có thể sử dụng Google Guice for Dependency Injection để tự động hóa quá trình tiêm phụ thuộc. Nhưng trong hầu hết các trường hợp, chúng tôi đang tìm kiếm nhiều thứ hơn là chỉ tiêm phụ thuộc và đó là lý do tại sao Spring là lựa chọn hàng đầu cho việc này.
4. Làm cách nào để triển khai DI trong Spring Framework?
Chúng ta có thể sử dụng cấu hình dựa trên Spring XML cũng như dựa trên chú thích để triển khai DI trong spring applications. Để hiểu rõ hơn, vui lòng đọc ví dụ Spring Dependency Injection nơi bạn có thể tìm hiểu cả hai cách với trường hợp thử nghiệm JUnit. Bài đăng cũng chứa một tệp zip dự án mẫu mà bạn có thể tải xuống để tìm hiểu thêm.
5. Các tính năng mới trong Spring 5 là gì?
Spring 5 đã mang đến một bản cập nhật lớn cho Spring framework. Một số tính năng mới trong Spring 5 là:
👉 Spring 5 chạy trên Java 8+ và hỗ trợ Java EE 7. Vì vậy, chúng ta có thể sử dụng các biểu thức lambda và các tính năng của Servlet 4.0.
👉 Spring Framework 5.0 đi kèm với Commons Logging của riêng nó; spring-jcl thay vì Commons Logging tiêu chuẩn.
👉 Hỗ trợ cung cấp thông tin về các thành phần của Spring thông qua tệp chỉ mục “META-INF / spring.components” thay vì quét đường dẫn.
👉 Spring WebFlux mang đến lập trình phản ứng cho Spring Framework.
👉 Spring 5 hiện cũng hỗ trợ lập trình Kotlin. Đây là một bước tiến lớn trong việc hỗ trợ lập trình hàm, giống như Java cũng đang hướng tới lập trình hàm.
👉 Hỗ trợ JUnit 5 và thực thi thử nghiệm song song trong Spring TestContext Framework.
Bạn có thể đọc chi tiết hơn về các tính năng này tại Spring 5 Features .
6. Spring WebFlux là gì?
Spring WebFlux là mô-đun mới được giới thiệu trong Spring 5. Spring WebFlux là bước đầu tiên hướng tới mô hình lập trình phản ứng trong Spring framework.
Spring WebFlux là giải pháp thay thế cho mô-đun Spring MVC. Spring WebFlux được sử dụng để tạo một ứng dụng hoàn toàn không đồng bộ và không chặn được xây dựng trên mô hình thực thi vòng lặp sự kiện.
Bạn có thể đọc thêm về nó tại Hướng dẫn Spring WebFlux.
7. Lợi ích của việc sử dụng Spring Tool Suite là gì?
Chúng ta có thể cài đặt các plugin vào Eclipse để có được tất cả các tính năng của Spring Tool Suite. Tuy nhiên, STS đi kèm với Eclipse với một số loại công cụ quan trọng khác như hỗ trợ Maven, Template để tạo các loại dự án Spring khác nhau và máy chủ tc để có hiệu suất tốt hơn với Spring applications.
Tôi thích STS vì nó làm nổi bật các thành phần Spring và nếu bạn đang sử dụng các phím và lời khuyên AOP, thì nó sẽ hiển thị rõ ràng các phương pháp nào sẽ nằm trong phần pointcut cụ thể. Vì vậy, thay vì tự mình cài đặt mọi thứ, tôi thích sử dụng STS khi phát triển Spring-based applications.
8. Kể tên một số Modul quan trọng của Spring?
Một số mô-đun Spring Framework quan trọng là:
👉 Spring Context - để tiêm phụ thuộc.
👉 Spring AOP - dành cho lập trình hướng khía cạnh.
👉 Spring DAO - cho các hoạt động cơ sở dữ liệu sử dụng mẫu DAO
👉 Spring JDBC - hỗ trợ JDBC và DataSource.
👉 Spring ORM - hỗ trợ các công cụ ORM như Hibernate
👉 Spring Web Module - để tạo các ứng dụng web.
👉 Spring MVC - Triển khai Model-View-Controller để tạo các ứng dụng web, dịch vụ web, v.v.
9. Bạn hiểu gì về Aspect Oriented Programming(Lập trình hướng theo khía cạnh)?
Các ứng dụng doanh nghiệp có một số mối quan tâm xuyên suốt phổ biến có thể áp dụng cho các loại Đối tượng và mô-đun ứng dụng khác nhau, chẳng hạn như ghi nhật ký, quản lý giao dịch, xác thực dữ liệu, xác thực, v.v. Trong Object Oriented Programming, tính mô đun của ứng dụng được thực hiện bởi Class trong khi trong ứng dụng AOP tính mô đun đạt được bởi Aspects và chúng được cấu hình để cắt qua các phương thức lớp khác nhau.
AOP loại bỏ sự phụ thuộc trực tiếp của các tác vụ xuyên suốt từ các lớp không thể thực hiện được trong lập trình hướng đối tượng thông thường. Ví dụ, chúng ta có thể có một lớp riêng để ghi dữ liệu nhưng một lần nữa các lớp sẽ phải gọi các phương thức này để ghi dữ liệu. Đọc thêm về hỗ trợ Spring AOP tại Spring AOP Example.
10. Aspect, Advice, Pointcut, JointPoint và Advice Arguments trong AOP là gì?
Aspect: Aspect là một lớp thực hiện các mối quan tâm xuyên suốt, chẳng hạn như quản lý giao dịch. Aspects có thể là một lớp bình thường được cấu hình và sau đó được cấu hình trong tệp cấu hình Spring Bean hoặc chúng ta có thể sử dụng hỗ trợ Spring AspectJ để khai báo một lớp là Aspect bằng cách sử dụng @Aspect chú thích.
Advice: Advice là hành động được thực hiện cho một điểm tham gia cụ thể. Về mặt lập trình, chúng là các phương thức được thực thi khi đạt đến một điểm nối cụ thể với điểm cắt phù hợp trong ứng dụng. Bạn có thể coi Advices là Spring interceptors hoặc Servlet Filters .
Pointcut: Pointcut là các biểu thức chính quy được so khớp với các điểm nối để xác định xem Advice có cần được thực thi hay không. Pointcut sử dụng các loại biểu thức khác nhau được khớp với các điểm nối. Spring framework sử dụng ngôn ngữ biểu thức điểm AspectJ để xác định các điểm nối nơi các phương pháp tư vấn sẽ được áp dụng.
JointPoint: JointPoint là một điểm cụ thể trong ứng dụng như thực thi phương thức, xử lý ngoại lệ, thay đổi giá trị biến đối tượng, v.v. Trong Spring AOP, điểm kết nối luôn là nơi thực thi một phương thức.
Advice Arguments: Chúng ta có thể chuyển các lập luận trong các phương pháp tư vấn. Chúng ta có thể sử dụng biểu thức args() trong pointcut để áp dụng cho bất kỳ phương thức nào phù hợp với mẫu đối số. Nếu chúng ta sử dụng điều này, thì chúng ta cần sử dụng cùng một tên trong phương thức tư vấn mà từ đó loại đối số được xác định.
Những khái niệm này thoạt nghe có vẻ khó hiểu, nhưng nếu bạn xem qua Spring Aspect, Consult Example thì bạn có thể dễ dàng liên tưởng đến chúng.
Aspect: Aspect là một lớp thực hiện các mối quan tâm xuyên suốt, chẳng hạn như quản lý giao dịch. Aspects có thể là một lớp bình thường được cấu hình và sau đó được cấu hình trong tệp cấu hình Spring Bean hoặc chúng ta có thể sử dụng hỗ trợ Spring AspectJ để khai báo một lớp là Aspect bằng cách sử dụng @Aspect chú thích.
Advice: Advice là hành động được thực hiện cho một điểm tham gia cụ thể. Về mặt lập trình, chúng là các phương thức được thực thi khi đạt đến một điểm nối cụ thể với điểm cắt phù hợp trong ứng dụng. Bạn có thể coi Advices là Spring interceptors hoặc Servlet Filters .
Pointcut: Pointcut là các biểu thức chính quy được so khớp với các điểm nối để xác định xem Advice có cần được thực thi hay không. Pointcut sử dụng các loại biểu thức khác nhau được khớp với các điểm nối. Spring framework sử dụng ngôn ngữ biểu thức điểm AspectJ để xác định các điểm nối nơi các phương pháp tư vấn sẽ được áp dụng.
JointPoint: JointPoint là một điểm cụ thể trong ứng dụng như thực thi phương thức, xử lý ngoại lệ, thay đổi giá trị biến đối tượng, v.v. Trong Spring AOP, điểm kết nối luôn là nơi thực thi một phương thức.
Advice Arguments: Chúng ta có thể chuyển các lập luận trong các phương pháp tư vấn. Chúng ta có thể sử dụng biểu thức args() trong pointcut để áp dụng cho bất kỳ phương thức nào phù hợp với mẫu đối số. Nếu chúng ta sử dụng điều này, thì chúng ta cần sử dụng cùng một tên trong phương thức tư vấn mà từ đó loại đối số được xác định.
Những khái niệm này thoạt nghe có vẻ khó hiểu, nhưng nếu bạn xem qua Spring Aspect, Consult Example thì bạn có thể dễ dàng liên tưởng đến chúng.
11. Sự khác biệt giữa Spring AOP và AspectJ AOP là gì?
AspectJ là triển khai tiêu chuẩn ngành cho Lập trình hướng theo khía cạnh(AOP) trong khi Spring triển khai AOP cho một số trường hợp. Sự khác biệt chính giữa Spring AOP và AspectJ là:
👉 Spring AOP sử dụng đơn giản hơn AspectJ vì chúng ta không cần lo lắng về quá trình kết nối lại (weaving).
👉 Spring AOP hỗ trợ các chú thích AspectJ, vì vậy nếu bạn đã quen với AspectJ thì việc làm việc với Spring AOP sẽ dễ dàng hơn.
👉 Spring AOP chỉ hỗ trợ AOP dựa trên proxy, vì vậy nó chỉ có thể được áp dụng cho các điểm nối thực thi phương thức. AspectJ hỗ trợ tất cả các loại phím tắt.
👉 Một trong những thiếu sót của Spring AOP là nó chỉ có thể được áp dụng cho các bean được tạo thông qua Spring Context.
12. Spring IoC Container là gì?
Inversion of Control (IoC) là cơ chế để đạt được sự kết hợp lỏng lẻo giữa các đối tượng phụ thuộc. Để đạt được khớp nối lỏng lẻo và liên kết động của các đối tượng trong runtime, các đối tượng xác định các phụ thuộc của chúng đang được chèn bởi các đối tượng trình hợp dịch khác. Spring IoC container là chương trình đưa các phụ thuộc vào một đối tượng và làm cho nó sẵn sàng để chúng ta sử dụng.
Các vùng chứa của Spring Framework IoC là một phần của org.springframework.beans và org.springframework.context đóng gói và quy định cho chúng ta những cách khác nhau để tách các phụ thuộc đối tượng.
Một số triển khai ApplicationContext hữu ích mà chúng tôi sử dụng là:
👉 AnnotationConfigApplicationContext: Dành cho các ứng dụng java độc lập sử dụng cấu hình dựa trên chú thích.
👉 ClassPathXmlApplicationContext: Dành cho các ứng dụng java độc lập sử dụng cấu hình dựa trên XML.
👉 FileSystemXmlApplicationContext: Tương tự như ClassPathXmlApplicationContext ngoại trừ việc tệp cấu hình xml có thể được tải từ bất kỳ đâu trong hệ thống tệp.
👉 AnnotationConfigWebApplicationContext và XmlWebApplicationContext cho các ứng dụng web.
13. Spring Bean là gì?
Bất kỳ lớp java bình thường nào được khởi tạo bởi Spring IoC container được gọi là Spring Bean. Chúng tôi sử dụng Spring ApplicationContext để lấy cá thể Spring Bean.
Spring IoC container quản lý vòng đời của Spring Bean, phạm vi bean và đưa vào bất kỳ phụ thuộc bắt buộc nào trong bean.
14. Tầm quan trọng của tệp Spring bean configuration là gì?
Chúng tôi sử dụng tệp Spring Bean configuration để xác định tất cả các bean sẽ được khởi tạo bởi Spring Context. Khi chúng ta tạo phiên bản Spring ApplicationContext, nó sẽ đọc tệp XML của Spring bean và khởi tạo tất cả chúng. Khi ngữ cảnh được khởi tạo, chúng ta có thể sử dụng nó để lấy các thể hiện bean khác nhau.
Ngoài cấu hình Spring Bean, tệp này còn chứa Spring MVC interceptors, trình phân giải chế độ xem và các phần tử khác để hỗ trợ cấu hình dựa trên chú thích.
15. Các cách khác nhau để cấu hình một lớp dưới dạng Spring Bean là gì?
Có ba cách khác nhau để cấu hình Spring Bean.
👉 XML Configuration: Đây là cấu hình phổ biến nhất và chúng ta có thể sử dụng phần tử bean trong tệp ngữ cảnh để định cấu hình Spring Bean. Ví dụ:
<bean name="myBean" class="com.hn.spring.beans.MyBean"></bean>
👉 Java Based Configuration: Nếu bạn chỉ sử dụng chú thích, bạn có thể định cấu hình một Spring bean bằng cách sử dụng chú thích @Bean. Chú thích này được sử dụng với @Configuration các lớp để cấu hình một Spring bean. Cấu hình mẫu là:
@Configuration @ComponentScan(value="com.hn.spring.main") public class MyConfiguration {
@Bean public MyService getService(){ return new MyService(); } }
Để lấy bean này từ spring context, chúng ta cần sử dụng đoạn mã sau:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext( MyConfiguration.class); MyService service = ctx.getBean(MyService.class);
👉 Annotation Based Configuration: Chúng ta cũng có thể sử dụng các chú thích @Component, @Service, @Repository và @Controller với các lớp để định cấu hình chúng giống như spring bean. Đối với những điều này, chúng tôi sẽ cần cung cấp vị trí gói cơ sở để quét các lớp này. Ví dụ:
<context:component-scan
base-package="com.journaldev.spring"/>
16. Scopes(Các phạm vi) khác nhau của Spring Bean là gì?
Có năm phạm vi được xác định cho Spring Beans.
👉 singleton: Chỉ một thể hiện của bean sẽ được tạo cho mỗi vùng chứa. Đây là phạm vi mặc định cho Spring bean. Trong khi sử dụng phạm vi này, hãy đảm bảo rằng spring bean không có các biến phiên bản được chia sẻ, nếu không, nó có thể dẫn đến các vấn đề không nhất quán dữ liệu vì nó không an toàn cho chuỗi.
👉 prototype(Nguyên mẫu): Một thể hiện mới sẽ được tạo mỗi khi bean được yêu cầu.
👉 request: Phạm vi này giống như phạm vi prototype, tuy nhiên, nó có nghĩa là được sử dụng cho các ứng dụng web. Một phiên bản mới của bean sẽ được tạo cho mỗi HTTP request.
👉 session: Một bean mới sẽ được tạo cho mỗi phiên HTTP bởi vùng chứa.
👉 global-session: Điều này được sử dụng để tạo các bean phiên toàn cầu cho các ứng dụng Portlet.
Spring Framework có thể mở rộng và chúng tôi cũng có thể tạo phạm vi của riêng mình, tuy nhiên hầu hết các trường hợp chúng tôi đều sử dụng tốt các phạm vi được cung cấp bởi framework.
Để thiết lập phạm vi Spring bean, chúng ta có thể sử dụng thuộc tính "scope" trong phần tử bean hoặc chú thích @Scope cho các cấu hình dựa trên chú thích.
17. Vòng đời của Spring Bean là gì?
Spring Beans được khởi tạo bởi Spring Container và tất cả các phụ thuộc cũng được đưa vào. Khi contex bị phá hủy, nó cũng phá hủy tất cả các bean đã khởi tạo. Điều này hoạt động tốt trong hầu hết các trường hợp nhưng đôi khi chúng tôi muốn khởi tạo các tài nguyên khác hoặc thực hiện một số xác nhận trước khi làm cho các bean của chúng tôi sẵn sàng sử dụng. Spring framework cung cấp hỗ trợ cho các phương thức sau khởi tạo và hủy trước trong Spring bean.
Chúng ta có thể làm điều này bằng hai cách - bằng cách triển khai interface InitializingBean và DisposableBean hoặc sử dụng thuộc tính init-method và Dest-method trong các cấu hình spring bean. Để biết thêm chi tiết, vui lòng đọc Phương pháp vòng đời của Spring Bean.
18. Làm cách nào để lấy đối tượng ServletContext và ServletConfig trong Spring Bean?
Có hai cách để lấy các đối tượng cụ thể của Container trong Spring bean.
👉 Triển khai Spring * Aware interfaces, đối với các interface ServletContextAware và ServletConfigAware này, để có ví dụ đầy đủ về các interface này, vui lòng đọc Spring Aware Interfaces
👉 Sử dụng chú thích @Autowired với biến bean kiểu ServletContext và ServletConfig. Mặc dù vậy, chúng sẽ chỉ hoạt động trong môi trường cụ thể của servlet container.
Có hai cách để lấy các đối tượng cụ thể của Container trong Spring bean.
👉 Triển khai Spring * Aware interfaces, đối với các interface ServletContextAware và ServletConfigAware này, để có ví dụ đầy đủ về các interface này, vui lòng đọc Spring Aware Interfaces
👉 Sử dụng chú thích @Autowired với biến bean kiểu ServletContext và ServletConfig. Mặc dù vậy, chúng sẽ chỉ hoạt động trong môi trường cụ thể của servlet container.
@Autowired ServletContext servletContext;
Quá trình tiêm các phụ thuộc vào spring bean trong khi khởi tạo nó được gọi là Spring Bean Wiring.
Thông thường, cách tốt nhất là thực hiện explicit wiring của tất cả các spring bean, nhưng spring framework cũng hỗ trợ auto-writing. Chúng ta có thể sử dụng chú thích @Autowired với các trường hoặc phương thức autowiring byType. Để chú thích này hoạt động, chúng ta cũng cần bật cấu hình dựa trên chú thích trong tệp cấu hình spring bean. Điều này có thể được thực hiện bởi phần tử context: annotation-config.
Để biết thêm chi tiết về chú thích @Autowired, vui lòng đọc Ví dụ về Spring Autowire.
20. Các loại Spring Bean Wiring khác nhau là gì?
Có bốn loại autowiring trong Spring framework.
👉 autowire byName
👉 autowire byType
👉 autowire by constructor
👉 autowiring bởi chú thích @Autowired và @Qualifier
Trước Spring 3.1, autowire by autodetect cũng được hỗ trợ tương tự như autowire by constructor hoặc byType. Để biết thêm chi tiết về các tùy chọn này, vui lòng đọc Spring Bean Autowiring.
21. Spring Bean có cung cấp sự an toàn không?
Phạm vi mặc định của Spring bean là singleton, vì vậy sẽ chỉ có một thể hiện cho mỗi ngữ cảnh. Điều đó có nghĩa là tất cả những gì có một biến mức lớp mà bất kỳ luồng nào cũng có thể cập nhật sẽ dẫn đến dữ liệu không nhất quán. Do đó ở chế độ deault, spring beans không an toàn.
Tuy nhiên, chúng ta có thể thay đổi phạm vi của Spring bean thành request, prototype hoặc session để đạt được sự an toàn của luồng với chi phí hiệu suất. Đó là một quyết định thiết kế và dựa trên các yêu cầu của dự án.
22. Controller trong Spring MVC là gì?
Cũng giống như mẫu thiết kế MVC, Controller là lớp xử lý tất cả các yêu cầu của client và gửi chúng đến các tài nguyên đã được cấu hình để xử lý nó. Trong Spring MVC, org.springframework.web.servlet.DispatcherServlet là lớp điều khiển phía trước khởi tạo ngữ cảnh dựa trên các cấu hình của Spring bean.
Một lớp Controller chịu trách nhiệm xử lý một loại yêu cầu khác của khách hàng dựa trên các ánh xạ yêu cầu. Chúng ta có thể tạo một lớp bộ điều khiển bằng cách sử dụng chú thích @Controller. Thông thường, nó được sử dụng với chú thích @RequestMapping để xác định các phương thức xử lý cho ánh xạ URI cụ thể.
23. Sự khác biệt giữa chú thích @Component, @Controller, @Repository & @Service trong Spring là gì?
👉 @Component được sử dụng để chỉ ra rằng một lớp là một component (thành phần). Các lớp này được sử dụng để tự động phát hiện và được cấu hình như bean khi cấu hình dựa trên chú thích được sử dụng.
👉 @Controller là một loại component cụ thể, được sử dụng trong các ứng dụng MVC và chủ yếu được sử dụng với chú thích RequestMapping.
👉 Chú thích @Repository được sử dụng để chỉ ra rằng một component được sử dụng làm kho lưu trữ và cơ chế lưu trữ / truy xuất / tìm kiếm dữ liệu. Chúng ta có thể áp dụng chú thích này với các lớp triển khai mẫu DAO.
👉 @Service được sử dụng để chỉ ra rằng một lớp là một Service. Thông thường, các lớp mặt tiền doanh nghiệp cung cấp một số dịch vụ được chú thích bằng điều này.
Chúng tôi có thể sử dụng bất kỳ chú thích nào ở trên cho một lớp để tự động phát hiện nhưng các loại khác nhau được cung cấp để bạn có thể dễ dàng phân biệt mục đích của các lớp được chú thích.
24. DispatcherServlet và ContextLoaderListener là gì?
👉 DispatcherServlet là bộ điều khiển phía trước trong ứng dụng Spring MVC và nó tải tệp spring bean configuration và khởi tạo tất cả các bean đã được cấu hình. Nếu chú thích được kích hoạt, nó cũng quét các gói và cấu hình bất kỳ chú thích với Bean @Component, @Controller, @Repository hoặc chú thích @Service .
👉 ContextLoaderListener là trình lắng nghe để khởi động và tắt root của Spring WebApplicationContext. Các chức năng quan trọng của nó là gắn vòng đời của ApplicationContext với vòng đời của ServletContext và để tự động hóa việc tạo ra ApplicationContext. Chúng ta có thể sử dụng nó để xác định các bean được chia sẻ có thể được sử dụng trong các bối cảnh mùa xuân khác nhau.
25. ViewResolver trong Spring là gì?
ViewResolver triển khai được sử dụng để giải quyết các trang xem theo tên. Thông thường, chúng tôi cấu hình nó trong tệp spring bean configuration. Ví dụ:
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <beans:property name="prefix" value="/WEB-INF/views/" /> <beans:property name="suffix" value=".jsp" /> </beans:bean>
InternalResourceViewResolver là một trong những cách triển khai interface ViewResolver và chúng tôi đang cung cấp thư mục các trang xem và vị trí hậu tố thông qua các thuộc tính bean. Vì vậy, nếu phương thức trình xử lý bộ điều khiển trả về "home", trình giải quyết chế độ xem sẽ sử dụng trang xem nằm tại /WEB-INF/views/home.jsp .
26. MultipartResolver là gì và nó được sử dụng khi nào?
Interface MultipartResolver được sử dụng để tải tệp lên – CommonsMultipartResolver và StandardServletMultipartResolver là hai cách triển khai được cung cấp bởi Spring framework để tải tệp lên. Theo mặc định, không có trình phân giải nhiều phần được định cấu hình nhưng để sử dụng chúng để tải tệp lên, tất cả những gì chúng ta cần xác định một bean có tên là “multiartResolver” với kiểu là MultipartResolver trong cấu hình Spring bean.
Sau khi được định cấu hình, mọi yêu cầu đa phần sẽ được giải quyết bởi MultipartResolver đã định cấu hình và chuyển một HttpServletRequest được bao bọc. Sau đó, nó được sử dụng trong lớp controller để lấy tệp và xử lý nó. Để có ví dụ hoàn chỉnh, vui lòng đọc Ví dụ tải lên tệp Spring MVC.
27. Làm thế nào để xử lý các ngoại lệ trong Spring MVC Framework?
Spring MVC Framework cung cấp các cách sau để giúp chúng tôi đạt được khả năng xử lý ngoại lệ mạnh mẽ.
👉 Controller Based - Chúng ta có thể xác định các phương thức xử lý ngoại lệ trong các lớp bộ điều khiển của chúng ta. Tất cả những gì chúng ta cần là chú thích các phương thức này bằng chú thích @ExceptionHandler.
👉 Global Exception Handler - Xử lý ngoại lệ là một mối quan tâm xuyên suốt và Spring cung cấp chú thích @ControllerAdvice mà chúng ta có thể sử dụng với bất kỳ lớp nào để xác định trình xử lý ngoại lệ toàn cầu của chúng ta.
👉 HandlerExceptionResolver implementation - Đối với các ngoại lệ chung, hầu hết thời gian chúng tôi phân phát các trang static. Spring Framework cung cấp interface HandlerExceptionResolver mà chúng ta có thể triển khai để tạo trình xử lý ngoại lệ toàn cầu. Lý do đằng sau cách bổ sung này để xác định trình xử lý ngoại lệ toàn cục là Spring framework cũng cung cấp các lớp triển khai mặc định mà chúng ta có thể xác định trong tệp cấu hình spring bean của mình để nhận được các lợi ích xử lý ngoại lệ của Spring framework.
Để có ví dụ đầy đủ, vui lòng đọc Ví dụ về xử lý ngoại lệ trong mùa xuân .
28. Làm thế nào để tạo ApplicationContext trong một chương trình Java?
Có những cách sau để tạo spring context trong một chương trình java độc lập.
👉 AnnotationConfigApplicationContext: Nếu chúng ta đang sử dụng Spring trong các ứng dụng java độc lập và sử dụng chú thích cho Configuration, thì chúng ta có thể sử dụng nó để khởi tạo vùng chứa và lấy các đối tượng bean.
👉 ClassPathXmlApplicationContext: Nếu chúng ta có tệp xml cấu hình spring bean trong ứng dụng độc lập, thì chúng ta có thể sử dụng lớp này để tải tệp và lấy đối tượng vùng chứa.
👉 FileSystemXmlApplicationContext: Điều này tương tự như ClassPathXmlApplicationContext ngoại trừ việc tệp cấu hình xml có thể được tải từ bất kỳ đâu trong hệ thống tệp.
29. Chúng ta có thể có nhiều tệp Spring configuration không?
Đối với các ứng dụng Spring MVC, chúng ta có thể xác định nhiều Spring configuration thông qua contextConfigLocation. Chuỗi vị trí này có thể bao gồm nhiều vị trí được phân tách bằng bất kỳ số lượng dấu phẩy và dấu cách nào. Ví dụ:
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml,
/WEB-INF/spring/appServlet/servlet-jdbc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Chúng tôi cũng có thể xác định nhiều Spring configuration cấp căn bản và tải nó thông qua context-param. Ví dụ:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml
/WEB-INF/spring/root-security.xml</param-value>
</context-param>
Một tùy chọn khác là sử dụng phần tử nhập trong tệp cấu hình ngữ cảnh để nhập các cấu hình khác, ví dụ:
<beans:import resource="spring-jdbc.xml"/>
30. ContextLoaderListener là gì?
ContextLoaderListener là lớp lắng nghe được sử dụng để tải ngữ cảnh gốc và xác định các cấu hình spring bean sẽ hiển thị cho tất cả các ngữ cảnh khác. Nó được định cấu hình trong tệp web.xml như sau:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
31. Các cấu hình tối thiểu cần thiết để tạo ứng dụng Spring MVC là gì?
Để tạo một ứng dụng Spring MVC đơn giản, chúng ta cần thực hiện các tác vụ sau.
👉 Thêm spring-context và các spring-webmvc phụ thuộc trong dự án.
👉 Configure DispatcherServlet trong tệp web.xml để xử lý các yêu cầu thông qua spring container.
👉 Tập tin Spring bean Configure để xác định bean, nếu sử dụng chú thích thì nó phải được cấu hình ở đây. Ngoài ra, chúng ta cần cấu hình trình phân giải chế độ xem cho các trang xem.
👉 Lớp controller với các ánh xạ yêu cầu được xác định để xử lý các yêu cầu của máy khách.
Các bước trên là đủ để tạo một ứng dụng Spring MVC Hello World đơn giản.
Để tạo một ứng dụng Spring MVC đơn giản, chúng ta cần thực hiện các tác vụ sau.
👉 Thêm spring-context và các spring-webmvc phụ thuộc trong dự án.
👉 Configure DispatcherServlet trong tệp web.xml để xử lý các yêu cầu thông qua spring container.
👉 Tập tin Spring bean Configure để xác định bean, nếu sử dụng chú thích thì nó phải được cấu hình ở đây. Ngoài ra, chúng ta cần cấu hình trình phân giải chế độ xem cho các trang xem.
👉 Lớp controller với các ánh xạ yêu cầu được xác định để xử lý các yêu cầu của máy khách.
Các bước trên là đủ để tạo một ứng dụng Spring MVC Hello World đơn giản.
32. Bạn sẽ liên kết Spring MVC Framework với kiến trúc MVC như thế nào?
Như tên cho thấy Spring MVC được xây dựng dựa trên kiến trúc Model-View-Controller. DispatcherServlet là Front Controller trong ứng dụng Spring MVC sẽ xử lý tất cả các yêu cầu đến và ủy quyền nó cho các phương thức xử lý bộ điều khiển khác nhau.
Model có thể là bất kỳ Java Bean nào trong Spring Framework, giống như bất kỳ framework MVC nào khác, Spring cung cấp liên kết tự động dữ liệu biểu mẫu với các bean java. Chúng ta có thể đặt các bean mô hình làm thuộc tính được sử dụng trong các trang xem.
Các trang views có thể là JSP, HTML tĩnh, v.v. và các trình phân giải chế độ xem có trách nhiệm tìm kiếm trang view chính xác. Khi trang view được xác định, quyền kiểm soát được trao lại cho bộ điều khiển DispatcherServlet. DispatcherServlet chịu trách nhiệm hiển thị chế độ xem và trả lại phản hồi cuối cùng cho máy khách.
33. Làm thế nào để thực hiện xác định vị trí trong Spring MVC applications?
Spring cung cấp hỗ trợ tuyệt vời cho bản địa hóa hoặc i18n thông qua resource bundles. Các bước cơ bản cần thiết để bản địa hóa ứng dụng của chúng tôi là:
👉 Tạo các message resource bundles cho các ngôn ngữ khác nhau, chẳng hạn như messages_en.properties, messages_fr.properties, v.v.
👉 Định nghĩa messageSource bean trong tệp cấu hình spring bean kiểu ResourceBundleMessageSource hoặc ReloadableResourceBundleMessageSource.
👉 Để hỗ trợ thay đổi ngôn ngữ, hãy xác định bean localeResolver thuộc loại CookieLocaleResolver và định cấu hình bộ đánh chặn LocaleChangeInterceptor. Cấu hình ví dụ có thể như sau:
<beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <beans:property name="basename" value="classpath:messages" /> <beans:property name="defaultEncoding" value="UTF-8" /> </beans:bean>
<beans:bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> <beans:property name="defaultLocale" value="en" /> <beans:property name="cookieName" value="myAppLocaleCookie"></beans:property> <beans:property name="cookieMaxAge" value="3600"></beans:property> </beans:bean>
<interceptors> <beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> <beans:property name="paramName" value="locale" /> </beans:bean> </interceptors>
👉 Sử dụng spring:message phần tử trong các trang view có tên khóa, DispatcherServlet chọn giá trị tương ứng và hiển thị trang theo ngôn ngữ tương ứng và trả về dưới dạng phản hồi.
Để có ví dụ đầy đủ, vui lòng đọc Ví dụ về bản địa hóa mùa xuân.
34. Làm cách nào chúng ta có thể sử dụng Spring để tạo Restful Web Service trả về phản hồi JSON?
Chúng ta có thể sử dụng Spring Framework để tạo các dịch vụ web Restful trả về dữ liệu JSON. Spring cung cấp tích hợp với API Jackson JSON mà chúng tôi có thể sử dụng để gửi phản hồi JSON trong static webservice.
Chúng tôi cần thực hiện các bước sau để định cấu hình ứng dụng Spring MVC của mình để gửi phản hồi JSON:
👉 Việc thêm các phụ thuộc Jackson JSON, nếu bạn đang sử dụng Maven thì có thể thực hiện bằng mã sau:
<!-- Jackson -->
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.databind-version}</version> </dependency>
👉 Định cấu hình bean RequestMappingHandlerAdapter trong tệp cấu hình spring bean và đặt thuộc tính messageConverters thành bean MappingJackson2HttpMessageConverter. Cấu hình mẫu sẽ là:
👉 Trong các phương thức của trình xử lý controller, hãy trả về Object dưới dạng phản hồi bằng cách sử dụng chú thích @ResponseBody. Mã mẫu:<!-- Configure to plugin JSON as request and response in method handler -->
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><beans:property name="messageConverters"> <beans:list> <beans:ref bean="jsonMessageConverter"/> </beans:list> </beans:property> </beans:bean>
<!-- Configure bean to convert JSON to POJO and vice versa --> <beans:bean id="jsonMessageConverter" \ class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> </beans:bean>
@RequestMapping(value = EmpRestURIConstants.GET_EMP,
method = RequestMethod.GET) public @ResponseBody Employee getEmployee(@PathVariable("id") int empId) { logger.info("Start getEmployee. ID="+empId); return empData.get(empId); }
👉 Bạn có thể gọi service còn lại thông qua bất kỳ API nào, nhưng nếu bạn muốn sử dụng Spring thì chúng ta có thể dễ dàng thực hiện bằng cách sử dụng lớp RestTemplate.
Để có ví dụ đầy đủ, vui lòng đọc Ví dụ về Spring restful web service.
35. Một số chú thích quan trọng của Spring mà bạn đã sử dụng là gì?
Một số chú thích Spring mà tôi đã sử dụng trong dự án của mình là:
👉 @Controller - dành cho các lớp bộ điều khiển trong dự án Spring MVC.
👉 @RequestMapping - để định cấu hình ánh xạ URI trong các phương thức xử lý bộ điều khiển. Đây là một chú thích rất quan trọng, vì vậy bạn nên xem qua các ví dụ về Spring MVC RequestMapping Annotation
👉 @ResponseBody - để gửi Đối tượng dưới dạng phản hồi, thường để gửi dữ liệu XML hoặc JSON dưới dạng phản hồi.
👉 @PathVariable - để ánh xạ các giá trị động từ URI tới các đối số của phương thức trình xử lý.
👉 @Autowired - cho autowiring phụ thuộc vào Spring bean.
👉 @Qualifier - với chú thích @Autowired muốn để tránh nhầm lẫn khi có nhiều trường hợp của loại bean.
👉 @Service - dành cho các lớp dịch vụ.
👉 @Scope - để định cấu hình phạm vi của Spring bean.
👉 @Configuration, @ComponentScan và @Bean - dành cho các cấu hình dựa trên java.
👉 Chú thích AspectJ để định cấu hình aspects và advices, @Aspect , @Before , @After , @Around , @Pointcut , v.v.
Một số chú thích Spring mà tôi đã sử dụng trong dự án của mình là:
👉 @Controller - dành cho các lớp bộ điều khiển trong dự án Spring MVC.
👉 @RequestMapping - để định cấu hình ánh xạ URI trong các phương thức xử lý bộ điều khiển. Đây là một chú thích rất quan trọng, vì vậy bạn nên xem qua các ví dụ về Spring MVC RequestMapping Annotation
👉 @ResponseBody - để gửi Đối tượng dưới dạng phản hồi, thường để gửi dữ liệu XML hoặc JSON dưới dạng phản hồi.
👉 @PathVariable - để ánh xạ các giá trị động từ URI tới các đối số của phương thức trình xử lý.
👉 @Autowired - cho autowiring phụ thuộc vào Spring bean.
👉 @Qualifier - với chú thích @Autowired muốn để tránh nhầm lẫn khi có nhiều trường hợp của loại bean.
👉 @Service - dành cho các lớp dịch vụ.
👉 @Scope - để định cấu hình phạm vi của Spring bean.
👉 @Configuration, @ComponentScan và @Bean - dành cho các cấu hình dựa trên java.
👉 Chú thích AspectJ để định cấu hình aspects và advices, @Aspect , @Before , @After , @Around , @Pointcut , v.v.
36. Chúng ta có thể gửi một Object dưới dạng request của phương thức xử lý Controller không?
Có, chúng tôi có thể, bằng cách sử dụng chú thích @ResponseBody. Đây là cách chúng tôi gửi phản hồi dựa trên JSON hoặc XML trong restful web services.
37. Làm cách nào để tải tệp lên trong Spring MVC Application?
Spring cung cấp hỗ trợ tích hợp để tải lên tệp thông qua triển khai interface MultipartResolver. Nó rất dễ sử dụng và chỉ cần thay đổi cấu hình để nó hoạt động. Rõ ràng là chúng ta sẽ cần viết phương thức xử lý controller để xử lý tệp đến và xử lý nó. Để có một ví dụ đầy đủ, vui lòng tham khảo Ví dụ Tải lên Tệp Spring.
38. Làm thế nào để xác thực dữ liệu biểu mẫu trong Spring Web MVC Framework?
Spring hỗ trợ xác thực dựa trên chú thích JSR-303 cũng như cung cấp interface Validator mà chúng tôi có thể triển khai để tạo trình xác thực tùy chỉnh của riêng mình. Để sử dụng xác thực dựa trên JSR-303, chúng ta cần chú thích các biến bean với các xác nhận bắt buộc.
Để triển khai trình xác thực tùy chỉnh, chúng ta cần định cấu hình nó trong lớp controller. Để có ví dụ đầy đủ, vui lòng đọc Ví dụ về xác thực biểu mẫu Spring MVC.
39. Spring MVC Interceptor là gì và cách sử dụng nó như thế nào?
Spring MVC Interceptors giống như Servlet Filters và cho phép chúng tôi chặn yêu cầu của khách hàng và xử lý nó. Chúng tôi có thể chặn yêu cầu của khách hàng ở ba nơi - preHandle, postHandle và afterCompletion.
Chúng ta có thể tạo spring interceptor bằng cách triển khai interface HandlerInterceptor hoặc bằng cách mở rộng lớp trừu tượng HandlerInterceptorAdapter.
Chúng ta cần cấu hình các interceptor trong tệp cấu hình spring bean. Chúng tôi có thể xác định một interceptor để chặn tất cả các yêu cầu của khách hàng hoặc chúng tôi cũng có thể định cấu hình nó cho ánh xạ URI cụ thể. Để có ví dụ chi tiết, vui lòng tham khảo Ví dụ về Spring MVC Interceptor.
40. Lớp Spring JdbcTemplate là gì và làm thế nào để sử dụng nó?
Spring Framework cung cấp khả năng tích hợp tuyệt vời với API JDBC và cung cấp lớp tiện ích JdbcTemplate mà chúng ta có thể sử dụng để tránh mã bolier-plate khỏi logic hoạt động cơ sở dữ liệu của chúng tôi như Mở / Đóng kết nối, ResultSet, PreparedStatement, v.v.
Đối với ví dụ về JdbcTemplate, vui lòng tham khảo Ví dụ về JDBC của Spring.
What is a RowMapper in SpringJPBC?
Các interface org.springframework.jdbc.core.RowMapper <T> được sử dụng bởi JdbcTemplate cho các RowMapper của một ResultSet trên một cơ sở cho mỗi hàng. Việc triển khai giao diện này thực hiện công việc thực tế là ánh xạ từng hàng với một đối tượng kết quả. SQLExceptions nếu được ném bất kỳ sẽ bị bắt và xử lý bởi JdbcTemplate đang gọi.
41. Làm thế nào để sử dụng Tomcat JNDI DataSource trong Spring Web Application?
Để sử dụng vùng chứa servlet được định cấu hình JNDI DataSource, chúng ta cần định cấu hình nó trong tệp cấu hình spring bean và sau đó đưa nó vào spring bean dưới dạng phụ thuộc. Sau đó, chúng tôi có thể sử dụng nó với JdbcTemplate để thực hiện các hoạt động cơ sở dữ liệu.
Cấu hình mẫu sẽ là:
<beans:bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <beans:property name="jndiName" value="java:comp/env/jdbc/MyLocalDB"/> </beans:bean>
Để có ví dụ đầy đủ, vui lòng tham khảo Ví dụ Spring Tomcat JNDI.
42. Làm thế nào bạn sẽ đạt được Transaction Management trong Spring?
Spring framework cung cấp hỗ trợ Transaction Management thông qua Declarative Transaction Management cũng như quản lý giao dịch có lập trình. Declarative Transaction Management được sử dụng rộng rãi nhất vì nó dễ sử dụng và hoạt động trong hầu hết các trường hợp.
Chúng tôi sử dụng phương pháp chú thích @Transactional với Declarative Transaction Management. Chúng ta cần định cấu hình Transaction Management cho DataSource trong tệp cấu hình spring bean.
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
43. Spring DAO là gì?
Spring DAO được cung cấp để làm việc với các công nghệ truy cập dữ liệu như JDBC, Hibernate một cách nhất quán và dễ dàng. Ví dụ chúng ta có JdbcDaoSupport, HibernateDaoSupport, JdoDaoSupport và JpaDaoSupport cho các công nghệ tương ứng.
Spring DAO cũng cung cấp tính nhất quán trong phân cấp ngoại lệ và chúng ta không cần bắt các ngoại lệ cụ thể.
44. Làm thế nào để tích hợp Spring và Hibernate Frameworks?
Chúng tôi có thể sử dụng mô-đun Spring ORM để tích hợp các Spring Framework và Hibernate nếu bạn đang sử dụng Hibernate 3+ trong đó SessionFactory cung cấp phiên hiện tại, khi đó bạn nên tránh sử dụng các lớp HibernateTemplate hoặc HibernateDaoSupport và tốt hơn nên sử dụng mẫu DAO với phụ thuộc để tích hợp.
Spring ORM cung cấp hỗ trợ cho việc sử dụng Spring declarative transaction management, vì vậy bạn nên sử dụng điều đó thay vì sử dụng Hibernate boiler-plate để quản lý giao dịch.
Để hiểu rõ hơn, bạn nên xem qua các hướng dẫn sau:
Ví dụ về tích hợp Spring Hibernate
Ví dụ về tích hợp chế độ ngủ đông của Spring MVC
45. Spring Security là gì?
SpringSecurity Framework tập trung vào authentication và authorization trong các ứng dụng java. Nó cũng xử lý hầu hết các lỗ hổng bảo mật phổ biến như cuộc tấn công CSRF.
Nó rất có lợi và dễ dàng để sử dụng Spring security trong các ứng dụng web, thông qua việc sử dụng các chú thích chẳng hạn như @EnableWebSecurity. Bạn nên xem qua các bài viết sau để biết cách sử dụng Spring Security framework.
o Spring security trong ứng dụng web Servlet
o Spring MVC và Spring Security Integration Ví dụ
46. Làm thế nào để đưa java.util.Properties vào Spring Bean?
Chúng ta cần xác định bean propertyConfigurer sẽ tải các thuộc tính từ tệp thuộc tính đã cho. Sau đó, chúng ta có thể sử dụng hỗ trợ Spring EL để đưa các thuộc tính vào các phụ thuộc bean khác. Ví dụ:
<bean id="propertyConfigurer" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> <property name="location" value="/WEB-INF/application.properties" /> </bean> <bean class="com.journaldev.spring.EmployeeDaoImpl"> <property name="maxReadResults" value="${results.read.max}"/> </bean>
Nếu bạn đang sử dụng chú thích để định cấu hình Spring bean, thì bạn có thể chèn thuộc tính như bên dưới.
@Value("${maxReadResults}") private int maxReadResults;
47. Kể tên một số mẫu thiết kế được sử dụng trong Spring Framework?
Spring Framework đang sử dụng rất nhiều mẫu thiết kế, một số mẫu phổ biến là:
👉 Singleton Pattern: Tạo các bean với phạm vi mặc định.
👉 Factory Pattern : Các lớp Bean factory
👉 Prototype Pattern : Bean scopes
👉 Adapter Pattern : Spring Web và Spring MVC
👉 Proxy Pattern : Hỗ trợ lập trình theo hướng Spring Aspect
👉 Template Method Pattern: JdbcTemplate, HibernateTemplate, v.v.
👉 Front Controller: Spring MVC DispatcherServlet
👉 Data Access Object: Hỗ trợ Spring DAO
👉 Dependency Injection và Aspect Oriented Programming
48. Một số phương pháp hay nhất cho Spring Framework là gì?
Một số phương pháp hay nhất cho Spring Framework là:
👉 Tránh số phiên bản trong tham chiếu lược đồ, để đảm bảo chúng tôi có cấu hình mới nhất.
👉 Phân chia các cấu hình spring bean dựa trên mối quan tâm của chúng, chẳng hạn như spring-jdbc.xml, spring-security.xml.
👉 Đối với spring bean được sử dụng trong nhiều ngữ cảnh trong Spring MVC, hãy tạo chúng trong ngữ cảnh gốc và khởi tạo với trình nghe.
👉 Định cấu hình các phụ thuộc bean càng nhiều càng tốt, cố gắng tránh tự động tạo càng nhiều càng tốt.
👉 Đối với các thuộc tính cấp ứng dụng, cách tốt nhất là tạo một tệp thuộc tính và đọc nó trong tệp cấu hình spring bean.
👉 Đối với các ứng dụng nhỏ hơn, chú thích rất hữu ích nhưng đối với các ứng dụng lớn hơn, chú thích có thể trở thành một vấn đề. Nếu chúng ta có tất cả cấu hình trong các tệp XML, việc duy trì nó sẽ dễ dàng hơn.
👉 Sử dụng chú thích chính xác cho các thành phần để hiểu mục đích một cách dễ dàng. Đối với các Service, hãy sử dụng @Service và đối với bean DAO, hãy sử dụng @Repository.
👉 Spring framework có rất nhiều module, hãy sử dụng những gì bạn cần. Loại bỏ tất cả các phụ thuộc bổ sung thường được thêm vào khi bạn tạo dự án thông qua các mẫu Spring Tool Suite.
👉 Nếu bạn đang sử dụng Aspects, hãy đảm bảo rằng nối pint càng hẹp càng tốt để tránh lời khuyên về các phương pháp không mong muốn. Xem xét các chú thích tùy chỉnh dễ sử dụng hơn và tránh mọi vấn đề.
👉 Sử Dependency injection khi có lợi ích thực sự, chỉ vì lợi ích của khớp nối lỏng lẻo, không sử dụng nó vì nó khó duy trì hơn.
Bài viết được dịch lại từ journaldev.com. Cảm ơn bạn đã xem bài viết!
Nếu có bất cứ lỗi sai nào trong bài bạn có thể góp ý cho chúng tôi bằng cách bình luận bên dưới.
Nếu có bất cứ lỗi sai nào trong bài bạn có thể góp ý cho chúng tôi bằng cách bình luận bên dưới.

0 Nhận xét