Câu hỏi: HSF302 - Phần 2: IoC và Dependency Injection trong Spring
21 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 theo thứ tự nhập vào ngân hàng.
Danh sách câu hỏi
20/21 câuCòn 1
1Spring Beans are managed by which container?4 lựa chọn
AJava VM
BSpring IoC Container
CJDBC Driver
DREST Controller
Lời giải
Mở trang câu hỏi này →Đá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.
2Consider the following Java code snippet:4 lựa chọncó code
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
Mở trang câu hỏi này →Đá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.
3Which type of Dependency Injection involves passing dependencies to a class through its constructor?4 lựa chọn
ASetter Injection
BField Injection
CConstructor Injection
DMethod Injection
Lời giải
Mở trang câu hỏi này →Đá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.
A
AfterB
AfterReturningC
BeforeD
AroundLời giải
Mở trang câu hỏi này →Đá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.
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
Mở trang câu hỏi này →Đá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.
ARendering HTML views from Thymeleaf templates
BCreating, wiring, configuring beans and managing their lifecycle
CExecuting SQL statements without any JDBC driver
DCompiling Java sources at runtime
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Creating, wiring, configuring beans and managing their lifecycle". IoC container (bộ chứa đảo ngược điều khiển) của Spring, cụ thể là BeanFactory và ApplicationContext, đọc cấu hình từ annotation, lớp @Configuration hoặc XML rồi tự tạo bean, tiêm phụ thuộc vào nhau, áp cấu hình và quản lý vòng đời từ khởi tạo, gọi @PostConstruct cho tới @PreDestroy khi đóng context; mã nghiệp vụ không còn tự new đối tượng nữa. "Rendering HTML views from Thymeleaf templates" là việc của engine template Thymeleaf cùng ViewResolver trong tầng web, container chỉ quản lý các bean đó chứ không tự render. "Executing SQL statements without any JDBC driver" là điều không thể, mọi truy cập cơ sở dữ liệu quan hệ trong Java đều cần driver JDBC. "Compiling Java sources at runtime" là việc của trình biên dịch javac hay công cụ build, container chỉ làm việc với lớp đã biên dịch.
ADefining user interfaces.
BImplementing cross-cutting concerns like logging and security.
CManaging database transactions.
DCreating web service clients.
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Implementing cross-cutting concerns like logging and security.". AOP (Aspect-Oriented Programming, lập trình hướng khía cạnh) tách những mối quan tâm cắt ngang (cross-cutting concern) như ghi log, kiểm tra quyền, đo thời gian, quản lý giao dịch ra khỏi mã nghiệp vụ: ta viết chúng một lần trong một aspect với advice như @Before hay @Around, chỉ định nơi áp dụng bằng pointcut, và Spring tạo proxy bọc quanh bean để chèn advice khi phương thức được gọi. "Defining user interfaces." là việc của tầng view như Thymeleaf hay JavaFX, không phải AOP. "Managing database transactions." là một ứng dụng cụ thể của AOP, vì @Transactional chạy qua proxy và advice giao dịch, nhưng đó chỉ là một trường hợp, còn mục đích chung của AOP rộng hơn nhiều. "Creating web service clients." thuộc RestTemplate, WebClient hay OpenFeign, không phải mục đích của AOP.
ADispatcherServlet
BBeanFactory or ApplicationContext
CViewResolver
DHandlerMapping
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "BeanFactory or ApplicationContext". Spring Core Container chính là IoC container, với BeanFactory là interface gốc và ApplicationContext là bản mở rộng thường dùng; chúng đọc cấu hình, tạo bean, tiêm phụ thuộc, gọi các callback khởi tạo như @PostConstruct, quản lý phạm vi singleton hay prototype và gọi callback huỷ khi đóng context, tức nắm toàn bộ vòng đời bean. "DispatcherServlet" là front controller của Spring MVC, nhận yêu cầu HTTP và điều phối tới controller; nó lấy bean từ một WebApplicationContext chứ không tự quản lý vòng đời bean. "ViewResolver" chỉ ánh xạ tên view logic thành view thật như trang Thymeleaf. "HandlerMapping" chỉ tìm handler phù hợp cho một yêu cầu. Các thành phần web vừa kể đều nằm ngoài Core Container và chính chúng cũng là bean do container quản lý.
AAspect
BAdvice
CJoin Point
DPointcut
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Join Point". Join point (điểm nối) là một thời điểm cụ thể trong quá trình thực thi chương trình nơi advice có thể được áp vào, như lời gọi phương thức, xử lý ngoại lệ hay gán trường; Spring AOP dựa trên proxy nên chỉ hỗ trợ join point là việc thực thi phương thức của bean. "Aspect" là mô-đun gom một mối quan tâm cắt ngang như ghi log hay giao dịch, chứa cả advice lẫn pointcut, không phải một điểm trong luồng chạy. "Advice" là hành động được thực thi tại join point, ví dụ Before, After hay Around, tức là cái được áp vào chứ không phải nơi áp. "Pointcut" là biểu thức chọn ra những join point nào sẽ nhận advice, ví dụ một biểu thức execution chọn mọi phương thức trong gói service; nó lọc các điểm chứ bản thân không phải là một điểm thực thi.
AObjects control the creation of their dependencies.
BThe framework or container controls the creation and management of objects.
CObjects are responsible for managing the application's flow.
DMethods control the instantiation of classes.
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "The framework or container controls the creation and management of objects.". Inversion of Control (đảo ngược điều khiển) nghĩa là đối tượng không tự new các phụ thuộc và không tự quyết định vòng đời của mình nữa; quyền đó chuyển cho container, trong Spring là ApplicationContext, nơi đọc cấu hình, tạo bean, tiêm phụ thuộc qua Dependency Injection, gọi các callback khởi tạo và huỷ. Mã ứng dụng chỉ khai báo mình cần gì. "Objects control the creation of their dependencies." mô tả đúng cách làm truyền thống mà IoC muốn đảo ngược, khi lớp tự gọi new cho phụ thuộc và bị gắn chặt vào cài đặt cụ thể. "Objects are responsible for managing the application's flow." cũng là kiểu điều khiển truyền thống, mã của ta gọi thư viện, trong khi với IoC chính framework gọi ngược vào mã của ta. "Methods control the instantiation of classes." chỉ là cách nói khác của việc tự tạo đối tượng, như factory method do lập trình viên tự viết, không chuyển quyền cho container.
11Which annotation marks repository class?4 lựa chọn
A@Repository
B@Entity
C@Service
D@Bean
Lời giải
Mở trang câu hỏi này →Đá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.
ATo provide a database management system.
BTo offer a comprehensive infrastructure support for developing Java applications.
CTo create graphical user interfaces.
DTo manage operating system resources.
Lời giải
Mở trang câu hỏi này →Đá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.
ARobust transaction management.
BComprehensive web development support through Spring MVC.
CAutomatic generation of user interfaces.
DStrong community support and extensive documentation.
Lời giải
Mở trang câu hỏi này →Đá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.
A@Aspect
B@Controller
C@Repository
D@Configuration
Lời giải
Mở trang câu hỏi này →Đá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.
A.xml
B.conf
C.java
D.yml
Lời giải
Mở trang câu hỏi này →Đáp án đúng: ".java". Cấu hình Spring dựa trên annotation (Java-based configuration) được viết thẳng bằng mã Java: một lớp gắn @Configuration chứa các phương thức @Bean, kết hợp @ComponentScan hay @EnableTransactionManagement, được lưu trong tệp nguồn Java rồi biên dịch như mọi lớp khác, thay cho cách khai báo bean trong XML truyền thống. ".xml" là phần mở rộng của cấu hình XML kiểu applicationContext với thẻ bean, chính là thứ cấu hình annotation thay thế. ".conf" không phải định dạng cấu hình chuẩn của Spring, thường gặp ở cấu hình máy chủ như Nginx. ".yml" là tệp YAML mà Spring Boot dùng cho application.yml để khai báo giá trị thuộc tính như cổng, URL cơ sở dữ liệu; nó chứa dữ liệu cấu hình chứ không định nghĩa bean bằng annotation.
AIncreased coupling between application layers.
BAbility to use only the modules needed, reducing application size.
CLimited support for different persistence technologies.
DDecreased flexibility in choosing application components.
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Ability to use only the modules needed, reducing application size.". Spring Framework được chia thành nhiều mô-đun như spring-core, spring-beans, spring-context, spring-jdbc, spring-orm, spring-webmvc; ứng dụng chỉ khai báo những mô-đun mình dùng, ví dụ ứng dụng dòng lệnh không cần spring-webmvc, nhờ vậy giảm số thư viện phải đóng gói và giữ phụ thuộc gọn. "Increased coupling between application layers." sai vì mục tiêu của Spring là giảm phụ thuộc chặt (coupling) nhờ DI và lập trình qua interface. "Limited support for different persistence technologies." ngược với thực tế: Spring hỗ trợ JDBC, JPA, Hibernate, MyBatis và các kho NoSQL qua Spring Data. "Decreased flexibility in choosing application components." cũng ngược lại, vì kiến trúc mô-đun cho phép tự chọn và thay thế từng thành phần.
17What is an "advice" in Spring AOP?4 lựa chọn
AA point in the execution of a program.
BAn object being proxied.
CThe action taken at a particular join point.
DA collection of join points.
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "The action taken at a particular join point.". Theo thuật ngữ AOP mà Spring dùng, advice là hành động do aspect thực hiện tại một join point cụ thể, có các loại before, after returning, after throwing, after và around, ví dụ ghi log trước khi gọi một phương thức service. "A point in the execution of a program." là định nghĩa join point, trong Spring AOP luôn là một lần gọi phương thức. "An object being proxied." là target object, đối tượng được advise mà Spring bọc bằng proxy. "A collection of join points." gần với pointcut, tức biểu thức chọn ra tập join point mà advice sẽ áp vào; pointcut quyết định ở đâu, còn advice quyết định làm gì.
18Spring follows which design principle?4 lựa chọn
ATight coupling
BInversion of Control
CGlobal variables
DStatic imports
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Inversion of Control". Inversion of Control (đảo ngược điều khiển) là nguyên lý nền của Spring: thay vì đối tượng tự tạo và tự tìm phụ thuộc, quyền điều khiển việc tạo, nối và quản lý vòng đời đối tượng được chuyển cho IoC container như ApplicationContext, và Dependency Injection là cách Spring hiện thực nguyên lý này. "Tight coupling" là điều Spring muốn tránh, vì lớp gắn chặt với hiện thực cụ thể thì khó thay thế và khó kiểm thử. "Global variables" là thói quen thiết kế xấu, trạng thái dùng chung khó kiểm soát; bean singleton của Spring được tiêm có chủ đích chứ không phải biến toàn cục. "Static imports" chỉ là cú pháp Java để gọi thành viên tĩnh không cần ghi tên lớp, không phải nguyên lý thiết kế.
19Which DI type is generally considered the most recommended due to its immutability and testability benefits?4 lựa chọn
ASetter Injection
BField Injection
CConstructor Injection
DMethod Injection
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Constructor Injection". Với constructor injection, các phụ thuộc truyền qua tham số hàm tạo nên trường có thể khai báo final (bất biến), đối tượng luôn được tạo ra ở trạng thái đầy đủ, phụ thuộc bắt buộc lộ rõ, và khi viết unit test chỉ cần tạo lớp đó với mock mà không cần container; tài liệu Spring khuyến nghị cách này cho phụ thuộc bắt buộc, và lớp chỉ có một hàm tạo thì không cần @Autowired. "Setter Injection" hợp với phụ thuộc tuỳ chọn hoặc có thể đổi lại sau, nhưng trường không thể final và đối tượng có thể bị dùng khi chưa tiêm đủ. "Field Injection" (@Autowired trên trường) gọn nhưng giấu phụ thuộc, không cho final và buộc dùng reflection hoặc container khi test. "Method Injection" là kỹ thuật đặc biệt như lookup method để lấy bean prototype mới từ một bean singleton, không phải cách tiêm thông thường được khuyến nghị.
20In the Spring Framework architecture, which module forms the foundation of all other modules?4 lựa chọn
ASpring MVC
BSpring Security
CSpring Core Container
DSpring Data
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Spring Core Container". Trong kiến trúc Spring Framework, Core Container gồm các module spring-core, spring-beans, spring-context và spring-expression, cung cấp IoC container, Dependency Injection, BeanFactory, ApplicationContext và SpEL; mọi module khác đều chạy trên nền này vì chúng đều là bean được container tạo và quản lý. "Spring MVC" là module web xây trên Core Container, dùng ApplicationContext để quản lý controller và DispatcherServlet. "Spring Security" là dự án bảo mật dựa vào container để cấu hình filter và bean xác thực, nên phụ thuộc vào nền chứ không phải nền. "Spring Data" là họ dự án truy cập dữ liệu, cũng dựng repository thành bean trong container, không phải nền tảng của các module còn lại.