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ố 2

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 đề. Trang 3/3 — câu 41–50.

Danh sách câu hỏi

50/50 câuHết danh sách
Aapplication.properties
Bdispatcher-servlet.xml
Cweb.xml
Dconfig.xml
Lời giải
Đáp án đúng: "web.xml". Trong ứng dụng Spring MVC kiểu truyền thống triển khai dạng war, DispatcherServlet được khai báo và ánh xạ trong tệp mô tả triển khai WEB-INF/web.xml bằng thẻ servlet và servlet-mapping, kèm init-param contextConfigLocation trỏ tới tệp cấu hình bean. "dispatcher-servlet.xml" là điểm dễ gây tranh cãi vì tên nó gợi tới DispatcherServlet, nhưng đó là tệp chứa định nghĩa bean cho ngữ cảnh web riêng của servlet như controller và ViewResolver, theo quy ước tên servlet cộng -servlet.xml, chứ không phải nơi khai báo servlet; servlet phải có trong web.xml thì tệp này mới được nạp. "application.properties" là tệp cấu hình của Spring Boot, mà Spring Boot tự đăng ký DispatcherServlet nên không cần cả web.xml lẫn dispatcher-servlet.xml. "config.xml" không phải tên tệp chuẩn nào của Spring MVC.
Mở trang câu hỏi này →
A@Autowired
B@Transactional
C@Service
D@Entity
Lời giải
Đáp án đúng: "@Transactional". @Transactional đặt trên lớp hoặc phương thức để Spring bọc lời gọi trong một giao dịch: proxy AOP mở giao dịch qua PlatformTransactionManager trước khi chạy phương thức, commit nếu kết thúc bình thường và rollback nếu ném RuntimeException hay Error; có thể chỉnh propagation, isolation, readOnly, timeout, rollbackFor. Lưu ý lời gọi từ chính bên trong cùng lớp không đi qua proxy nên không được áp giao dịch. "@Autowired" chỉ tiêm phụ thuộc vào bean. "@Service" đánh dấu bean tầng nghiệp vụ; tầng này thường là nơi đặt @Transactional nhưng bản thân annotation đó không mở giao dịch nào. "@Entity" đánh dấu lớp được JPA ánh xạ tới bảng, mô tả dữ liệu chứ không điều khiển giao dịch.
Mở trang câu hỏi này →
Đề bài
public String sayHello() {
    return "Hello, Spring!";
}
AA view named "Hello, Spring!"
BA JSON response
CA plain text response: Hello, Spring!
DAn HTML file from the templates directory
Lời giải
Đáp án đúng: "A plain text response: Hello, Spring!". Lần theo mã: @GetMapping với đường dẫn /hello ánh xạ yêu cầu GET /hello vào phương thức sayHello, và @ResponseBody báo Spring MVC ghi giá trị trả về thẳng vào thân phản hồi thay vì coi nó là tên view; giá trị kiểu String được StringHttpMessageConverter ghi nguyên văn, nên trình duyệt hiện đúng chuỗi Hello, Spring! dưới dạng văn bản. "A view named "Hello, Spring!"" chỉ xảy ra khi bỏ @ResponseBody, lúc đó chuỗi trả về mới được ViewResolver hiểu là tên view. "A JSON response" sai vì với kiểu String, converter chuỗi được ưu tiên trước Jackson nên chuỗi không bị bọc thành JSON. "An HTML file from the templates directory" sai vì không có view nào được phân giải, thư mục templates chỉ được dùng khi trả về tên view mà không có @ResponseBody.
Mở trang câu hỏi này →
ATo manage database connections.
BTo ensure the correctness of individual components.
CTo define user interfaces.
DTo configure application security.
Lời giải
Đáp án đúng: "To ensure the correctness of individual components.". Unit test (kiểm thử đơn vị) kiểm từng thành phần nhỏ như một phương thức service hay một lớp tiện ích một cách cô lập: các phụ thuộc như repository được thay bằng đối tượng giả (mock) qua Mockito, rồi so kết quả với kỳ vọng bằng JUnit; nhờ constructor injection, có thể tự tạo lớp cần kiểm và truyền mock vào mà không cần khởi động cả Spring context, giúp phát hiện lỗi sớm và tự tin khi sửa mã. "To manage database connections." sai vì quản lý kết nối là việc của DataSource và connection pool, còn unit test thường cố tình không chạm cơ sở dữ liệu thật. "To define user interfaces." sai vì giao diện được định nghĩa bằng template hoặc mã view; test chỉ kiểm hành vi. "To configure application security." sai vì bảo mật được cấu hình bằng Spring Security; test có thể kiểm cấu hình ấy hoạt động đúng nhưng không phải nơi cấu hình nó.
Mở trang câu hỏi này →
AAutomatic repository implementation generation.
BSupport for JavaScript front-end development.
CBuilt-in load balancing.
DReal-time video streaming.
Lời giải
Đáp án đúng: "Automatic repository implementation generation.". Điểm mạnh then chốt của Spring Data JPA là lập trình viên chỉ cần khai báo một interface kế thừa JpaRepository hay CrudRepository, Spring tự sinh lớp hiện thực lúc chạy, có sẵn save, findById, findAll, delete, và còn tự suy câu truy vấn từ tên phương thức như findByEmail hay findByAgeGreaterThan, nhờ vậy gần như không phải viết DAO thủ công. "Support for JavaScript front-end development." không thuộc phạm vi Spring Data JPA, đây là thư viện truy cập dữ liệu phía server. "Built-in load balancing." là việc của hạ tầng như Spring Cloud LoadBalancer hay bộ cân bằng tải, không phải tầng repository. "Real-time video streaming." hoàn toàn không liên quan tới truy cập cơ sở dữ liệu quan hệ.
Mở trang câu hỏi này →
ATo manage application configurations.
BTo manage persistent entities.
CTo handle user authentication.
DTo create user interfaces.
Lời giải
Đáp án đúng: "To manage persistent entities.". EntityManager là giao diện JPA gắn với một persistence context, tập các entity đang ở trạng thái managed; nó cung cấp persist, find, merge, remove, refresh, detach, flush và createQuery, đồng thời theo dõi thay đổi trên các entity managed để tự đồng bộ xuống cơ sở dữ liệu khi flush hoặc commit giao dịch. Trong Spring, EntityManager được tiêm bằng @PersistenceContext và các repository của Spring Data JPA cũng gọi nó bên dưới. "To manage application configurations." là việc của Environment và cơ chế properties của Spring Boot. "To handle user authentication." là việc của Spring Security với AuthenticationManager. "To create user interfaces." thuộc tầng hiển thị như Thymeleaf hay JavaFX, không phải tầng lưu trữ.
Mở trang câu hỏi này →
AReduced boilerplate code for data access.
BEnhanced security for front-end applications.
CSimplified network configuration.
DImproved performance for video encoding.
Lời giải
Đáp án đúng: "Reduced boilerplate code for data access.". Spring Data JPA cho phép chỉ khai báo một interface kế thừa JpaRepository, Spring tự sinh hiện thực lúc chạy với sẵn các thao tác CRUD, phân trang, sắp xếp, còn suy ra truy vấn từ tên phương thức như findByEmail hoặc nhận JPQL qua @Query; nhờ vậy bỏ được phần lớn mã lặp lại (boilerplate) như tự viết DAO, gọi EntityManager, dựng truy vấn. "Enhanced security for front-end applications." sai vì bảo mật thuộc Spring Security, và Spring Data JPA chạy ở phía server, không liên quan giao diện front-end. "Simplified network configuration." sai vì nó không cấu hình mạng; kết nối cơ sở dữ liệu vẫn do DataSource đảm nhận. "Improved performance for video encoding." hoàn toàn ngoài phạm vi, Spring Data JPA chỉ lo truy cập dữ liệu qua JPA.
Mở trang câu hỏi này →
AfindAllSortByLastNameAsc()
BfindByOrderLastNameAsc()
CfindByAgeGreaterThanOrderByLastNameAsc(int age)
DorderByLastNameAscFindAll()
Lời giải
Đá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.
Mở trang câu hỏi này →
A@Repository
B@Entity
C@Service
D@Bean
Lời giải
Đá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.
Mở trang câu hỏi này →
Đề bài
List<Entity> findByPropertyOrderByPropertyAsc(String property);

do?

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.
Mở trang câu hỏi này →