Chủ đề của HSF302 - Làm việc với Spring Framework

HSF302 - Phần 3: Spring Boot và cấu hình tự động

Cổng chạy, chuỗi kết nối cơ sở dữ liệu hay mức ghi log của một dự án Spring Boot đều đặt trong application.properties hoặc application.yml, đổi ở đó không cần sửa mã. Phụ thuộc được khai báo theo cụm: thêm spring-boot-starter-web vào dự án là có đủ Spring MVC, thư viện chuyển JSON và một máy chủ Tomcat nhúng, nên ứng dụng chạy bằng một lệnh java -jar. Lớp main mang @SpringBootApplication, một annotation gộp @SpringBootConfiguration (một dạng @Configuration), @ComponentScan và @EnableAutoConfiguration. Trọng tâm là cấu hình tự động: Spring Boot xem những lớp nào có trên classpath rồi tạo sẵn DataSource, EntityManagerFactory hay DispatcherServlet, và lùi lại ngay khi người viết tự khai báo bean cùng loại. Hạ tầng dựng sẵn ấy cũng là nền cho repository ở Phần 4.

Xem danh sách câu hỏi18 câu hỏi100% có giải thích

Bắt đầu bằng Chế độ học nếu bạn muốn đáp án và giải thích hiện ngay sau mỗi câu — không bấm giờ, dừng lúc nào cũng được. Chọn Thi thử khi muốn biết mình đang ở đâu: có bấm giờ, chấm điểm ở cuối, và giải thích chỉ mở sau khi nộp.

Học ngân hàng câu hỏi của chủ đề

Luyện tập theo chủ đề này

18Câu hỏi hiện có

Câu hỏi của chủ đề

18/18 câuHết danh sách
Đề 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 →
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 →
AApache Tomcat
BJetty
CUndertow
DAll of the above
Lời giải
Đáp án đúng: "All of the above". Trong các bản Spring Boot 2.x và 3.x, ứng dụng servlet được hỗ trợ sẵn ba web server nhúng (embedded server): thêm spring-boot-starter-web thì mặc định là Tomcat, và có thể loại Tomcat ra rồi thêm starter tương ứng để đổi sang Jetty hoặc Undertow; server chạy ngay trong tiến trình khi khởi động ứng dụng từ tệp jar, không cần cài server ngoài. "Apache Tomcat" đúng nhưng chỉ là lựa chọn mặc định, chọn riêng nó bỏ sót hai server kia. "Jetty" là server nhúng nhẹ của Eclipse, được hỗ trợ qua spring-boot-starter-jetty, nhưng cũng chỉ là một phần của danh sách. "Undertow" là server hiệu năng cao của Red Hat, hỗ trợ qua spring-boot-starter-undertow, cũng chưa đủ. Vì câu hỏi liệt kê các server nhúng nên chọn đáp án bao gồm cả ba.
Mở trang câu hỏi này →
ADatabase connectivity.
BWeb application development.
CSecurity configuration.
DMessaging.
Lời giải
Đáp án đúng: "Web application development.". spring-boot-starter-web là starter POM (gói phụ thuộc khởi đầu) gom sẵn Spring MVC, Jackson để chuyển đổi JSON và Tomcat nhúng, đủ để viết ứng dụng web và REST API chỉ với một phụ thuộc; auto-configuration sẽ tự dựng DispatcherServlet và máy chủ nhúng khi thấy các thư viện này trên classpath. "Database connectivity." sai vì kết nối cơ sở dữ liệu đến từ spring-boot-starter-data-jpa hoặc spring-boot-starter-jdbc. "Security configuration." sai vì bảo mật có starter riêng là spring-boot-starter-security. "Messaging." sai vì nhắn tin dùng các starter như spring-boot-starter-amqp cho RabbitMQ hay thư viện spring-kafka, không nằm trong starter web.
Mở trang câu hỏi này →
ASpring Initializr
BMaven Archetype
CGradle Plugin
DJDK installer
Lời giải
Đáp án đúng: "Spring Initializr". Spring Initializr là dịch vụ tạo khung dự án Spring Boot, dùng qua trang start.spring.io hoặc tích hợp sẵn trong IntelliJ IDEA, VS Code, Spring Tool Suite: chỉ cần chọn Maven hay Gradle, phiên bản Java, Spring Boot và các starter như Web, Data JPA, Thymeleaf là nhận ngay một dự án có sẵn lớp main, pom.xml hoặc build.gradle và application.properties. "Maven Archetype" là cơ chế mẫu dự án chung của Maven, dùng được cho mọi loại dự án Java nhưng không chọn starter Spring Boot nhanh như vậy. "Gradle Plugin" ở đây là plugin Spring Boot cho Gradle, dùng để chạy và đóng gói jar chạy được, chứ không sinh dự án mới. "JDK installer" chỉ cài bộ công cụ phát triển Java, là điều kiện cần nhưng không tạo dự án.
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 →
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.
Mở trang câu hỏi này →
Aspring-boot-starter-web
Bspring-boot-starter-data-jpa
Cspring-boot-starter-test
Dspring-boot-devtools
Lời giải
Đáp án đúng: "spring-boot-starter-data-jpa". Starter này kéo theo Spring Data JPA, Hibernate làm JPA provider, spring-jdbc và HikariCP làm connection pool; khi thấy chúng trên classpath cùng thông tin spring.datasource, auto-configuration tự dựng DataSource, EntityManagerFactory, transaction manager và bật quét các interface repository. "spring-boot-starter-web" dùng cho Spring MVC và Tomcat nhúng, không chứa JPA. "spring-boot-starter-test" cung cấp JUnit, Mockito, AssertJ cho kiểm thử, thường đặt ở phạm vi test. "spring-boot-devtools" chỉ hỗ trợ lúc phát triển như tự khởi động lại và LiveReload, không thêm khả năng truy cập dữ liệu. Ngoài starter này vẫn cần driver của cơ sở dữ liệu cụ thể như mysql-connector-j, nhưng đó là phần bổ sung chứ không phải thứ bật Spring Data JPA.
Mở trang câu hỏi này →
Aapplication.yml
Bpom.xml / build.gradle
Cbeans.xml
Dsettings.json
Lời giải
Đáp án đúng: "pom.xml / build.gradle". Dependency của dự án Spring Boot được khai báo trong tệp build: với Maven là pom.xml, thường kế thừa spring-boot-starter-parent và liệt kê các starter như spring-boot-starter-web; với Gradle là build.gradle dùng plugin org.springframework.boot. Công cụ build đọc tệp này để tải thư viện về classpath, rồi Spring Boot dựa vào thư viện có mặt mà tự cấu hình. "application.yml" là tệp cấu hình thuộc tính lúc chạy như cổng server hay chuỗi kết nối cơ sở dữ liệu, không khai báo thư viện. "beans.xml" là tệp định nghĩa bean kiểu XML của Spring truyền thống. "settings.json" là tệp cài đặt của trình soạn thảo như VS Code, không liên quan tới dependency của dự án.
Mở trang câu hỏi này →
A@Component
B@Service
C@SpringBootApplication
D@Repository
Lời giải
Đáp án đúng: "@SpringBootApplication". Lớp chứa phương thức main gọi SpringApplication.run thường được gắn @SpringBootApplication, một annotation tổng hợp gồm @SpringBootConfiguration (lớp cấu hình), @EnableAutoConfiguration (bật tự cấu hình theo thư viện có trên classpath) và @ComponentScan (quét bean bắt đầu từ package của chính lớp đó); vì vậy lớp main nên đặt ở package gốc. "@Component" chỉ đánh dấu một lớp là bean thông thường, không bật tự cấu hình hay quét thành phần. "@Service" là stereotype cho tầng nghiệp vụ. "@Repository" là stereotype cho tầng truy cập dữ liệu, kèm dịch exception lưu trữ. Gắn @Component, @Service hay @Repository lên lớp main chỉ biến nó thành bean chứ không khởi động được cơ chế của Spring Boot.
Mở trang câu hỏi này →
ASpring MVC
BSpring Data JPA
CStarter dependencies
DSpring Security
Lời giải
Đáp án đúng: "Starter dependencies". Spring Boot starter là các gói phụ thuộc gom sẵn như spring-boot-starter-web hay spring-boot-starter-data-jpa: thêm một starter là kéo về bộ thư viện tương thích phiên bản với nhau, và việc các thư viện đó xuất hiện trên classpath kích hoạt auto-configuration tạo sẵn bean như DispatcherServlet, DataSource, EntityManagerFactory. Nói chặt, auto-configuration là một cơ chế riêng, nhưng starter là phần đưa phụ thuộc vào để nó hoạt động, nên đây là tính năng khớp mô tả. "Spring MVC" là framework web, thứ được starter web cấu hình, không phải tính năng cấu hình sẵn. "Spring Data JPA" là mô-đun truy cập dữ liệu, cũng chỉ là đối tượng được cấu hình. "Spring Security" là framework bảo mật, cung cấp xác thực, phân quyền chứ không phải cơ chế gom phụ thuộc.
Mở trang câu hỏi này →
ATo define a database entity.
BTo enable Spring MVC functionality.
CTo combine @Configuration, @EnableAutoConfiguration, and @ComponentScan.
DTo define a RESTful endpoint.
Lời giải
Đáp án đúng: "To combine @Configuration, @EnableAutoConfiguration, and @ComponentScan.". @SpringBootApplication là meta-annotation (annotation gộp) gồm @SpringBootConfiguration, một dạng @Configuration cho phép khai báo @Bean, cùng @EnableAutoConfiguration tự cấu hình bean dựa trên thư viện có trên classpath và thuộc tính, và @ComponentScan quét gói chứa lớp main cùng các gói con để tìm @Component, @Service, @Controller; đặt nó lên lớp chứa main rồi gọi SpringApplication.run là đủ khởi động ứng dụng. "To define a database entity." sai vì entity khai báo bằng @Entity. "To enable Spring MVC functionality." chỉ đúng gián tiếp: Spring MVC được auto-configuration bật khi có spring-boot-starter-web, còn bản thân annotation không dành riêng cho MVC. "To define a RESTful endpoint." sai vì endpoint REST khai báo bằng @RestController kèm @GetMapping hay @PostMapping.
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 →
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 →

Đề có câu hỏi của chủ đề này

5 đề chứa ít nhất một câu thuộc chủ đề — mở đề để làm cả bộ, không chỉ từng câu.