Annotazione Spring @Repository

L’annotazione Spring @Repository viene utilizzata per indicare che la classe fornisce il meccanismo per l’archiviazione, il recupero, la ricerca, l’aggiornamento e l’eliminazione di oggetti.

Spring @Repository Annotation

L’annotazione Spring Repository è una specializzazione dell’annotazione @Component, quindi le classi Spring Repository vengono rilevate automaticamente dal framework Spring attraverso la scansione del classpath. Il Repository di Spring è molto simile al pattern DAO dove le classi DAO sono responsabili per fornire operazioni CRUD sulle tabelle del database. Tuttavia, se si sta utilizzando Spring Data per gestire le operazioni sul database, allora si dovrebbe utilizzare l’interfaccia Spring Data Repository.

Esempio di Repository Spring

Diamo uno sguardo a un esempio semplice in cui creeremo una classe Repository di Spring. Non utilizzeremo operazioni sul database, ma forniremo un repository per un oggetto. Crea un progetto Maven in Eclipse o in qualsiasi altro IDE che utilizzi, quindi aggiungi la dipendenza di base di Spring.

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

L’immagine seguente mostra la struttura finale del nostro progetto in Eclipse. Creiamo la classe del modello per la quale implementeremo un repository di 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;
	}
}

Prima di implementare la classe Repository, ho creato un’interfaccia generica ObjectRepository per fornire il contratto che la nostra classe repository dovrà implementare.

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;
	}

}

Nota che sto utilizzando una mappa in memoria per archiviare i dati dell’oggetto, è possibile utilizzare anche altri meccanismi.

Test Repository di Spring

Il nostro Repository di Spring è pronto, creiamo una classe principale e testiamolo.

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);

		 // cancella 
		Employee editor = repository.delete(2);
		System.out.println(editor);

		 // chiudi il contesto di Spring 
		context.close();
	}

}

Esegui semplicemente la classe come applicazione Java e dovresti ottenere il seguente output.

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

Puoi scaricare il codice di esempio dal nostro repository di GitHub.

Riferimento: Documentazione API

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