اختبار: الخطوات الأولى مع Spring Boot
اختبر معلوماتك حول إنشاء وهيكل مشروع Spring Boot.
30 سؤالاً - انقر على كل سؤال لكشف الإجابة.
الأسئلة 1-10: Spring Initializr والهيكل
السؤال 1: ما هو Spring Initializr؟
الإجابة: Spring Initializr هو أداة ويب (start.spring.io) تولد الهيكل الأساسي لمشروع Spring Boot:
- اختيار نوع المشروع (Maven/Gradle)
- إصدار Java وSpring Boot
- التبعيات الأولية
- بيانات المشروع (groupId, artifactId)
السؤال 2: ما هو الهيكل القياسي لمشروع Spring Boot؟
الإجابة:
src/
├── main/
│ ├── java/
│ │ └── com/example/demo/
│ │ └── DemoApplication.java
│ └── resources/
│ ├── application.properties
│ ├── static/
│ └── templates/
└── test/
└── java/
pom.xml
السؤال 3: ما هو الغرض من ملف pom.xml؟
الإجابة: ملف pom.xml (Project Object Model) يحدد:
- بيانات المشروع (groupId, artifactId, version)
- التبعيات
- إضافات Maven
- إعدادات البناء
- Parent Spring Boot (
spring-boot-starter-parent)
السؤال 4: ما هو spring-boot-starter-parent؟
الإجابة: هو Parent Maven يوفر:
- إدارة إصدارات التبعيات
- إعدادات افتراضية للإضافات
- ترميز UTF-8
- إصدار Java مضبوط
- ملفات تعريف البناء
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
</parent>
السؤال 5: ما هو starter في Spring Boot؟
الإجابة: Starter هو مجموعة من التبعيات المهيأة مسبقًا لاستخدام محدد:
| Starter | الاستخدام |
|---|---|
spring-boot-starter-web | API REST |
spring-boot-starter-data-jpa | قاعدة بيانات |
spring-boot-starter-security | الأمان |
spring-boot-starter-test | الاختبارات |
السؤال 6: أين يتم وضع ملف application.properties؟
الإجابة: في src/main/resources/application.properties أو application.yml.
هذا الملف يحتوي على إعدادات التطبيق (المنفذ، قاعدة البيانات، إلخ).
السؤال 7: ما الفرق بين application.properties وapplication.yml؟
الإجابة:
# application.properties
server.port=8080
spring.datasource.url=jdbc:postgresql://localhost/db
# application.yml
server:
port: 8080
spring:
datasource:
url: jdbc:postgresql://localhost/db
YAML أكثر قابلية للقراءة للإعدادات الهرمية.
السؤال 8: ما هو الغرض من المجلد static/؟
الإجابة: المجلد src/main/resources/static/ يحتوي على الملفات الثابتة التي تُخدم مباشرة:
- CSS
- JavaScript
- الصور
- ملفات HTML ثابتة
يمكن الوصول إليها عبر http://localhost:8080/fichier.css
السؤال 9: ما هو الغرض من المجلد templates/؟
الإجابة: المجلد src/main/resources/templates/ يحتوي على القوالب من جانب الخادم:
- Thymeleaf (.html)
- FreeMarker (.ftl)
- Mustache (.mustache)
يستخدم لتطبيقات الويب مع عرض من جانب الخادم.
السؤال 10: كيف يتم تشغيل تطبيق Spring Boot؟
الإجابة:
# مع Maven
mvn spring-boot:run
# أو بتجميع JAR
mvn clean package
java -jar target/app.jar
# من IDE
# تشغيل الفئة الرئيسية
الأسئلة 11-20: الفئة الرئيسية والتعليقات التوضيحية
السؤال 11: ماذا تحتوي الفئة الرئيسية؟
الإجابة:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
إنها نقطة الدخول التي تبدأ سياق Spring.
السؤال 12: ماذا تفعل @SpringBootApplication؟
الإجابة: @SpringBootApplication تجمع بين ثلاث تعليقات توضيحية:
@Configuration: فئة إعدادات@EnableAutoConfiguration: إعداد تلقائي لـ Spring Boot@ComponentScan: مسح المكونات
السؤال 13: ما هو الإعداد التلقائي؟
الإجابة: Spring Boot يقوم بإعداد beans تلقائيًا وفقًا لـ:
- التبعيات الموجودة
- الخصائص المحددة
- beans الموجودة
مثال: إضافة spring-boot-starter-data-jpa يقوم بإعداد DataSource تلقائيًا.
السؤال 14: ما هو @RestController؟
الإجابة: تعليق توضيحي يجمع بين:
@Controller: مكون ويب@ResponseBody: يعيد JSON/XML
@RestController
public class UserController {
@GetMapping("/users")
public List<User> getAll() {
return userService.findAll();
}
}
السؤال 15: ما هي التعليقات التوضيحية لتوجيه HTTP؟
الإجابة:
| التعليق التوضيحي | طريقة HTTP |
|---|---|
@GetMapping | GET |
@PostMapping | POST |
@PutMapping | PUT |
@DeleteMapping | DELETE |
@PatchMapping | PATCH |
@RequestMapping | جميعها (قابلة للتكوين) |
السؤال 16: كيف يمكن استرداد معلمة من URL؟
الإجابة:
// متغير المسار: /users/123
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
// معلمة الاستعلام: /users?name=John
@GetMapping("/users")
public List<User> search(@RequestParam String name) {
return userService.findByName(name);
}
السؤال 17: كيف يمكن استرداد جسم الطلب؟
الإجابة:
@PostMapping("/users")
public User create(@RequestBody UserRequest request) {
return userService.create(request);
}
@RequestBody يقوم بإلغاء تسلسل JSON إلى كائن Java.
السؤال 18: ما هو الغرض من @Component, @Service, @Repository؟
الإجابة: هذه هي الأنماط في Spring التي تحدد الفئات كـ beans:
| التعليق التوضيحي | الاستخدام |
|---|---|
@Component | Bean عام |
@Service | منطق الأعمال |
@Repository | الوصول إلى البيانات |
@Controller | طبقة الويب |
جميعها هي متغيرات من @Component.
السؤال 19: ما هو @Configuration و@Bean؟
الإجابة:
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@Configuration: فئة إعدادات@Bean: طريقة تنتج bean
السؤال 20: كيف يمكن حقن تبعية؟
الإجابة:
@Service
public class UserService {
private final UserRepository userRepository;
// الحقن عبر المنشئ (موصى به)
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
الأسئلة 21-30: الإعدادات والمستودعات
السؤال 21: كيف يمكن تحديد منفذ الخادم؟
الإجابة:
# application.properties
server.port=9090
# application.yml
server:
port: 9090
الافتراضي: 8080
السؤال 22: كيف يمكن استخدام ملفات التعريف؟
الإجابة:
# application.yml (مشترك)
spring:
profiles:
active: dev
# application-dev.yml
server:
port: 8080
# application-prod.yml
server:
port: 80
التفعيل: --spring.profiles.active=prod
السؤال 23: كيف يمكن قراءة خاصية إعدادات؟
الإجابة:
@Value("${app.name}")
private String appName;
@Value("${app.timeout:5000}") // قيمة افتراضية
private int timeout;
السؤال 24: ما هو JpaRepository؟
الإجابة: واجهة Spring Data JPA التي توفر طرق CRUD:
public interface UserRepository extends JpaRepository<User, Long> {
// طرق موروثة: save, findById, findAll, delete, count...
}
السؤال 25: كيف يمكن إنشاء كيان JPA؟
الإجابة:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
private String email;
// Getters, setters
}
السؤال 26: كيف يمكن إعداد H2 في الذاكرة؟
الإجابة:
spring:
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
h2:
console:
enabled: true # وحدة التحكم: /h2-console
مثالي للتطوير والاختبارات.
السؤال 27: كيف يقوم Spring Data بإنشاء الاستعلامات؟
الإجابة: عن طريق اسم الطريقة:
List<User> findByName(String name);
// SELECT * FROM users WHERE name = ?
List<User> findByEmailContaining(String email);
// SELECT * FROM users WHERE email LIKE '%?%'
List<User> findByAgeGreaterThanOrderByNameAsc(int age);
// SELECT * FROM users WHERE age > ? ORDER BY name ASC
السؤال 28: كيف يمكن بدء التطبيق ببيانات؟
الإجابة:
@Component
public class DataInitializer implements CommandLineRunner {
private final UserRepository repository;
@Override
public void run(String... args) {
repository.save(new User("Admin", "admin@example.com"));
}
}
أو مع src/main/resources/data.sql.
السؤال 29: كيف يمكن رؤية الاستعلامات SQL المنفذة؟
الإجابة:
spring:
jpa:
show-sql: true
properties:
hibernate:
format_sql: true
logging:
level:
org.hibernate.SQL: DEBUG
org.hibernate.orm.jdbc.bind: TRACE
السؤال 30: كيف يمكن إنشاء JAR قابل للتنفيذ؟
الإجابة:
mvn clean package
# النتيجة: target/app-0.0.1-SNAPSHOT.jar
java -jar target/app-0.0.1-SNAPSHOT.jar
الـ JAR يحتوي على التطبيق وخادم Tomcat مدمج.
النتيجة
| النتيجة | المستوى |
|---|---|
| 27-30 | ممتاز - أساسيات متقنة |
| 21-26 | جيد - بعض المراجعات |
| 15-20 | متوسط - أعد قراءة الفصول |
| أقل من 15 | بحاجة إلى مراجعة |