تحليل البنية في Spring @Repository

تُستخدم تعليقة @Repository في الربيع للإشارة إلى أن الصنف يوفر آلية للتخزين واسترجاع البيانات والبحث والتحديث والحذف عن الكائنات.

تعليقة @Repository في الربيع

تعليقة Repository في الربيع هي تخصص لتعليقة @Component، لذا يتم اكتشاف صنفات Repository في الربيع تلقائيًا عن طريق فحص مسار الصنف. تقترب تعليقة Repository في الربيع كثيرًا من نمط DAO حيث تتولى صنفات DAO توفير عمليات CRUD على جداول قواعد البيانات. ومع ذلك، إذا كنت تستخدم Spring Data لإدارة عمليات قواعد البيانات، فيجب عليك استخدام واجهة Spring Data Repository.

مثال على Repository في الربيع

لنلقِ نظرة على مثال بسيط حيث سنقوم بإنشاء فئة Repository لـ Spring. لن نستخدم عمليات قاعدة بيانات، بل سنقدم مستودعًا لكائن. قم بإنشاء مشروع مافن في Eclipse أو أي بيئة تطوير متكاملة أخرى تستخدمها، ثم أضف تبعية نواة Spring.

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.0.6.RELEASE</version>
</dependency>

الصورة أدناه تُظهر هيكل مشروعنا النهائي في Eclipse. لنقم بإنشاء فئة النموذج التي سنقوم بتنفيذ مستودع Spring لها.

package com.journaldev.spring.model;

public class Employee {

	private int id;
	private String name;
	private String jobTitle;

	public Employee() {
	}

	public Employee(int i, String n, String jt) {
		this.id = i;
		this.name = n;
		this.jobTitle = jt;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getJobTitle() {
		return jobTitle;
	}

	public void setJobTitle(String jobTitle) {
		this.jobTitle = jobTitle;
	}

	@Override
	public String toString() {
		return id + "," + name + "," + jobTitle;
	}
}

قبل تنفيذ فئة Repository، قمت بإنشاء واجهة ObjectRepository العامة لتوفير العقد لفئتنا المستودع لتنفيذه.

package com.journaldev.spring.repository;

public interface ObjectRepository<T> {

	public void store(T t);

	public T retrieve(int id);

	public T search(String name);

	public T delete(int id);
}

I am using Generics here, it’s a powerful technology to provide loosely coupled contract for the applications to implement. Now let’s look at our Repository class implementation.

package com.journaldev.spring.repository;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Repository;

import com.journaldev.spring.model.Employee;

@Repository
public class EmployeeRepository implements ObjectRepository<Employee> {

	private Map<Integer, Employee> repository;

	public EmployeeRepository() {
		this.repository = new HashMap<>();
	}

	@Override
	public void store(Employee emp) {
		repository.put(emp.getId(), emp);
	}

	@Override
	public Employee retrieve(int id) {
		return repository.get(id);
	}

	@Override
	public Employee search(String name) {
		Collection<Employee> emps = repository.values();
		for (Employee emp : emps) {
			if (emp.getName().equalsIgnoreCase(name))
				return emp;
		}
		return null;
	}

	@Override
	public Employee delete(int id) {
		Employee e = repository.get(id);
		this.repository.remove(id);
		return e;
	}

}

يرجى ملاحظة أنني أستخدم خريطة في الذاكرة لتخزين بيانات الكائن، يمكنك استخدام آليات أخرى أيضًا.

اختبار مستودع Spring

مستودعنا لـ Spring جاهز، دعونا نقوم بإنشاء فئة رئيسية ونختبرها.

package com.journaldev.spring;

import java.sql.SQLException;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.journaldev.spring.model.Employee;
import com.journaldev.spring.repository.EmployeeRepository;

public class SpringMainClass {

	public static void main(String[] args) throws SQLException {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
		context.scan("com.journaldev.spring");
		context.refresh();

		EmployeeRepository repository = context.getBean(EmployeeRepository.class);

		// store
		repository.store(new Employee(1, "Pankaj", "CEO"));
		repository.store(new Employee(2, "Anupam", "Editor"));
		repository.store(new Employee(3, "Meghna", "CFO"));

		// retrieve
		Employee emp = repository.retrieve(1);
		System.out.println(emp);

		// search
		Employee cfo = repository.search("Meghna");
		System.out.println(cfo);

		// حذف
		Employee editor = repository.delete(2);
		System.out.println(editor);

		// إغلاق سياق Spring
		context.close();
	}

}

قم بتشغيل الفئة كتطبيق Java ويجب أن تحصل على الإخراج التالي.

1,Pankaj,CEO
3,Meghna,CFO
2,Anupam,Editor

يمكنك تنزيل الشفرة المثالية من مستودعنا على GitHub.

المرجع: وثائق API

Source:
https://www.digitalocean.com/community/tutorials/spring-repository-annotation