Springの@Repositoryアノテーション
Springの@Repositoryアノテーションは、クラスがオブジェクトに対しての格納、検索、更新、削除のメカニズムを提供することを示すために使用されます。
Springの@Repositoryアノテーションを日本語で表現すると、以下のようになります。
Spring Repositoryのアノテーションは、@Componentアノテーションの特殊化であり、Spring Repositoryクラスはクラスパススキャンを通じてSpringフレームワークによって自動検出されます。Spring Repositoryは、DAOパターンに非常に近く、DAOクラスはデータベーステーブル上のCRUD操作を提供する責任があります。ただし、データベース操作を管理するためにSpring Dataを使用している場合は、Spring Data Repositoryインターフェースを使用する必要があります。
春のリポジトリの例
シンプルな例を見てみましょう。SpringのRepositoryクラスを作成します。データベース操作は使用しませんが、オブジェクトのためのリポジトリを提供します。Eclipseや他の使用しているIDEでMavenプロジェクトを作成し、Springのコア依存関係を追加してください。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
package com.scdev.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;
}
}
リポジトリクラスを実装する前に、私は汎用のObjectRepositoryインターフェースを作成し、リポジトリクラスが実装するための契約を提供しています。
package com.scdev.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);
}
ここでは、ジェネリクスを使っています。これは、アプリケーションが実装するための緩く結合した契約を提供する強力な技術です。では、私たちのリポジトリクラスの実装を見てみましょう。
package com.scdev.spring.repository;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Repository;
import com.scdev.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.scdev.spring;
import java.sql.SQLException;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.scdev.spring.model.Employee;
import com.scdev.spring.repository.EmployeeRepository;
public class SpringMainClass {
public static void main(String[] args) throws SQLException {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.scan("com.scdev.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);
// delete
Employee editor = repository.delete(2);
System.out.println(editor);
// close the spring context
context.close();
}
}
ただJavaアプリケーションとしてクラスを実行すれば、以下の出力が得られるはずです。
1,Pankaj,CEO
3,Meghna,CFO
2,Anupam,Editor
我々のGitHubリポジトリからサンプルコードをダウンロードすることができます。
参考:APIドキュメント