Danh sách câu hỏi của đề

Câu hỏi: HSF302 Làm việc với Spring Framework – Bộ ôn tập cuối kỳ số 1

50 câu trắc nghiệm kèm lời giải của môn HSF302 - Làm việc với Spring Framework, xếp đúng thứ tự trong đề.

Danh sách câu hỏi

20/50 câuCòn 30
ABy querying the Student entity with a join on the Course entity.
BBy querying the join table directly.
CBy querying the Course entity and accessing its students collection.
DBy querying the Student entity and filtering based on the course ID in the Student table.
Lời giải
Đáp án đúng: "By querying the Student entity with a join on the Course entity.". Trong JPA, quan hệ Many-to-Many được ánh xạ thành thuộc tính tập hợp, chẳng hạn Student có courses, nên truy vấn JPQL (Java Persistence Query Language, ngôn ngữ truy vấn trên thực thể) điển hình là SELECT s FROM Student s JOIN s.courses c WHERE c.id = :courseId, lấy đúng tập sinh viên cần trong một câu truy vấn. Phương án "By querying the Course entity and accessing its students collection." cũng lấy được dữ liệu, nhưng đó là nạp một Course rồi duyệt quan hệ (thường kích hoạt lazy loading thêm một truy vấn) chứ không phải dựng một truy vấn JPA lọc sinh viên, nên không phải cách cấu trúc truy vấn được hỏi. "By querying the join table directly." sai vì bảng nối không phải thực thể, JPQL không truy vấn được nó trừ khi viết SQL thuần, làm mất lợi ích của ORM. "By querying the Student entity and filtering based on the course ID in the Student table." sai vì với Many-to-Many, bảng Student không có cột course ID; khoá ngoại nằm ở bảng nối.
Mở trang câu hỏi này →
AJava VM
BSpring IoC Container
CJDBC Driver
DREST Controller
Lời giải
Đáp án đúng: "Spring IoC Container". Trong Spring, bean là đối tượng do IoC container (vùng chứa đảo ngược điều khiển), cụ thể là BeanFactory và ApplicationContext, tạo ra, tiêm phụ thuộc, gọi các callback khởi tạo, quản lý phạm vi (scope) và huỷ khi đóng ngữ cảnh; mã ứng dụng không tự new các đối tượng đó mà nhận chúng từ container. "Java VM" là máy ảo chạy bytecode và cấp phát bộ nhớ cho mọi đối tượng Java, nhưng nó không biết gì về định nghĩa bean, quan hệ phụ thuộc hay vòng đời theo cấu hình Spring. "JDBC Driver" chỉ là trình điều khiển giúp mã Java nói chuyện với một hệ quản trị cơ sở dữ liệu cụ thể. "REST Controller" là một loại bean xử lý yêu cầu HTTP, tức là đối tượng được container quản lý chứ không phải thứ quản lý các bean khác.
Mở trang câu hỏi này →
3Consider the following Java code snippet:4 lựa chọncó code
Đề bài
public class MyService {
    private MyDependency dependency;

    public void setDependency(MyDependency dependency) {
        this.dependency = dependency;
    }

    public void performAction() {
        dependency.doSomething();
    }
}

Which Spring Core Container feature is being demonstrated in this code?

AAspect-Oriented Programming (AOP)
BDependency Injection (DI)
CResource Management
DEvent Handling
Lời giải
Đáp án đúng: "Dependency Injection (DI)". Lớp MyService không tự tạo MyDependency bằng new mà khai báo một setter setDependency để bên ngoài truyền đối tượng phụ thuộc vào; đây chính là setter injection, một dạng Dependency Injection (tiêm phụ thuộc), tính năng cốt lõi của Spring Core Container: IoC container tạo bean MyDependency rồi gọi setter để gắn nó vào MyService, nhờ vậy performAction chỉ việc gọi dependency.doSomething() mà không quan tâm đối tượng được tạo ở đâu. "Aspect-Oriented Programming (AOP)" là lập trình hướng khía cạnh, dùng để tách các mối quan tâm cắt ngang như log hay transaction bằng advice và pointcut, trong mã không có thứ gì như vậy. "Resource Management" nói về việc nạp và giải phóng tài nguyên như tệp, kết nối qua Resource hay ResourceLoader, không phải chuyện gắn đối tượng phụ thuộc. "Event Handling" là cơ chế phát và lắng nghe sự kiện qua ApplicationEvent và ApplicationListener, đoạn mã không phát hay nhận sự kiện nào.
Mở trang câu hỏi này →
ASetter Injection
BField Injection
CConstructor Injection
DMethod Injection
Lời giải
Đáp án đúng: "Constructor Injection". Constructor Injection (tiêm phụ thuộc qua hàm khởi tạo) là cách container Spring truyền các đối tượng phụ thuộc vào tham số của constructor khi tạo bean, nhờ đó trường có thể khai báo final, đối tượng luôn ở trạng thái đầy đủ ngay khi sinh ra và dễ viết unit test vì có thể tự new với mock; từ Spring 4.3, lớp chỉ có một constructor thì không cần ghi @Autowired. "Setter Injection" truyền phụ thuộc qua phương thức setter sau khi đối tượng đã được tạo, phù hợp với phụ thuộc tuỳ chọn chứ không đi qua constructor. "Field Injection" đặt @Autowired thẳng lên trường và Spring gán giá trị bằng reflection, không có tham số khởi tạo nào. "Method Injection" là kỹ thuật Spring ghi đè một phương thức (lookup method, @Lookup) để mỗi lần gọi trả về một bean mới, thường dùng khi bean singleton cần bean prototype, cũng không liên quan tới constructor.
Mở trang câu hỏi này →
A@OneToOne
B@ManyToOne
C@OneToMany
D@ManyToMany
Lời giải
Đáp án đúng: "@ManyToMany". Annotation @ManyToMany của đặc tả JPA đánh dấu một thuộc tính tập hợp mà mỗi phía có thể liên kết với nhiều bản ghi của phía kia, ví dụ một sinh viên học nhiều khoá học và một khoá học có nhiều sinh viên; quan hệ này được lưu qua một bảng nối (join table), có thể đặt tên và cột bằng @JoinTable ở phía sở hữu, phía còn lại dùng mappedBy. "@OneToOne" chỉ dùng khi mỗi thực thể gắn với đúng một thực thể kia, như người dùng và hồ sơ cá nhân. "@ManyToOne" mô tả phía nhiều trỏ về một, như nhiều đơn hàng thuộc một khách hàng, khoá ngoại nằm trên bảng phía nhiều. "@OneToMany" là chiều ngược lại của quan hệ đó, một khách hàng có nhiều đơn hàng, nhưng mỗi đơn hàng vẫn chỉ thuộc một khách hàng nên không diễn tả được quan hệ nhiều-nhiều.
Mở trang câu hỏi này →
AAfter
BAfterReturning
CBefore
DAround
Lời giải
Đáp án đúng: "Before". Trong AOP (lập trình hướng khía cạnh) của Spring, advice là đoạn mã được chèn vào tại một join point (điểm nối, với Spring AOP là lời gọi phương thức); advice loại Before, khai báo bằng @Before, chạy trước khi phương thức đích thực thi và không chặn được lời gọi trừ khi ném ngoại lệ. "After" (@After) chạy sau khi phương thức kết thúc bất kể trả về bình thường hay ném ngoại lệ, giống khối finally. "AfterReturning" (@AfterReturning) chỉ chạy sau khi phương thức trả về thành công và có thể đọc giá trị trả về. "Around" (@Around) bao quanh join point, có thể chạy mã cả trước lẫn sau và tự quyết định có gọi proceed() hay không; nó làm được việc chạy trước nhưng không phải loại advice được định nghĩa riêng cho thời điểm trước join point.
Mở trang câu hỏi này →
ALabel
BButton
CTextField
DImageView
Lời giải
Đáp án đúng: "TextField". Trong JavaFX, TextField là control (thành phần điều khiển) cho phép người dùng gõ một dòng văn bản; chương trình đọc nội dung bằng getText() và đặt nội dung bằng setText(), còn khi cần nhập nhiều dòng thì dùng TextArea, nhập mật khẩu thì dùng PasswordField, đều là họ hàng của TextInputControl. "Label" chỉ hiển thị một đoạn chữ tĩnh, người dùng không gõ vào được, thường đặt cạnh ô nhập để làm nhãn. "Button" là nút bấm, nhận thao tác nhấn và phát ActionEvent chứ không nhận văn bản gõ vào. "ImageView" dùng để hiển thị một đối tượng Image như ảnh PNG hay JPG trên giao diện, hoàn toàn không có chức năng nhập liệu.
Mở trang câu hỏi này →
AScene scene = new Scene(new Button("Click Me"));
BStage stage = new Stage(new Button("Click Me"));
CButton button = new Button("Click Me");
DNode node = new Node(new Button("Click Me"));
Lời giải

Đáp án đúng: "Scene scene = new Scene(new Button("Click Me")); ". Trong JavaFX, Scene là vùng chứa toàn bộ đồ thị nút (scene graph) và constructor của nó nhận một Parent làm nút gốc; Button kế thừa Control, Control kế thừa Region rồi Parent, nên truyền thẳng một Button vào constructor của Scene là hợp lệ và nút đó trở thành gốc của cảnh, tức đã được đưa vào scene. "Stage stage = new Stage(new Button("Click Me")); " không biên dịch được vì Stage là cửa sổ, chỉ có constructor rỗng hoặc nhận StageStyle, và nội dung được gắn vào Stage qua setScene chứ không phải qua một nút. "Button button = new Button("Click Me"); " chỉ tạo ra đối tượng nút trong bộ nhớ, chưa gắn vào layout hay Scene nào nên chưa hiện lên màn hình. "Node node = new Node(new Button("Click Me")); " sai vì Node là lớp trừu tượng, không thể new trực tiếp và cũng không có constructor nhận một nút con.

Mở trang câu hỏi này →
A<fxml controller="MyController" />
B<fx:controller type="MyController" />
C<fx:controller fx:id="controller" value="MyController" />
D<fx:controller value="MyController" />
Lời giải

Đáp án đúng: "<fx:controller fx:id="controller" value="MyController" />". Cần nói thẳng: trong FXML thật không có phần tử nào tên fx:controller; controller được gắn bằng thuộc tính fx:controller đặt trên phần tử gốc của tệp, ví dụ <VBox fx:controller="com.foo.MyController">, rồi FXMLLoader tạo đối tượng lớp đó và tiêm các trường @FXML theo fx:id. Vì vậy cả bốn phương án đều không phải cú pháp chạy được, và đáp án ở đây được giữ theo khoá của đề chứ không có căn cứ kỹ thuật nào để xếp nó trên phương án chỉ có value: cả hai cùng mang ý khai báo lớp controller MyController qua tên fx:controller, còn thuộc tính fx:id thêm vào không đóng vai trò gì trong việc gắn controller, nó chỉ đặt định danh cho một phần tử. "<fxml controller="MyController" /> " sai vì FXML không có thẻ fxml, và controller ở đây thiếu tiền tố fx. "<fx:controller type="MyController" />" sai vì type không phải thuộc tính dùng để gắn controller. "<fx:controller value="MyController" />" cũng sai cú pháp y như vậy vì vẫn dùng một phần tử fx:controller không tồn tại.

Mở trang câu hỏi này →
ATo define database connections.
BTo initialize and show the application window.
CTo handle network requests.
DTo manage application configurations.
Lời giải
Đáp án đúng: "To initialize and show the application window.". Khi một ứng dụng JavaFX khởi chạy, runtime gọi init() rồi gọi start(Stage primaryStage) trên luồng JavaFX Application Thread, truyền vào primaryStage là cửa sổ chính do nền tảng tạo sẵn; trong start, lập trình viên dựng scene graph, gắn Scene vào Stage, đặt tiêu đề rồi gọi primaryStage.show() để cửa sổ hiện ra. "To define database connections." sai vì kết nối cơ sở dữ liệu thuộc tầng truy cập dữ liệu, không phải nhiệm vụ của phương thức vòng đời này, và mở kết nối nặng trong start còn làm treo giao diện. "To handle network requests." sai vì JavaFX không định tuyến yêu cầu mạng qua start; việc đó nên chạy trong Task hoặc luồng nền. "To manage application configurations." sai vì cấu hình thường đọc từ tệp hoặc tham số qua getParameters(), có thể làm trong init(), còn mục đích cốt lõi của start là dựng và hiển thị cửa sổ.
Mở trang câu hỏi này →
11Which method launches a JavaFX app?4 lựa chọn
Amain()
Bstart()
Claunch()
Drun()
Lời giải
Đáp án đúng: "launch()". Phương thức tĩnh Application.launch() là thứ khởi động một ứng dụng JavaFX: nó dựng runtime JavaFX, tạo một thể hiện của lớp con Application, gọi init() rồi gọi start(Stage) trên luồng JavaFX Application Thread với Stage chính đã được tạo sẵn, và chỉ trả về khi ứng dụng thoát. "main()" là điểm vào của JVM; trong ứng dụng JavaFX, main thường chỉ có một dòng gọi launch(args), tự nó không khởi động bộ công cụ đồ hoạ. "start()" là phương thức trừu tượng mà lập trình viên ghi đè để dựng Scene, nó được runtime gọi sau khi launch chạy chứ người lập trình không gọi trực tiếp để khởi động ứng dụng. "run()" là phương thức của Runnable hay Thread, dùng cho luồng thông thường hoặc Platform.runLater, không phải cách khởi chạy ứng dụng JavaFX.
Mở trang câu hỏi này →
ATo manage database connections.
BTo process user requests and return a model and view.
CTo define user interfaces.
DTo configure application security.
Lời giải
Đáp án đúng: "To process user requests and return a model and view.". Trong Spring MVC, DispatcherServlet nhận yêu cầu HTTP rồi chuyển cho phương thức xử lý (handler) nằm trong lớp gắn @Controller; phương thức này đọc tham số, gọi tầng service, đặt dữ liệu vào Model và trả về tên view logic (hoặc một ModelAndView) để ViewResolver tìm template hiển thị, đúng vai trò bộ điều khiển trong mô hình Model–View–Controller. "To manage database connections." là việc của DataSource và bể kết nối như HikariCP, controller chỉ gọi gián tiếp qua service và repository. "To define user interfaces." thuộc về tầng View, tức các template Thymeleaf hay JSP, controller không mô tả giao diện. "To configure application security." do Spring Security đảm nhận qua chuỗi filter và bean cấu hình SecurityFilterChain, chạy trước khi yêu cầu tới controller.
Mở trang câu hỏi này →
AIt tightly couples the components
BIt reduces testability of code
CIt promotes loose coupling between components
DIt is required only for web apps
Lời giải
Đáp án đúng: "It promotes loose coupling between components". Dependency Injection (tiêm phụ thuộc) nghĩa là đối tượng không tự new các phụ thuộc mà được IoC container của Spring đưa vào qua constructor, setter hoặc trường; lớp chỉ phụ thuộc vào interface nên có thể thay hiện thực khác mà không sửa mã, đó chính là liên kết lỏng (loose coupling). "It tightly couples the components" nói ngược bản chất, liên kết chặt là tình trạng lớp tự tạo phụ thuộc cụ thể, thứ DI loại bỏ. "It reduces testability of code" cũng ngược lại: nhờ phụ thuộc được truyền từ ngoài, khi kiểm thử đơn vị ta dễ đưa vào mock hoặc stub thay cho cơ sở dữ liệu hay dịch vụ thật. "It is required only for web apps" sai vì DI là cơ chế của Spring Core, dùng cho mọi loại ứng dụng từ ứng dụng dòng lệnh, ứng dụng desktop tới dịch vụ web, và không phải yêu cầu riêng của ứng dụng web.
Mở trang câu hỏi này →
A@PathVariable binds a query parameter; @RequestParam binds a URI template variable
B@PathVariable binds a URI template variable; @RequestParam binds a query parameter or form field
CBoth only bind data from HTTP headers
DBoth require a ModelAndView return type
Lời giải
Đáp án đúng: "@PathVariable binds a URI template variable; @RequestParam binds a query parameter or form field". Với ánh xạ @GetMapping("/users/{id}"), @PathVariable lấy giá trị của biến mẫu id nằm ngay trong đường dẫn, ví dụ /users/42 cho id bằng 42; còn @RequestParam đọc tham số truy vấn sau dấu hỏi như /users?page=2, và với Servlet API thì cũng đọc được trường của form gửi lên dạng application/x-www-form-urlencoded. "@PathVariable binds a query parameter; @RequestParam binds a URI template variable" đảo ngược đúng hai vai trò này. "Both only bind data from HTTP headers" sai vì đọc header là việc của @RequestHeader, còn hai annotation được hỏi đọc dữ liệu từ URI và tham số yêu cầu. "Both require a ModelAndView return type" sai vì kiểu trả về của phương thức xử lý độc lập với cách gắn tham số: có thể trả String tên view, đối tượng được chuyển thành JSON trong @RestController, ResponseEntity hay void.
Mở trang câu hỏi này →
Đề bài
public class AppStarter {
  public static void main(String[] args) {
    SpringApplication.run(AppStarter.class, args);
  }
}
A@SpringBoot
B@App
C@SpringApplication
D@SpringBootApplication
Lời giải
Đáp án đúng: "@SpringBootApplication". Annotation này đánh dấu lớp chính của ứng dụng Spring Boot và là annotation gộp của ba thứ: @SpringBootConfiguration (lớp là nguồn cấu hình), @EnableAutoConfiguration (bật tự cấu hình dựa trên thư viện có trong classpath) và @ComponentScan (quét bean trong gói của lớp và các gói con); phương thức main gọi SpringApplication.run(AppStarter.class, args) để dựng ApplicationContext và khởi động server nhúng. "@SpringBoot" không phải annotation có thật trong Spring Boot, chỉ là tên rút gọn gây nhầm. "@App" cũng không tồn tại trong Spring. "@SpringApplication" dễ nhầm nhất vì SpringApplication đúng là có thật, nhưng đó là một lớp với phương thức tĩnh run dùng trong main, không phải annotation để gắn lên lớp.
Mở trang câu hỏi này →
16Which object holds model data?4 lựa chọn
AModel
BEntity
CView
DContext
Lời giải
Đáp án đúng: "Model". Trong Spring MVC, phương thức controller có thể khai báo tham số kiểu Model (org.springframework.ui.Model) rồi gọi addAttribute để đặt dữ liệu; sau khi phương thức trả về tên view, DispatcherServlet chuyển các thuộc tính này cho template, nên Thymeleaf đọc được chúng bằng biểu thức như ${products}. Model vì thế là đối tượng giữ dữ liệu đi từ controller sang view. "Entity" là lớp gắn @Entity ánh xạ tới bảng trong cơ sở dữ liệu; một entity có thể được đặt vào Model như một thuộc tính, nhưng bản thân nó là dữ liệu nghiệp vụ chứ không phải nơi chứa dữ liệu cho view. "View" là thành phần hiển thị, nó đọc dữ liệu từ model chứ không giữ dữ liệu. "Context" gợi tới ApplicationContext, tức container IoC quản lý bean, không phải chỗ truyền dữ liệu của một yêu cầu tới giao diện.
Mở trang câu hỏi này →
ARepository layer
BService layer
CController layer
DView layer
Lời giải
Đáp án đúng: "Service layer". Trong kiến trúc phân lớp thường dùng với Spring, lớp dịch vụ đánh dấu bằng @Service chứa logic nghiệp vụ: kiểm tra quy tắc, tính toán, phối hợp nhiều repository và thường là nơi đặt ranh giới giao dịch @Transactional. "Repository layer" chỉ lo truy cập dữ liệu như lưu, tìm, xoá thực thể qua JpaRepository, không nên chứa quy tắc nghiệp vụ. "Controller layer" nhận yêu cầu HTTP, đọc tham số, gọi service rồi trả về view hoặc dữ liệu; nhồi logic nghiệp vụ vào đây làm controller phình to và khó tái sử dụng. "View layer" chỉ hiển thị dữ liệu cho người dùng, ví dụ trang Thymeleaf, không quyết định nghiệp vụ. Tách như vậy giúp mỗi lớp có một trách nhiệm và kiểm thử riêng được.
Mở trang câu hỏi này →
ASpring Boot DevTools
BSpring Boot Actuator
CSpringApplication
DSpring Boot Test
Lời giải
Đáp án đúng: "Spring Boot DevTools". Thêm phụ thuộc spring-boot-devtools vào dự án thì khi tệp trên classpath thay đổi, ứng dụng tự khởi động lại nhanh nhờ hai classloader (một giữ thư viện bên thứ ba không đổi, một nạp lại mã của dự án), đồng thời DevTools chạy một máy chủ LiveReload để trình duyệt tự làm mới khi tài nguyên đổi; nó còn tắt bộ nhớ đệm template khi phát triển và tự vô hiệu khi chạy bản đóng gói production. "Spring Boot Actuator" cung cấp các endpoint giám sát như health, metrics, info cho ứng dụng đang chạy, không nạp lại mã. "SpringApplication" là lớp khởi động ứng dụng qua SpringApplication.run, tạo ApplicationContext, không theo dõi thay đổi tệp. "Spring Boot Test" cung cấp công cụ kiểm thử như @SpringBootTest, JUnit, Mockito, phục vụ viết test chứ không tăng tốc vòng sửa mã và xem kết quả.
Mở trang câu hỏi này →
AThey require separate installation and configuration.
BThey simplify deployment and reduce the need for external application servers.
CThey offer limited performance compared to external servers.
DThey are only compatible with specific operating systems.
Lời giải
Đáp án đúng: "They simplify deployment and reduce the need for external application servers.". Spring Boot đóng gói sẵn server nhúng (embedded server) như Tomcat, Jetty hoặc Undertow vào ứng dụng, nên toàn bộ ứng dụng thành một tệp jar chạy được bằng java -jar, không phải cài Tomcat riêng rồi triển khai tệp war vào đó; cấu hình cổng hay đường dẫn chỉ cần sửa trong application.properties, rất hợp với container và microservice. "They require separate installation and configuration." nói ngược lại bản chất, vì server nhúng đi kèm như một dependency, không cần cài đặt riêng. "They offer limited performance compared to external servers." sai vì server nhúng chính là Tomcat, Jetty hay Undertow thật, hiệu năng tương đương bản cài ngoài. "They are only compatible with specific operating systems." sai vì server nhúng là thư viện Java, chạy trên mọi hệ điều hành có JVM.
Mở trang câu hỏi này →
AHard-coding all configuration inside Java classes
BPacking configuration into compiled bytecode for security
CSupplying settings (e.g., database details) via properties/YAML and environment so the same build can run in different environments
DRequiring a separate XML file for every bean definition
Lời giải
Đáp án đúng: "Supplying settings (e.g., database details) via properties/YAML and environment so the same build can run in different environments". Externalized configuration (cấu hình đặt bên ngoài mã) nghĩa là Spring Boot đọc giá trị cấu hình từ nhiều nguồn có thứ tự ưu tiên như application.properties hoặc application.yml, tệp theo profile kiểu application-prod.yml, biến môi trường và tham số dòng lệnh, rồi đưa vào bean qua @Value hoặc @ConfigurationProperties; nhờ vậy cùng một tệp jar có thể chạy ở môi trường dev, test hay production chỉ bằng cách đổi URL cơ sở dữ liệu, mật khẩu hay cổng mà không biên dịch lại. "Hard-coding all configuration inside Java classes" đi ngược hẳn ý tưởng này, vì mọi thay đổi đều buộc sửa mã và build lại. "Packing configuration into compiled bytecode for security" cũng là gắn chết cấu hình vào bản build, đồng thời không mang lại bảo mật thật; bí mật nên để ở biến môi trường hoặc kho bí mật. "Requiring a separate XML file for every bean definition" mô tả kiểu khai báo bean bằng XML thời Spring cũ, là chuyện định nghĩa bean chứ không phải tách giá trị cấu hình ra khỏi bản build, và Spring Boot vốn hướng tới giảm XML.
Mở trang câu hỏi này →