HSF302Chưa đoKỳ 5Tự chọn Cập nhật 23 giờ trước

HSF302 - Làm việc với Spring Framework

HSF302 - Làm việc với Spring Framework là môn 3 tín chỉ bậc cử nhân của Đại học FPT, học sau PRJ301. Vấn đề môn giải quyết là dựng một ứng dụng Java nhiều tầng mà không phải tự tay khởi tạo từng lớp rồi nối chúng với nhau. Điểm xuất phát là một yêu cầu HTTP: DispatcherServlet nhận nó, tìm phương thức controller khớp đường dẫn, gắn tham số vào đối số rồi trả về một trang hoặc một đối tượng JSON. Đằng sau controller là các đối tượng do IoC container tạo ra và tiêm vào nhau, nên lớp dịch vụ chỉ khai báo mình cần gì chứ không tự dựng phụ thuộc. Dữ liệu xuống cơ sở dữ liệu qua ánh xạ đối tượng–quan hệ: một lớp @Entity ứng với một bảng, quan hệ một-nhiều hay nhiều-nhiều được khai báo bằng annotation, và việc nạp dữ liệu liên quan sớm hay muộn định ra bao nhiêu câu truy vấn thật sự chạy. Trên lớp ánh xạ ấy, repository chỉ cần một interface, còn tên phương thức như findByEmail đủ để sinh truy vấn. Cùng lối tách giao diện khỏi dữ liệu được dùng lại cho ứng dụng máy tính để bàn, nơi cửa sổ, Scene và các điều khiển được dựng bằng mã Java hoặc tệp FXML. Spring Boot gom các mảnh đó bằng cấu hình tự động và các gói khởi động, để một dự án chạy được chỉ với một lớp main và vài dòng thuộc tính. Các khái niệm cần nắm chắc gồm th:each, bean, ObservableList, JpaRepository, Scene, Dependency Injection, @RestController và persistence context. Học xong, người học lần theo được đường đi của một yêu cầu qua các tầng, tự thiết kế lớp thực thể cùng quan hệ giữa chúng, viết controller trả trang Thymeleaf hoặc dữ liệu REST, chọn đúng phạm vi cho bean, và dựng một ứng dụng thêm, sửa, xoá có giao diện bằng JavaFX.

179Câu hỏi
5Bộ đề
9Chủ đề

Câu hỏi của môn

179/179 câuHết danh sách
ATo manage database connections.
BTo arrange UI elements within a container.
CTo handle network requests.
DTo manage application configurations.
Lời giải
Đáp án đúng: "To arrange UI elements within a container.". Layout pane của JavaFX như HBox, VBox, BorderPane, GridPane, StackPane, FlowPane là các node chứa, tự tính vị trí và kích thước của node con theo quy tắc riêng (hàng ngang, cột dọc, lưới, chồng lớp) và tự sắp xếp lại khi cửa sổ đổi kích thước, giúp không phải đặt toạ độ bằng tay. "To manage database connections." sai vì JavaFX là bộ công cụ giao diện, kết nối cơ sở dữ liệu thuộc JDBC hoặc JPA. "To handle network requests." sai vì giao tiếp mạng dùng HttpClient hay thư viện khác, không phải layout. "To manage application configurations." sai vì cấu hình ứng dụng nằm ở tệp properties hoặc lớp cấu hình riêng, layout không lưu cấu hình.
Mở trang câu hỏi này →
AHBox/VBox
BBorderPane
CGridPane
DStackPane
Lời giải
Đáp án đúng: "StackPane". StackPane xếp các node con chồng lên nhau theo trục z: node thêm sau nằm trên node thêm trước, và mặc định tất cả được căn giữa; cách này thường dùng để đặt chữ lên trên hình nền hoặc phủ một lớp lên nội dung. "HBox/VBox" xếp node thành một hàng ngang (HBox) hoặc một cột dọc (VBox), các node nằm cạnh nhau chứ không chồng. "BorderPane" chia vùng chứa thành năm vùng top, bottom, left, right, center, mỗi vùng một node. "GridPane" đặt node vào các ô của lưới hàng và cột như một bảng; về lý thuyết có thể đặt hai node cùng một ô để chúng chồng nhau, nhưng đó không phải mục đích của nó, còn StackPane được thiết kế đúng cho việc xếp chồng.
Mở trang câu hỏi này →
AIt's a controller method
BIt's a data access layer component
CIt's a view template
DIt's a security filter
Lời giải
Đáp án đúng: "It's a data access layer component". @Repository là stereotype annotation đánh dấu lớp thuộc tầng truy cập dữ liệu: nó được component scan đăng ký thành bean vì bản thân là một @Component, và Spring áp cơ chế dịch ngoại lệ, đổi lỗi riêng của JPA hay Hibernate sang DataAccessException; với interface kế thừa JpaRepository, Spring Data tự đăng ký bean nên annotation này thường không bắt buộc, nhưng ý nghĩa vẫn là thành phần tầng dữ liệu. "It's a controller method" sai vì phương thức xử lý yêu cầu được đánh dấu bằng @RequestMapping hoặc @GetMapping trong lớp @Controller. "It's a view template" sai vì template là tệp Thymeleaf hay JSP, không phải lớp Java gắn annotation. "It's a security filter" sai vì filter bảo mật thuộc Spring Security, cấu hình qua SecurityFilterChain.
Mở trang câu hỏi này →
AEnables Thymeleaf templating
BAutomatically configures beans based on dependencies
CAdds JSP support
DEnables Hibernate schema updates
Lời giải
Đáp án đúng: "Automatically configures beans based on dependencies". @EnableAutoConfiguration bật cơ chế tự cấu hình của Spring Boot: khi khởi động, Spring Boot nạp danh sách các lớp auto-configuration rồi áp dụng những lớp có điều kiện thoả mãn, dựa trên @ConditionalOnClass, @ConditionalOnMissingBean, @ConditionalOnProperty; ví dụ thấy spring-boot-starter-data-jpa và driver cơ sở dữ liệu trên classpath thì tự tạo DataSource, EntityManagerFactory, transaction manager, và lùi lại nếu ta đã tự khai báo bean đó. Annotation này nằm sẵn trong @SpringBootApplication. "Enables Thymeleaf templating" chỉ là một hệ quả có điều kiện: Thymeleaf được cấu hình khi có starter của nó, annotation không dành riêng cho Thymeleaf. "Adds JSP support" sai vì JSP cần thêm phụ thuộc và cấu hình riêng, Spring Boot còn khuyên tránh JSP khi chạy jar nhúng. "Enables Hibernate schema updates" là việc của thuộc tính spring.jpa.hibernate.ddl-auto, không phải của annotation này.
Mở trang câu hỏi này →
AManual configuration
BSimplified setup with auto-configuration
CMore XML files
DNo dependency management
Lời giải
Đáp án đúng: "Simplified setup with auto-configuration". Lợi ích chính của Spring Boot là dựng ứng dụng Spring nhanh: auto-configuration dựa vào thư viện có trên classpath để tự tạo bean hợp lý, starter gom phụ thuộc tương thích, kèm server nhúng nên chạy được bằng một tệp jar, và mọi mặc định đều ghi đè được qua application.properties. "Manual configuration" ngược lại mục tiêu của Boot; vẫn có thể cấu hình tay khi cần nhưng đó không phải lợi ích. "More XML files" sai vì Boot hướng tới cấu hình bằng Java và tệp thuộc tính, hầu như không cần XML. "No dependency management" sai vì Boot quản lý phiên bản phụ thuộc rất chặt qua BOM spring-boot-dependencies và parent POM, nên lập trình viên khỏi ghi phiên bản từng thư viện.
Mở trang câu hỏi này →
ASpringApplication → compile JPQL; Actuator → serve JSP; DevTools → manage database migrations
BCLI → container orchestration; Actuator → live code reload; Autoconfiguration → command scheduling
CAutoconfiguration → configure beans from classpath & properties; Actuator → health/metrics endpoints; DevTools → auto-restart & LiveReload
DStarter POMs → replace the need for Maven/Gradle; Embedded servers → remove HTTP support
Lời giải

Đáp án đúng: "Autoconfiguration → configure beans from classpath & properties; Actuator → health/metrics endpoints; DevTools → auto-restart & LiveReload". Auto-configuration xem thư viện có trên classpath và các thuộc tính trong application.properties để tự tạo bean phù hợp, ví dụ thấy Hibernate và DataSource thì dựng EntityManagerFactory; Actuator mở các endpoint giám sát như health, metrics, info; DevTools tự khởi động lại khi mã thay đổi và kích hoạt LiveReload cho trình duyệt, nên cả ba cặp đều khớp. "SpringApplication → compile JPQL; Actuator → serve JSP; DevTools → manage database migrations" sai cả ba: SpringApplication khởi động ứng dụng, JPQL do JPA provider dịch, Actuator không phục vụ JSP, còn migration là việc của Flyway hay Liquibase. "CLI → container orchestration; Actuator → live code reload; Autoconfiguration → command scheduling" sai vì Spring Boot CLI dùng để chạy nhanh script và tạo dự án chứ không điều phối container, nạp lại mã là việc của DevTools, còn lên lịch tác vụ dùng @Scheduled. "Starter POMs → replace the need for Maven/Gradle; Embedded servers → remove HTTP support" sai vì starter là gói phụ thuộc vẫn cần Maven hoặc Gradle để quản lý, còn máy chủ nhúng như Tomcat chính là thứ cung cấp HTTP.

Mở trang câu hỏi này →
ADispatcherServlet
BEntityManager
CJdbcTemplate
DApplicationContext
Lời giải
Đáp án đúng: "DispatcherServlet". Trong Spring Web MVC, DispatcherServlet là front controller (bộ điều khiển trung tâm) nhận mọi yêu cầu HTTP, hỏi HandlerMapping để tìm controller phù hợp, nhờ HandlerAdapter gọi phương thức, rồi dùng ViewResolver hoặc HttpMessageConverter để tạo phản hồi; Spring Boot tự đăng ký servlet này cho đường dẫn gốc. "EntityManager" là giao diện của JPA để thao tác thực thể với cơ sở dữ liệu, thuộc tầng dữ liệu chứ không nhận yêu cầu HTTP. "JdbcTemplate" là lớp tiện ích chạy câu lệnh SQL qua JDBC. "ApplicationContext" là IoC container chứa và quản lý mọi bean, kể cả DispatcherServlet, nhưng bản thân nó không xử lý yêu cầu HTTP.
Mở trang câu hỏi này →
Aem.detach(entity)
Bem.persist(entity)
Cem.clear()
Dem.flush()
Lời giải
Đáp án đúng: "em.persist(entity)". Entity ở trạng thái transient (tạm thời) là đối tượng vừa new, chưa gắn với persistence context và chưa có dòng tương ứng trong cơ sở dữ liệu; gọi persist trong một giao dịch sẽ đưa nó sang trạng thái managed, provider lên lịch câu INSERT và thực thi khi flush hoặc commit, còn khoá chính có thể được gán ngay nếu dùng chiến lược IDENTITY. "em.detach(entity)" làm ngược lại, tách một entity managed ra khỏi persistence context để nó thành detached. "em.clear()" tách toàn bộ entity đang được quản lý, xoá sạch persistence context. "em.flush()" chỉ đẩy các thay đổi đang chờ của entity đã managed xuống cơ sở dữ liệu; nó không đưa một đối tượng transient vào quản lý, nên entity mới tạo mà chưa persist sẽ không được ghi.
Mở trang câu hỏi này →
173What is JPQL primarily used for?4 lựa chọn
AQuerying entities and their relationships in an object-oriented way
BDefining database connection pools
CGenerating database schemas automatically from UML
DEncrypting fields before persistence
Lời giải
Đáp án đúng: "Querying entities and their relationships in an object-oriented way". JPQL (Java Persistence Query Language) là ngôn ngữ truy vấn của JPA viết trên tên lớp thực thể và thuộc tính chứ không trên tên bảng, cột, ví dụ SELECT s FROM Student s JOIN s.courses c. Persistence provider dịch nó sang SQL của từng cơ sở dữ liệu, và có thể đi theo quan hệ giữa các thực thể bằng dấu chấm hoặc JOIN. "Defining database connection pools" là việc của cấu hình DataSource và pool như HikariCP. "Generating database schemas automatically from UML" sai vì JPQL không đọc UML; việc sinh schema từ thực thể do provider làm qua thuộc tính như hibernate.hbm2ddl.auto, không liên quan JPQL. "Encrypting fields before persistence" thuộc AttributeConverter hoặc thư viện mã hoá, không phải ngôn ngữ truy vấn.
Mở trang câu hỏi này →
AReact.js
BAngular.js
CThymeleaf
DNode.js
Lời giải
Đáp án đúng: "Thymeleaf". Thymeleaf là template engine Java chạy phía máy chủ, tích hợp với Spring MVC qua ThymeleafViewResolver: controller trả tên view, Thymeleaf đọc tệp HTML có các thuộc tính như th:text, th:each, th:if rồi thay dữ liệu từ model vào để sinh trang hoàn chỉnh; ưu điểm là tệp mẫu vẫn là HTML hợp lệ, mở thẳng trên trình duyệt được (natural templating). "React.js" là thư viện giao diện JavaScript chạy phía trình duyệt, không phải template engine của Spring MVC; nó thường gọi REST API do Spring cung cấp. "Angular.js" là framework JavaScript phía client, cũng nằm ngoài cơ chế ViewResolver. "Node.js" là môi trường chạy JavaScript phía máy chủ, một nền tảng backend riêng chứ không phải công cụ dựng view trong ứng dụng Spring.
Mở trang câu hỏi này →
A@Component
B@Service
C@Entity
D@Controller
Lời giải
Đáp án đúng: "@Entity". Khi dùng Spring ORM với Hibernate qua JPA, @Entity đánh dấu một lớp Java là thực thể được ánh xạ sang một bảng trong cơ sở dữ liệu, mặc định trùng tên lớp, có thể đổi bằng @Table(name = ...); lớp phải có trường khoá chính gắn @Id và constructor không tham số để Hibernate tạo đối tượng khi nạp dữ liệu. "@Component" chỉ đánh dấu lớp là bean chung để component scan đăng ký vào IoC container, không ánh xạ bảng nào. "@Service" là một dạng @Component cho lớp tầng nghiệp vụ. "@Controller" đánh dấu lớp tầng web xử lý yêu cầu HTTP; cả ba đều là annotation quản lý bean của Spring chứ không phải annotation ánh xạ của JPA.
Mở trang câu hỏi này →
AA relational database bundled with the JDK
BA JPA implementation that replaces the specification
CAn abstraction on top of JPA providers that simplifies data access and reduces boilerplate
DA testing framework for JPQL queries only
Lời giải
Đáp án đúng: "An abstraction on top of JPA providers that simplifies data access and reduces boilerplate". Spring Data JPA không phải một JPA provider mà là lớp trừu tượng đặt trên JPA và provider như Hibernate: ta chỉ khai báo interface kế thừa JpaRepository, Spring sinh cài đặt lúc chạy với sẵn save, findById, findAll, delete, phân trang, sắp xếp, cộng truy vấn suy ra từ tên phương thức như findByEmail và @Query, giảm hẳn mã lặp khi làm việc với EntityManager. "A relational database bundled with the JDK" sai vì nó không phải cơ sở dữ liệu, JDK cũng không kèm hệ quản trị quan hệ nào; cơ sở dữ liệu như MySQL hay H2 là thành phần riêng. "A JPA implementation that replaces the specification" sai vì cài đặt JPA là việc của Hibernate hay EclipseLink, và Spring Data JPA dựa trên đặc tả chứ không thay thế nó. "A testing framework for JPQL queries only" sai vì nó dùng cho mã truy cập dữ liệu thật trong ứng dụng, còn kiểm thử là việc của JUnit cùng @DataJpaTest.
Mở trang câu hỏi này →
A@Column
B@Id
C@GeneratedValue
D@Table
Lời giải
Đáp án đúng: "@Table". Annotation @Table của JPA đặt trên lớp thực thể để chỉ định tên bảng qua thuộc tính name, kèm schema, catalog, uniqueConstraints và indexes; nếu không có, tên bảng mặc định suy ra từ tên thực thể, và Hibernate trong Spring Boot còn đổi tên đó sang dạng chữ thường nối gạch dưới. Ví dụ lớp Student muốn lưu vào bảng students thì đặt @Table với name là students. @Entity khai báo lớp là thực thể, còn @Table chỉ tinh chỉnh ánh xạ bảng. "@Column" đặt tên và cấu hình cho một cột, không phải cho bảng. "@Id" đánh dấu trường khoá chính. "@GeneratedValue" chỉ định cách sinh giá trị khoá chính như IDENTITY, SEQUENCE, AUTO, không liên quan tên bảng.
Mở trang câu hỏi này →
ANoSQL databases.
BRelational databases using the Java Persistence API (JPA).
CMessage queues.
DCloud storage.
Lời giải
Đáp án đúng: "Relational databases using the Java Persistence API (JPA).". Spring Data JPA là mô-đun của họ Spring Data dành cho cơ sở dữ liệu quan hệ: nó dựa trên JPA (đặc tả ánh xạ đối tượng – quan hệ của Java) và provider như Hibernate để ánh xạ entity sang bảng, rồi bổ sung repository tự sinh, truy vấn suy từ tên phương thức, phân trang và auditing, giảm mạnh mã truy cập dữ liệu lặp lại. "NoSQL databases." sai vì kho NoSQL có các mô-đun riêng như Spring Data MongoDB hay Spring Data Redis, không đi qua JPA. "Message queues." sai vì hàng đợi thông điệp dùng Spring AMQP, Spring for Apache Kafka hoặc JMS. "Cloud storage." sai vì lưu trữ đám mây như S3 dùng SDK của nhà cung cấp hoặc Spring Cloud AWS, nằm ngoài phạm vi Spring Data JPA.
Mở trang câu hỏi này →
AIt only supports relational databases via raw JDBC
BIt excludes JPA to encourage NoSQL usage
CIt offers seamless integration with relational databases, NoSQL stores, and JPA
DIt requires a custom driver for each vendor and does not integrate with Spring Data
Lời giải
Đáp án đúng: "It offers seamless integration with relational databases, NoSQL stores, and JPA". Spring Boot hỗ trợ truy cập dữ liệu rất rộng: có starter cho JDBC với JdbcTemplate, cho Data JPA với Hibernate, cho các kho NoSQL như MongoDB, Redis, Cassandra, và tự cấu hình DataSource, EntityManagerFactory hay client tương ứng dựa trên thư viện có trong classpath cùng thuộc tính trong application.properties, đều tích hợp với Spring Data. "It only supports relational databases via raw JDBC" sai vì ngoài JDBC thuần Spring Boot còn hỗ trợ JPA và NoSQL. "It excludes JPA to encourage NoSQL usage" sai vì JPA chính là một trong những lựa chọn chủ lực qua spring-boot-starter-data-jpa. "It requires a custom driver for each vendor and does not integrate with Spring Data" sai ở cả hai vế: Spring Boot dùng driver JDBC chuẩn của nhà cung cấp, thường tự nhận ra driver từ URL kết nối, và tích hợp chặt với Spring Data.
Mở trang câu hỏi này →