انتقل إلى المحتوى الرئيسي

اختبار: الخطوات الأولى مع 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-webAPI 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
@GetMappingGET
@PostMappingPOST
@PutMappingPUT
@DeleteMappingDELETE
@PatchMappingPATCH
@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:

التعليق التوضيحيالاستخدام
@ComponentBean عام
@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بحاجة إلى مراجعة

العودة إلى الوحدة 2