Đáp án đúng: "@Aspect". Trong Spring AOP (lập trình hướng khía cạnh), @Aspect lấy từ AspectJ đánh dấu một lớp là aspect, tức mô-đun gom logic cắt ngang như ghi log, đo thời gian; bên trong khai báo pointcut bằng @Pointcut và advice bằng @Before, @After, @Around. Lớp này phải đồng thời là bean (thêm @Component) và cần bật hỗ trợ bằng @EnableAspectJAutoProxy, hoặc được Spring Boot bật tự động, khi đó Spring tạo proxy bọc các bean khớp pointcut. "@Controller" đánh dấu lớp xử lý yêu cầu web trong Spring MVC. "@Repository" đánh dấu lớp truy cập dữ liệu và bật dịch ngoại lệ sang DataAccessException. "@Configuration" đánh dấu lớp chứa các phương thức @Bean khai báo cấu hình; nó có thể dùng kèm để bật AOP nhưng không định nghĩa aspect.
Đáp án đúng: "th:if". th:if đánh giá một biểu thức, ví dụ th:
Lời giải
if="${user.admin}";
nếu kết quả là true, Thymeleaf giữ lại thẻ cùng toàn bộ nội dung bên trong khi render, nếu false thì thẻ bị loại khỏi HTML đầu ra; th:unless làm điều ngược lại. Đây là cách hiển thị có điều kiện, như chỉ hiện nút xoá cho quản trị viên. "th:each" là thuộc tính lặp, nhân bản thẻ cho từng phần tử của một tập hợp, ví dụ mỗi sản phẩm một dòng bảng. "th:text" thay nội dung chữ của thẻ bằng giá trị biểu thức, có escape HTML. "th:href" tạo giá trị thuộc tính href cho liên kết, thường dùng cú pháp @{...} để sinh URL có context path. Không thuộc tính nào trong số đó quyết định việc thẻ có xuất hiện hay không.
BComprehensive web development support through Spring MVC.
CAutomatic generation of user interfaces.
DStrong community support and extensive documentation.
Lời giải
Đáp án đúng: "Automatic generation of user interfaces.". Câu hỏi tìm điều KHÔNG phải ưu điểm chung của Spring, và Spring không hề tự sinh giao diện người dùng: lập trình viên vẫn phải tự viết template Thymeleaf, JSP hoặc front-end riêng, Spring chỉ cung cấp hạ tầng để nối dữ liệu vào view. "Robust transaction management." là ưu điểm thật, vì @Transactional và PlatformTransactionManager cho phép quản lý giao dịch khai báo, thống nhất cho JDBC, JPA hay JTA, nên không được chọn. "Comprehensive web development support through Spring MVC." cũng đúng, Spring MVC cung cấp DispatcherServlet, controller, data binding, validation và REST. "Strong community support and extensive documentation." đúng nốt, Spring có cộng đồng rất lớn và tài liệu tham khảo chính thức đầy đủ, nên cũng không phải đáp án.
Đáp án đúng: "@Entity". @Entity đánh dấu một lớp là thực thể JPA, tức lớp được ánh xạ tới một bảng; provider như Hibernate sẽ quản lý vòng đời các đối tượng thuộc lớp đó trong persistence context, và Spring Data JPA chỉ tạo repository cho các lớp đã là entity. "@Component" là stereotype chung đăng ký một lớp làm bean trong Spring container, không liên quan tới ánh xạ bảng. "@Service" là dạng chuyên biệt của @Component cho tầng nghiệp vụ, chỉ mang ý nghĩa vai trò. "@Repository" đánh dấu bean truy cập dữ liệu và bật dịch ngoại lệ sang DataAccessException; nó gắn lên lớp hoặc interface truy cập dữ liệu chứ không gắn lên lớp dữ liệu, và với interface kế thừa JpaRepository thì thậm chí không bắt buộc.
BTo mark a field as not persistent (not to be stored in the database)
CTo define a relationship between entities
DTo indicate a read-only field
Lời giải
Đáp án đúng: "To mark a field as not persistent (not to be stored in the database)". Theo JPA, mọi trường của thực thể mặc định đều được ánh xạ thành cột; đặt @Transient lên một trường báo persistence provider bỏ qua nó, không tạo cột, không đọc ghi, thường dùng cho giá trị tính toán như tuổi suy ra từ ngày sinh hay trường tạm chỉ dùng trong bộ nhớ. Cần phân biệt với từ khoá transient của Java vốn chủ yếu liên quan tuần tự hoá. "To specify a primary key" là việc của @Id. "To define a relationship between entities" là việc của @OneToMany, @ManyToOne, @ManyToMany hay @OneToOne. "To indicate a read-only field" sai vì trường @Transient hoàn toàn không gắn với cơ sở dữ liệu; muốn cột chỉ đọc thì dùng @Column với insertable và updatable bằng false, hoặc @Immutable của Hibernate cho cả thực thể.
Đáp án đúng: "@ManyToMany". @ManyToMany trong JPA khai báo quan hệ nhiều nhiều, ví dụ một Student học nhiều Course và một Course có nhiều Student; phía sở hữu thường kèm @JoinTable mô tả bảng nối, phía còn lại dùng mappedBy trỏ về trường của phía sở hữu, và kiểu trường là một tập hợp như Set hoặc List. "@OneToOne" dành cho quan hệ một một, mỗi entity bên này ứng với đúng một entity bên kia. "@ManyToOne" đặt ở phía nhiều của quan hệ một nhiều, trường là một đối tượng đơn và cột khoá ngoại nằm trong bảng của chính entity đó. "@OneToMany" đặt ở phía một, trường là tập hợp nhưng mỗi phần tử con chỉ thuộc về một cha, nên không diễn tả được việc hai bên cùng có nhiều.
AA command-line tool to compile and run Groovy scripts, supporting rapid prototyping
BA tool that provisions cloud resources on AWS only
CA dedicated debugger for Spring MVC controllers
DA SQL client bundled with Spring Boot
Lời giải
Đáp án đúng: "A command-line tool to compile and run Groovy scripts, supporting rapid prototyping". Spring Boot CLI là công cụ dòng lệnh cho phép viết một tệp Groovy ngắn chứa controller rồi chạy ngay bằng lệnh spring run, CLI tự suy và kéo các dependency cần thiết, tự thêm import, nên rất hợp để thử nghiệm nhanh mà không cần dựng dự án Maven hay Gradle đầy đủ; ở các bản Spring Boot 3 về sau, CLI tập trung vào việc khởi tạo dự án như spring init, nhưng mô tả kinh điển của nó vẫn là chạy script Groovy để tạo mẫu nhanh. "A tool that provisions cloud resources on AWS only" sai vì việc cấp phát hạ tầng đám mây là của các công cụ như AWS CLI hay Terraform, Spring Boot CLI không làm việc đó. "A dedicated debugger for Spring MVC controllers" sai vì CLI không phải trình gỡ lỗi, việc này do IDE và JVM debugger đảm nhận. "A SQL client bundled with Spring Boot" sai vì Spring Boot không kèm công cụ khách SQL nào, CLI cũng không kết nối cơ sở dữ liệu để chạy lệnh SQL.
CTo generate primary keys using an auto-increment column.
DTo generate random numbers.
Lời giải
Đáp án đúng: "To generate primary keys using an auto-increment column.". GenerationType.IDENTITY giao việc sinh khoá chính cho cột identity hoặc auto-increment của cơ sở dữ liệu (AUTO_INCREMENT ở MySQL, IDENTITY ở SQL Server); provider phải chạy INSERT ngay để lấy khoá vừa sinh, nên Hibernate không gom lô các lệnh chèn được với chiến lược này. "To generate UUIDs." sai vì khoá UUID dùng GenerationType.UUID (có từ JPA 3.1) hoặc bộ sinh UUID riêng của Hibernate. "To generate primary keys using a sequence." mô tả GenerationType.SEQUENCE, dùng đối tượng sequence của cơ sở dữ liệu kèm @SequenceGenerator và cấp số trước khi INSERT. "To generate random numbers." sai vì không chiến lược sinh khoá nào của JPA tạo số ngẫu nhiên; IDENTITY tăng dần tuần tự.
A@ExceptionHandler methods handle exceptions across all controllers by default; @ControllerAdvice limits them to one controller
B@ExceptionHandler only works with REST controllers; @ControllerAdvice only with MVC controllers
C@ExceptionHandler in a controller handles exceptions for that controller; @ControllerAdvice can apply such handlers globally
DBoth are deprecated in favor of filters
Lời giải
Đáp án đúng: "@ExceptionHandler in a controller handles exceptions for that controller; @ControllerAdvice can apply such handlers globally". Phương thức @ExceptionHandler khai báo trong một controller chỉ bắt ngoại lệ ném ra từ các handler của chính controller đó; muốn dùng chung cho nhiều controller, ta đặt các phương thức @ExceptionHandler vào một lớp @ControllerAdvice hoặc @RestControllerAdvice, và mặc định lớp này áp cho mọi controller, có thể thu hẹp bằng basePackages hay assignableTypes. Phát biểu "handle exceptions across all controllers by default; @ControllerAdvice limits them to one controller" nói ngược hoàn toàn vai trò của hai annotation. Phát biểu "only works with REST controllers; @ControllerAdvice only with MVC controllers" sai vì cả hai dùng được cho controller trả view lẫn controller REST. "Both are deprecated in favor of filters" sai vì cả hai vẫn là cơ chế chính thức trong Spring hiện nay; filter chạy trước DispatcherServlet nên không thay được việc xử lý ngoại lệ ở tầng handler.
Đáp án đúng: "Maps GET requests to /list". @GetMapping là dạng rút gọn của @RequestMapping(method = RequestMethod.GET); đặt @GetMapping("/list") lên một phương thức trong controller nghĩa là DispatcherServlet sẽ chuyển mọi yêu cầu HTTP GET tới đường dẫn /list (cộng với tiền tố @RequestMapping ở cấp lớp nếu có) cho phương thức đó xử lý, thường để hiển thị danh sách. "Maps POST requests" là vai trò của @PostMapping, dùng khi gửi form hay tạo mới dữ liệu. "Denotes a view name" sai vì chuỗi /list là đường dẫn URL; tên view là giá trị phương thức trả về, chẳng hạn chuỗi product-list để ViewResolver tìm template. "Disables route" sai vì annotation này đăng ký thêm một route chứ không tắt route nào; Spring không có annotation mapping dùng để vô hiệu hoá đường dẫn.
ATo define a standard for web application development
BTo define a standard for object-relational mapping in Java
CTo manage user interfaces
DTo handle network communication
Lời giải
Đáp án đúng: "To define a standard for object-relational mapping in Java". Mục đích chính của JPA (Java Persistence API) là đưa ra một chuẩn chung cho ORM, tức ánh xạ đối tượng Java sang bảng quan hệ: đặc tả quy định annotation như @Entity, @Table, @Id, giao diện EntityManager, vòng đời thực thể và ngôn ngữ truy vấn JPQL, còn các nhà cung cấp như Hibernate hay EclipseLink hiện thực chuẩn đó, nên mã viết theo JPA có thể đổi nhà cung cấp mà ít phải sửa. "To define a standard for web application development" là phạm vi của Servlet, Jakarta EE web hay Spring MVC, không phải JPA. "To manage user interfaces" là việc của JavaFX, Swing hay tầng view. "To handle network communication" thuộc về socket, HTTP client hay RMI, không liên quan tới lưu trữ dữ liệu.
BTo map HTTP requests to specific controller methods.
CTo define user interfaces.
DTo configure application security.
Lời giải
Đáp án đúng: "To map HTTP requests to specific controller methods.". @RequestMapping khai báo URL, phương thức HTTP, tham số, header hay kiểu nội dung mà một lớp hoặc phương thức controller xử lý; khi khởi động, RequestMappingHandlerMapping quét các annotation này để lập bảng ánh xạ, và lúc chạy DispatcherServlet dùng bảng đó để chọn đúng phương thức. Các annotation @GetMapping, @PostMapping chỉ là dạng rút gọn của nó. "To define database connections." sai vì kết nối cơ sở dữ liệu cấu hình qua DataSource và các thuộc tính spring.datasource. "To define user interfaces." sai vì giao diện nằm ở template như Thymeleaf, còn annotation này chỉ định tuyến yêu cầu. "To configure application security." sai vì phân quyền theo URL được cấu hình trong SecurityFilterChain của Spring Security; @RequestMapping không kiểm tra ai được truy cập.
BTo offer a comprehensive infrastructure support for developing Java applications.
CTo create graphical user interfaces.
DTo manage operating system resources.
Lời giải
Đáp án đúng: "To offer a comprehensive infrastructure support for developing Java applications.". Spring Framework là nền tảng cung cấp hạ tầng toàn diện cho ứng dụng Java: lõi IoC container và Dependency Injection, AOP, quản lý giao dịch, truy cập dữ liệu, Spring MVC cho web, hỗ trợ kiểm thử; nhờ vậy lập trình viên tập trung vào logic nghiệp vụ còn phần hạ tầng lặp lại do framework lo. "To provide a database management system." sai vì Spring không phải hệ quản trị cơ sở dữ liệu, nó chỉ kết nối tới MySQL, PostgreSQL qua JDBC hay JPA. "To create graphical user interfaces." là việc của JavaFX hay Swing; Spring có thể đứng sau một ứng dụng giao diện nhưng không phải bộ công cụ vẽ giao diện. "To manage operating system resources." là việc của hệ điều hành, Spring chạy trên JVM và không quản lý tài nguyên hệ điều hành.
Đáp án đúng: "A join table.". Quan hệ nhiều nhiều không thể biểu diễn bằng một cột khoá ngoại ở bảng nào, vì mỗi dòng bên này ứng với nhiều dòng bên kia và ngược lại; JPA vì thế dùng một bảng nối (join table) chứa hai cột khoá ngoại trỏ tới khoá chính của hai entity, ví dụ bảng student_course gồm student_id và course_id, mô tả bằng @ManyToMany kèm @JoinTable với joinColumns và inverseJoinColumns. "The table of the first entity." không làm được vì một cột chỉ chứa một giá trị khoá ngoại, không lưu được nhiều liên kết cho cùng một dòng. "The table of the second entity." gặp đúng vấn đề đó theo chiều ngược lại. "A temporary table." chỉ tồn tại trong phiên làm việc hoặc giao dịch rồi biến mất, không giữ được quan hệ lâu dài.
DResolves "home" as a view name using ViewResolver
Lời giải
Đáp án đúng: "Resolves "home" as a view name using ViewResolver". Trong một @Controller thường, phương thức trả về String mà không có @ResponseBody thì chuỗi đó được hiểu là tên view logic; DispatcherServlet chuyển tên home cho ViewResolver, ví dụ ThymeleafViewResolver ghép tiền tố classpath:/templates/ và hậu tố .html để tìm template, rồi View mới render ra HTML. "Renders the "home.html" page directly" sai ở chữ trực tiếp: controller không tự mở tệp nào, mọi việc phải qua bước phân giải view, và tên tệp thật phụ thuộc cấu hình resolver. "Returns plain text "home"" chỉ đúng khi có @ResponseBody hoặc lớp là @RestController. "Redirects to "/home"" chỉ xảy ra khi chuỗi trả về có tiền tố redirect:, như redirect:/home.
Đáp án đúng: "Scene". Trong JavaFX, Scene là vùng chứa toàn bộ nội dung của scene graph (đồ thị cảnh): nó giữ một nút gốc, thường là một Pane, và mọi Button, Label, hình vẽ đều nằm dưới nút gốc đó. "Stage" là cửa sổ cấp cao nhất do hệ điều hành cung cấp; nó bao ngoài và chứa Scene qua setScene chứ không trực tiếp chứa các nút giao diện, đổi Scene là đổi toàn bộ nội dung trong cùng một cửa sổ. "Node" là lớp cơ sở của từng phần tử trong scene graph, mỗi node chỉ là một mảnh nội dung chứ không phải vùng chứa tất cả. "Pane" là một node bố cục có thể chứa các node con và hay được dùng làm nút gốc, nhưng nó chỉ chứa phần nội dung đặt trong nó và bản thân vẫn phải nằm trong một Scene mới hiển thị được.
Đáp án đúng: "A JPA implementation that simplifies ORM". Hibernate là framework ORM (Object Relational Mapping, ánh xạ đối tượng sang quan hệ) cho Java và là hiện thực JPA phổ biến nhất, cũng là persistence provider mặc định của Spring Boot khi dùng spring-boot-starter-data-jpa; nó ánh xạ lớp thực thể thành bảng, tự sinh SQL, quản lý persistence context, lazy loading và bộ đệm, giúp lập trình viên thao tác đối tượng thay vì viết JDBC thủ công. "A web templating engine" mô tả Thymeleaf hoặc FreeMarker, những công cụ sinh trang HTML. "A library for UI development" mô tả JavaFX hay Swing, không liên quan tầng dữ liệu. "A Java compiler extension" sai vì Hibernate là thư viện chạy lúc runtime, không mở rộng trình biên dịch; dù có công cụ sinh metamodel lúc biên dịch, đó không phải bản chất của nó.
AFinds entities where property is equal to String property, ordered by property descending.
BFinds entities where property is equal to String property, ordered by property ascending.
CFinds entities where property contains String property, ordered by property ascending.
DFinds entities where property is less than String property, ordered by property ascending.
Lời giải
Đáp án đúng: "Finds entities where property is equal to String property, ordered by property ascending.". Spring Data JPA phân tích tên phương thức để sinh truy vấn: tiền tố findBy mở phần điều kiện, Property không đi kèm từ khoá nào nên mặc định là phép so sánh bằng với tham số String property, còn OrderByPropertyAsc thêm mệnh đề sắp xếp tăng dần theo chính thuộc tính đó; truy vấn tương đương là WHERE property = ?1 ORDER BY property ASC, trả về List các entity. "Finds entities where property is equal to String property, ordered by property descending." sai ở chiều sắp xếp, vì Asc là tăng dần, muốn giảm dần phải viết Desc. "Finds entities where property contains String property, ordered by property ascending." cần từ khoá Containing trong tên, như findByPropertyContaining, để sinh LIKE có ký tự đại diện hai đầu. "Finds entities where property is less than String property, ordered by property ascending." cần từ khoá LessThan, như findByPropertyLessThan.
Đáp án đúng: "@Repository". @Repository là stereotype annotation (annotation khuôn mẫu) đánh dấu một lớp thuộc tầng truy cập dữ liệu: nó là một dạng @Component nên được component scan đăng ký thành bean, và còn được PersistenceExceptionTranslationPostProcessor bọc để dịch ngoại lệ riêng của JPA hay Hibernate thành DataAccessException thống nhất của Spring. "@Entity" là annotation của JPA đánh dấu lớp được ánh xạ sang bảng, tức lớp dữ liệu chứ không phải lớp repository. "@Service" đánh dấu lớp tầng nghiệp vụ, cũng là @Component nhưng không có cơ chế dịch ngoại lệ dữ liệu. "@Bean" không gắn lên lớp mà gắn lên phương thức trong lớp @Configuration để khai báo bean thủ công.
Đáp án đúng: "findByAgeGreaterThanOrderByLastNameAsc(int age)". Cú pháp derived query của Spring Data là tiền tố kết thúc bằng By, tiếp theo là điều kiện, rồi mệnh đề OrderBy kèm thuộc tính và Asc hoặc Desc ở cuối; tên này phân tích thành lọc age lớn hơn tham số và sắp theo lastName tăng dần. Tên này còn lọc thêm theo age chứ không chỉ sắp xếp, nhưng nó là tên duy nhất hợp lệ trong số được đưa ra vì OrderBy đứng sau điều kiện và có đủ chữ By, và kết quả vẫn sắp theo lastName tăng dần như câu hỏi yêu cầu. "findAllSortByLastNameAsc()" sai vì Sort không phải từ khoá: bộ phân tích coi LastNameAsc là điều kiện lọc theo thuộc tính lastNameAsc không tồn tại. "findByOrderLastNameAsc()" sai vì thiếu By sau Order nên OrderLastNameAsc bị coi là tên thuộc tính. "orderByLastNameAscFindAll()" sai vì không mở bằng tiền tố như find, và mệnh đề sắp xếp phải nằm cuối.