Top 50 câu hỏi phỏng vấn Spring Framework

0 0 0

Người đăng: Tung Bui

Theo Viblo Asia

1. Giới thiệu

Cuối năm rồi, thấy bạn bè, người người nhà nhà kéo nhau đi phỏng vấn. Phần vì muốn qua năm nhảy việc, phần vì muốn thăm dò thị trường hay đi tìm định giá mới cho bản thân trong giai đoạn kinh tế khó khăn triền miên. Tình cờ thay, mình tìm lại được danh sách các câu hỏi phỏng vấn về Spring Framework mà mình đã lưu lại, không biết từ đời nào, chắc có lẽ là từ hồi sinh viên, thuở mới tập thành viết blog. Anw, hi vọng đến bây giờ, nó vẫn còn giá trị :v

Dù gì đi nữa, sự hiểu biết cũng như kiến thức của bạn phản ánh một phần nào đó giá trị và thực lực của bạn trong mắt nhà tuyển dụng.

Cho nên, biết nhiều một chút, chuẩn bị kỹ một chút cũng không phải là dư thừa cho mọi tình huống xấu nhất có thể xảy ra với bạn.

Để giúp ích được cho bạn chút gì đó, mình nghĩ rằng việc chia sẻ một số câu hỏi phỏng vấn thường hay gặp nhất cũng là một việc là thiết thực và có ý nghĩa nhất đối với nhiều người, đặc biệt là các bạn vừa luyện xong Java Spring và chuẩn bị bước vào công ty để thựcc hiện giấc mơ của mình. ✌️

2. 50 câu hỏi phỏng vấn java Spring

Nào hãy chuẩn bị tình thần cùng nhau thưởng thức 50 hương vị đặc sắc này nhé.

1- Spring Framework là gì?

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 InjectionAspect Oriented Programming.

Spring framework có thể được sử dụng trong các ứng dụng java thông thường để đạt được sự liên kết giữa các thành phần khác nhau bằng cách thực hiện chèn phụ thuộc (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ý (logging) và xác thực (authentication) bằng cách sử dụng Spring support cho lập trình hướng khía cạnh (aspect-oriented programming).

Tui 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 MVCSpring JDBC. Vì đây là một source framework 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 làm việc với Spring framework rất dễ dàng và thú vị.

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 InjectionAspect 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 ta.
  • 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 mà ta mong muốn.
  • 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ớ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 thế của việc sử dụng Spring Framework là:

  • Giảm sự 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 (inject) chúng vào làm phụ thuộc (dependency).
  • 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 ta không có sự 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 ta có thể dễ dàng viết một cấu hình thử nghiệm và đưa các bean giả 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 các đối tượng, mở/đóng tài nguyên. Tôi thích lớp JdbcTemplate rất nhiều vì nó giúp 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 module, nó giúp giữ cho ứng dụng của mình nhẹ hơn. Ví dụ: nếu không cần các tính năng quản lý giao dịch Spring, chúng tôi không cần thêm sự phụ thuộc (dependency) đó 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 - ví dụ: có một dự án Spring dành cho Android để giúp viết code 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 package hoàn chỉnh và chúng ta không cần phải xem xét Framework khác 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 ta loại bỏ các phần phụ thuộc được code cứng và làm cho ứng dụng được liên kết mật thiết, có thể mở rộng và có thể bảo trì. Chúng ta có thể triển khai mẫu tiêm phụ thuộc (dependency injection pattern) để di chuyển độ phân giải phụ thuộc từ thời gian biên dịch sang thời gian chạy.

Một số lợi ích của việc sử dụng Dependency Injection là tách các mối quan tâm, giảm code Boilerplate, các thành phần có thể cấu hình và dễ dàng kiểm tra đơn vị.

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 các ứng dụng Spring.

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. Thật vui khi thấy Spring đang cố gắng hỗ trợ các phiên bản mới nhất.
  • 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 các thành phần của Spring thông qua file chỉ mục “META-INF/spring.components” thay vì scan classpath.
  • Spring WebFlux mang đến lập trình phản ứng (reactive) 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 (functional), 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.

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 (reactive) trong Spring framework.

Spring WebFlux là sự thay thế cho mô-đun Spring MVC. Spring WebFlux được sử dụng để tạo một ứng dụng hoàn toàn asynchronousnon-blocking trên mô hình*** event-loop execution***.

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, Templates để tạo các loại dự án Spring khác nhau và máy chủ để có hiệu suất tốt hơn với các ứng dụng Spring.

Mình thích STS bởi vì nó làm nổi bật các thành phần Spring và nếu bạn đang sử dụng AOP pointcut và advice thì nó sẽ hiển thị rõ ràng các phương thức nào sẽ nằm trong pointcut cụ thể. Vì vậy, thay vì tự mình cài đặt mọi thứ, mình thích sử dụng STS khi phát triển các ứng dụng dựa trên Spring hơn.

8- Kể tên một số Module quan trọng của Spring?

Một số mô-đun Spring Framework quan trọng là:

  • Spring Context - để tiêm phụ thuộc (dependency injection)
  • Spring AOP - dành cho lập trình hướng khía cạnh (aspect oriented).
  • 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, …

9- Bạn hiểu gì về 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, … Trong Lập trình hướng đối tượng, tính module của ứng dụng được thực hiện bởi Class trong khi ứng dụng AOP module đạt được bởi Aspects và chúng được cấu hình để cắt qua các lớp phương thức khác nhau.

AOP loại bỏ sự phụ thuộc trực tiếp của các nhiệm 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.

10- Tham số Aspect, Advice, Pointcut, JointPoint và Advice 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. Các khía cạnh có thể là một lớp bình thường được cấu hình và sau đó được định cấu hình trong file 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 dưới dạng Aspect bằng cách sử dụng chú thích @Aspect.

Advice: là hành động được thực hiện cho một joinpoint 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 joinpoint 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.

Pointcutt: Pointcut là các biểu thức chính quy được so khớp với các joinpoint để 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 joinpoint. Spring framework sử dụng ngôn ngữ biểu thức pointcut AspectJ để xác định các joinpoint - nơi các phương thức advice sẽ được áp dụng.

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, ... Trong Spring AOP, jointpoint 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 arguments trong các phương thức advice. 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 đối số mẫu. 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 advice mà từ đó loại đối số được xác định.

11- Sự khác biệt giữa Spring AOP và AspectJ AOP là gì?

AspectJ là triển khai tiêu chuẩn công nghiệp cho Lập trình hướng theo khía cạnh (Aspect Oriented) 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 dễ sử dụng hơn AspectJ vì chúng ta không cần lo lắng về weaving process.
  • Spring AOP hỗ trợ các chú thích AspectJ - vì vậy nếu bạn đã quen với AspectJ thì 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 joinpoint thực thi phương thức. AspectJ hỗ trợ tất cả các loại pointcut.
  • 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 chặt chẽ giữa các đối tượng phụ thuộc (Objects dependencies). Để đạt được sự chặt chẽ và liên kết động của các đối tượng trong thời gian chạy, các đối tượng xác định các phụ thuộc cần được chèn vào bởi các đối tượng assembler khác. Spring IoC container là chương trình inject dependency vào một đối tượng và làm cho nó sẵn sàng để chúng ta sử dụng.

Các lớp Spring Framework IoC container là một phần của package org.springframework.beansorg.springframework.context cung cấp cho chúng ta các cách khác nhau để tách các phụ thuộc đối tượng (object dependencies).

Một số triển khai ApplicationContext hữu ích mà chúng ta 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 file cấu hình xml có thể được tải từ bất kỳ đâu trong file hệ thống.
  • AnnotationConfigWebApplicationContext và XmlWebApplicationContext dành 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 ta sử dụng Spring ApplicationContext để lấy instance Spring Bean.

Spring IoC container quản lý vòng đời của Spring Bean, các phạm vi bean và inject vào bất kỳ dependency bắt buộc nào trong bean.

14- Tầm quan trọng của file cấu hình Spring Bean là gì?

Chúng ta sử dụng file cấu hình Spring Bean để 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 instance Spring ApplicationContext, nó sẽ đọc file 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 instance bean khác nhau.

Ngoài cấu hình Spring Bean, file này cũng chứa các Spring MVC Interceptor, 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.

Cấu hình XML: Đây là cấu hình phổ biến nhất và chúng ta có thể sử dụng phần tử bean (bean element) trong file ngữ cảnh để cấu hình Spring Bean. Ví dụ:

<bean name="myBean" class="com.thecorleone.spring.beans.MyBean"></bean>

Cấu hình dựa trên Java: Nếu bạn chỉ sử dụng chú thích, bạn có thể 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 các lớp @Configuration để cấu hình một Spring bean. Ta có một cấu hình mẫu như sau:

@Configuration
@ComponentScan(value="com.thecorleone.spring.main")
public class MyConfiguration { @Bean public MyService getService(){ return new MyService(); }
}

Để lấy Bean này từ Spring bối cảnh chúng ta cần sử dụng đoạn mã sau:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext( MyConfiguration.class);
MyService service = ctx.getBean(MyService.class);

Cấu hình dựa trên chú thích: Chúng ta cũng có thể sử dụng chú thích @Component, @Service, @Repository và @Controller với các lớp để cấu hình chúng giống như Spring bean. Nếu thực hiện theo cách này, chúng ta cần cung cấp vị trí package để quét các lớp. Ví dụ:

<context:component-scan base-package="com.thecorleone.spring" />

16- Các phạm vi (scope) 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 instance của bean sẽ được tạo cho mỗi container. Đây là scope 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 instance được chia sẻ - nếu không - nó có thể dẫn đến vấn đề không nhất quán dữ liệu vì nó không an toàn cho luồng.
  • prototype: Một instance mới sẽ được tạo mỗi khi bean được yêu cầu (request).
  • request: Scope này giống như phạm vi prototype, tuy nhiên - phạm vi này được sử dụng cho các ứng dụng web. Một instance 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 HTTP session bởi container.
  • global-session: Điều này được sử dụng để tạo các bean session toàn cục cho các ứng dụng Portlet. Spring Framework có thể mở rộng và chúng ta cũng có thể tạo scope của riêng mình, tuy nhiên hầu hết các trường hợp chúng ta đều sử dụng tốt các scope được cung cấp bởi Framework. Để thiết lập phạm vi của 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?

Spring Beans được khởi tạo bởi Spring Container và tất cả các dependency cũng được inject. Khi ngữ cảnh bị phá hủy, nó cũng phá hủy tất cả các bean đã khởi tạo. Spring Bean hoạt động tốt trong hầu hết các trường hợp nhưng đôi khi chúng ta 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 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 (post-initialization) và hủy trước (pre-destroy) trong Spring bean. Chúng ta có thể thực hiện điều này bằng hai cách - bằng cách triển khai các interface InitializingBean và DisposableBean hoặc sử dụng thuộc tính init-method và destroy-method trong các cấu hình 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 các interface Spring Aware đối với các interface ServletContextAwareServletConfigAware. Để có ví dụ đầy đủ về các interface nhận biết này, bạn có thể tìm đọc thêm Spring Aware Interfaces. Sử dụng chú thích @Autowired với biến bean kiểu ServletContextServletConfig. 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;

19- Bean wiring và chú thích @Autowired là gì?

Quá trình inject các dependency 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 wiring rõ ràng của tất cả các bean dependency nhưng Spring Framework cũng hỗ trợ auto-wiring. 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 file 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.

20- Spring Bean autowiring có những loại nào?

Có bốn kiểu autowiring trong Spring framework.

  • autowire byName
  • autowire byType
  • autowire by-constructor
  • autowiring theo chú thích @Autowired@Qualifier Trước Spring 3.1, autowire by-autodetect cũng được hỗ trợ tương tự như autowire by-constructor hoặc byType.

21- Spring Bean có cung cấp an toàn cho thread không?

Phạm vi mặc định của Spring bean là singleton, vì vậy sẽ chỉ có một instance cho mỗi ngữ cảnh. Điều đó có nghĩa là tất cả những gì có một biến cấp độ Class mà bất kỳ luồng nào có thể cập nhật sẽ dẫn đến dữ liệu không nhất quán. Do đó ở chế độ mặc định, Spring Bean không an toàn cho thread.

Tuy nhiên, chúng ta có thể thay đổi phạm vi Spring bean thành request, prototype hoặc session để đạt được an toàn luồng với kết quả hiệu suất nhất định. Đó 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 khách hàng 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 (request mapping). Chúng ta có thể tạo một lớp Controller 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 thành phần. Các lớp này được sử dụng để tự động phát hiện (auto-detection) 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 thành phần 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.

@Repository được sử dụng để chỉ ra rằng một thành phần được sử dụng làm kho lưu trữ (repository) 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 DAO.

@Service được sử dụng để chỉ ra rằng một lớp là một Dịch vụ. 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 Service.

Chúng ta 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 (auto-detection) 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à controller trong ứng dụng Spring MVC và nó tải file cấu hình Spring bean và khởi tạo tất cả các bean đã được cấu hình. Nếu chú thích được bật, nó cũng scan các package và cấu hình bất kỳ bean nào được chú thích bằng @Component, @Controller, @Repository hoặc @Service.

ContextLoaderListener là trình lắng nghe (listener) để khởi động và tắt 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 tạo 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 ngữ cảnh Spring khác nhau.

25- ViewResolver trong Spring là gì?

Các triển khai ViewResolver được sử dụng để phân giải các view page theo tên. Thông thường, chúng ta cấu hình nó trong file cấu hình spring bean. 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 triển khai của interface ViewResolver. Chúng ta đang cung cấp thư mục view page và vị trí thông qua các thuộc tính bean. Vì vậy, nếu một phương thức trình xử lý bộ điều khiển (controller handler) trả về "home", view resolver sẽ sử dụng view page 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 lên file - CommonsMultipartResolverStandardServletMultipartResolver là hai triển khai được cung cấp bởi Spring framework để tải file lên. Theo mặc định, không có trình phân giải (resolver) nhiều phần được cấu hình nhưng để sử dụng chúng để tải file lên, tất cả những gì chúng ta cần là 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 cấu hình, bất kỳ yêu cầu nào cũng sẽ được giải quyết bởi MultipartResolver đã cấu hình và chuyển một HttpServletRequest được bao bọc (wrapped). Sau đó, nó được sử dụng trong lớp controller để lấy và xử lý file.

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 việc xử lý ngoại lệ mạnh mẽ.

  • Dựa trên Controller - Chúng ta có thể xác định các phương thức xử lý ngoại lệ trong các lớp Controller 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ố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ục.
  • Triển khai HandlerExceptionResolver - Đối với các ngoại lệ chung, hầu hết thời gian chúng ta dành cho các trang tĩnh. 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ệ chung. Lý do đằng sau cách bổ sung này là để 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 file 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.

28- Làm thế nào để tạo ApplicationContext trong một chương trình Java?

Có những cách để tạo Spring context trong một chương trình java độc lập như sau:

  • 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 container và lấy các đối tượng bean.
  • ClassPathXmlApplicationContext: Nếu chúng ta có file xml cấu hình spring bean trong ứng dụng độc lập thì có thể sử dụng lớp này để tải file và lấy đối tượng container.
  • FileSystemXmlApplicationContext: tương tự như ClassPathXmlApplicationContext ngoại trừ việc file cấu hình xml có thể được tải từ bất kỳ đâu trong file hệ thống.

29- Chúng ta có thể có nhiều file cấu hình Spring không?

Đối với các ứng dụng Spring MVC, chúng ta có thể xác định nhiều file cấu hình spring context 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 ta cũng có thể xác định nhiều Spring configuration gốc 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ử import trong file cấu hình ngữ cảnh để import 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 (listener class) đượ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ị với tất cả các ngữ cảnh khác. Nó được định cấu hình trong file 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 các dependency vào spring-context và spring-webmvc trong dự án.
  • Cấu hình DispatcherServlet trong file web.xml để xử lý các yêu cầu thông qua Spring container.
  • File cấu hình Spring bean để 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 view resolver cho các view-page.
  • Lớp Controller với các ánh xạ yêu cầu (request mapping) được xác định để xử lý các yêu cầu của máy khách.

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 có nhiệm vụ xử lý tất cả các yêu cầu đến và ủy thác nó cho các phương thức xử lý controller 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 (automatic) dữ liệu biểu mẫu với các bean java. Chúng ta có thể đặt các bean model làm thuộc tính được sử dụng trong các view-page. Các view-page có thể là JSP, HTML tĩnh, ... và các trình phân giải chế độ xem có trách nhiệm tìm đúng view-page. Khi view-page được xác định, quyền kiểm soát được trao lại cho DispatcherServlet Controller. DispatcherServlet chịu trách nhiệm hiển thị dạng xem và trả lại phản hồi cuối cùng cho máy khách.

33- Làm thế nào để achieve localization trong các ứng dụng Spring MVC?

Spring cung cấp hỗ trợ tuyệt vời cho localization hoặc i18n thông qua các package tài nguyên. Các bước cơ bản cần thiết để localization ứng dụng của chúng ta là:

  • Tạo các package tài nguyên thông báo cho các ngôn ngữ khác nhau, chẳng hạn như messages_en.properties, messages_fr.properties, ...
  • Định nghĩa messageSource bean trong file cấu hình spring bean của loại ResourceBundleMessageSource hoặc ReloadableResourceBundleMessageSource.
  • Để thay đổi hỗ trợ 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 phần tử spring: message trong các view-page 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.

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 Jackson JSON API mà chúng ta có thể sử dụng để gửi phản hồi JSON trong dịch vụ web tĩnh.

Chúng ta cần thực hiện các bước sau để 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 Jackson JSON dependency, nếu bạn đang sử dụng Maven thì có thể thực hiện bằng code sau:

<!-- Jackson -->
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.databind-version}</version>
</dependency> Cấu hình bean RequestMappingHandlerAdapter trong file 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à:
<!-- 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>

Trong các phương thức xử lý controller, hãy trả về Đối tượng dưới dạng phản hồi bằng cách sử dụng chú thích @ResponseBody. Code mẫu:

@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.

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 điều khiển trong dự án Spring MVC.
  • @RequestMapping - để cấu hình ánh xạ URI trong các phương thức xử lý điều khiển. Đây là một chú thích rất quan trọng.
  • @ResponseBody - để gửi Object 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 xử lý.
  • @Autowired - dành cho các autowiring dependency trong Spring bean.
  • @Qualifier - với chú thích @Autowired để 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 - để cấu hình phạm vi của Spring bean.
  • @Configuration, @ComponentScan@Bean - dành cho các cấu hình dựa trên java.
  • Chú thích của AspectJ để cấu hình các khía cạnh và lời khuyên, @Aspect, @Before, @After, @Around, @Pointcut, ...

36- Chúng ta có thể gửi một Object dưới dạng phản hồi của phương thức xử lý Bộ điều khiển không?

Có, chúng ta có thể bằng cách sử dụng chú thích @ResponseBody. Đây là cách chúng ta gửi phản hồi dựa trên JSON hoặc XML trong các dịch vụ web ổn định.

37- Làm thế nào để tải file lên trong Ứng dụng Spring MVC?

Spring cung cấp hỗ trợ tích hợp để tải file lên 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 để hoạt động. Rõ ràng là chúng ta cần phải viết phương thức xử lý controller để xử lý file đến và xử lý nó.

38- Làm thế nào để xác thực dữ liệu biểu mẫu (form data) 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 Validator interface mà chúng ta 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.

39- Spring MVC Interceptor là gì và làm thế nào để sử dụng nó?

Spring MVC Interceptors giống như Servlet Filters và cho phép chúng ta chặn yêu cầu của khách hàng và xử lý nó. Chúng ta 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 HandlerInterceptor interface 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 file cấu hình spring bean. Chúng ta 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 ta cũng có thể cấu hình nó cho ánh xạ URI cụ thể.

40- Lớp Spring JdbcTemplate là gì và cách 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 code bolier-plate khỏi logic hoạt động cơ sở dữ liệu của chúng ta như Opening/Closing Connection, ResultSet, PreparedStatement, …

41- Làm thế nào để sử dụng Tomcat JNDI DataSource trong Spring Web Application?

Để sử dụng servlet container được cấu hình JNDI DataSource, chúng ta cần cấu hình nó trong file cấu hình spring bean và sau đó inject nó vào spring bean dưới dạng dependency. Sau đó, chúng ta 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>

42- Làm thế nào để achieve Transaction Management trong Spring?

Spring framework cung cấp hỗ trợ quản lý giao dịch 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 ta sử dụng phương pháp chú thích với chú thích @Transactional để quản lý giao dịch so sánh. Chúng ta cần cấu hình trình quản lý giao dịch cho DataSource trong file 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ệ (exception hierarchy) nên chúng ta không cần phải nắm 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 ta có thể sử dụng module Spring ORM để tích hợp các Spring Framework và Hibernate nếu đang sử dụng Hibernate 3+ trong đó SessionFactory cung cấp session 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 là sử dụng mẫu DAO với dependency injection để tích hợp. Spring ORM cung cấp hỗ trợ cho việc sử dụng quản lý giao dịch khai báo Spring, vì vậy bạn nên sử dụng nó thay vì sử dụng mã Hibernate boiler-plate để quản lý giao dịch.

45- Spring Security là gì?

Spring security framework tập trung vào việc cung cấp cả xác thực (authentication) và ủy quyền (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ư tấn công CSRF. Việc sử dụng Spring security trong các ứng dụng web rất có lợi và dễ dàng thông qua việc sử dụng các chú thích như @EnableWebSecurity.

46- Làm thế nào để đưa (inject) 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 (Property) từ file 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 bean dependency 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.thecorleone.spring.EmployeeDaoImpl"> <property name="maxReadResults" value="${results.read.max}"/>
</bean>

Nếu bạn đang sử dụng chú thích để cấu hình spring bean, thì bạn có thể chèn thuộc tính (inject property) như bên dưới:

@Value("${maxReadResults}") private int maxReadResults;

47- Kể tên một số mẫu thiết kế (design pattern) đượ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 bean với phạm vi mặc định.
  • Factory Pattern: Các lớp Bean Factory
  • Prototype Pattern: Phạm vi bean
  • Adapter Pattern: Spring Web và Spring MVC
  • Proxy Pattern: Hỗ trợ lập trình hướng Spring Aspect
  • Template Method Pattern: JdbcTemplate, HibernateTemplate, ...
  • Front Controller: Spring MVC DispatcherServlet
  • Data Access Object: Hỗ trợ Spring DAO
  • Dependency Injection và Aspect Oriented Programming

48- Một số kinh nghiệm quý báo nhất cho Spring Framework là gì?

Một số kinh nghiệm quý báo nhất cho Spring Framework là:

  • Tránh số phiên bản trong tham chiếu lược đồ để đảm bảo chúng ta 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 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 (listener).
  • Cấu hình các bean dependency càng nhiều càng tốt, cố gắng tránh autowiring càng nhiều càng tốt.
  • Đối với các thuộc tính mức ứng dụng, cách tốt nhất là tạo một file thuộc tính và đọc nó trong file 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 file 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 dịch vụ, hãy sử dụng @Service và đối với DAO bean, 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 dependency 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 join-pint càng hẹp càng tốt để tránh advice về các phương thức 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ử dụng dependency injection khi có lợi ích thực tế, chỉ vì lợi ích của sư liên kết chặt chẽ chứ không sử dụng nó vì khó bảo trì hơn.

49- Core container là gì?

Đây là module cơ bản của Spring, cái mà sẽ cung cấp nhưng tính năng cơ bản của Spring framework. BeanFactory chính là trái tim của bất cứ Spring-based application nào, Spring framework được xây dụng trên module này và nó cũng chính là Spring container.

50- Hạn chế của autowiring

Các hạn chế của việc autowiring:

  • Overriding: vẫn có thể định nghĩa các dependencies bằng và việc này sẽ luôn luôn override autowiring.
  • Data types: Không thể autowire những thuộc tính đơn giản như primitive, String và Classes.
  • Confusing: autowiring thì không tường minh, vì thế sử dụng khai báo tường minh có thể là cách khôn ngoan hơn.

3. Kết luận

50 câu phỏng vấn không phải là đầy đủ và không có nơi nào phỏng vấn bạn một lượt 50 câu cả nhưng đây chỉ là những câu cốt lõi và quan trọng, thường xuyên được các nhà tuyển dụng đưa ra để thử thách các ứng viên nhất. Vì vậy, bạn đừng nên ỷ lại vào các câu bên trên, mình không chịu trách nhiệm đâu nhé.

Nhưng nói đi cũng nói lại, sở hữu cho mình một lượng 50 câu về Spring cũng không phải là chuyện mà bất cứ ứng viên nào cũng có thể rành mạch được. Chắc chắn rằng bạn sẽ thực sự tự tin sau khi nằm lòng 50 câu mà mình đã chia sẻ bên trên. Chúc mai mắn nhé…!

Bài viết mang tính chất "ghi chú, lưu trữ, chia sẻ và phi lợi nhuận".
Nếu bạn thấy hữu ích, đừng quên chia sẻ với bạn bè và đồng nghiệp của mình nhé!

Happy coding! 😎 👍🏻 🚀 🔥

Đọc thêm:

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tổng hợp các bài hướng dẫn về Design Pattern - 23 mẫu cơ bản của GoF

Link bài viết gốc: https://gpcoder.com/4164-gioi-thieu-design-patterns/. Design Patterns là gì. Design Patterns không phải là ngôn ngữ cụ thể nào cả.

0 0 303

- vừa được xem lúc

Học Spring Boot bắt đầu từ đâu?

1. Giới thiệu Spring Boot. 1.1.

0 0 279

- vừa được xem lúc

Cần chuẩn bị gì để bắt đầu học Java

Cần chuẩn bị những gì để bắt đầu lập trình Java. 1.1. Cài JDK hay JRE.

0 0 52

- vừa được xem lúc

Sử dụng ModelMapper trong Spring Boot

Bài hôm nay sẽ là cách sử dụng thư viện ModelMapper để mapping qua lại giữa các object trong Spring nhé. Trang chủ của ModelMapper đây http://modelmapper.org/, đọc rất dễ hiểu dành cho các bạn muốn tìm hiểu sâu hơn. 1.

0 0 195

- vừa được xem lúc

[Java] 1 vài tip nhỏ khi sử dụng String hoặc Collection part 1

. Hello các bạn, hôm nay mình sẽ chia sẻ về mẹo check String null hay full space một cách tiện lợi. Mình sẽ sử dụng thư viện Lớp StringUtils download file jar để import vào thư viện tại (link).

0 0 72

- vừa được xem lúc

Deep Learning với Java - Tại sao không?

Muốn tìm hiểu về Machine Learning / Deep Learning nhưng với background là Java thì sẽ như thế nào và bắt đầu từ đâu? Để tìm được câu trả lời, hãy đọc bài viết này - có thể kỹ năng Java vốn có sẽ giúp bạn có những chuyến phiêu lưu thú vị. DJL là tên viết tắt của Deep Java Library - một thư viện mã ng

0 0 139