Spring @Repository批注

时间:2020-02-23 14:35:58  来源:igfitidea点击:

Spring @Repository批注用于指示该类提供了对对象进行存储,检索,搜索,更新和删除操作的机制。

Spring @Repository批注

Spring Repository批注是@Component批注的一种特殊形式,因此Spring框架会通过类路径扫描自动检测Spring Repository类。

Spring Repository非常接近DAO模式,其中DAO类负责对数据库表提供CRUD操作。
但是,如果您使用Spring Data来管理数据库操作,则应该使用Spring Data Repository接口。

Spring存储库示例

让我们看一个简单的示例,在该示例中,我们将创建一个Spring Repository类。
我们将不使用数据库操作,而是为对象提供一个存储库。

在Eclipse或者您使用的任何其他IDE中创建一个maven项目,然后添加spring核心依赖项。

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

下图显示了我们在Eclipse中的最终项目结构。

让我们创建一个模型类,为其实现一个Spring存储库。

package com.theitroad.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.theitroad.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);
}

我在这里使用泛型,这是一项强大的技术,可以为应用程序提供松散耦合的合同。

现在,让我们看一下我们的Repository类的实现。

package com.theitroad.spring.repository;

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

import org.springframework.stereotype.Repository;

import com.theitroad.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存储库测试

我们的Spring存储库已准备就绪,让我们创建一个主类并进行测试。

package com.theitroad.spring;

import java.sql.SQLException;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

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

public class SpringMainClass {

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

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

		//store
		repository.store(new Employee(1, "hyman", "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,hyman,CEO
3,Meghna,CFO
2,Anupam,Editor