Spring @Repository 注釋用於指示類別提供對象的存儲、檢索、搜索、更新和刪除操作的機制。
Spring @Repository 注釋
Spring Repository 注釋是 @Component 注釋的一種特化,因此 Spring Repository 類別通過類路徑掃描被 spring framework 自動檢測。Spring Repository 很接近 DAO 模式,其中 DAO 類別負責提供對數據庫表的 CRUD 操作。但是,如果您使用 Spring Data 來管理數據庫操作,則應使用 Spring Data Repository 介面。
Spring Repository 示例
讓我們來看一個簡單的例子,在這裡我們將創建一個 Spring Repository 類。我們將不使用數據庫操作,而是為對象提供一個存儲庫。在 Eclipse 或任何其他你使用的 IDE 中創建一個 Maven 項目,然後添加 Spring Core 依賴。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
下面的圖片顯示了我們在 Eclipse 中的最終項目結構。讓我們為這個對象創建模型類,我們將實現一個 Spring Repository。
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;
}
}
請注意,我使用內存中的 Map 來存儲對象數據,你也可以使用其他任何機制。
Spring Repository 測試
我們的 Spring Repository 已經準備好,讓我們創建一個主類並測試它。
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