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