bal*_*teo 51 java spring jpa spring-data spring-data-jpa
@NoRepositoryBean
在阅读Spring Data文档时,我多次遇到界面.
引用文档:
如果您正在使用Spring命名空间使用Spring命名空间进行自动存储库接口检测,那将导致Spring尝试创建MyRepository实例.这当然不是所希望的,因为它只是在Repository和您要为每个实体定义的实际存储库接口之间起中间作用.要将扩展存储库的接口排除在实例化为存储库实例之外,请使用
@NoRepositoryBean
.
但是,我仍然不确定何时何地使用它.有人可以建议并给我一个具体的用法示例吗?
Oli*_*ohm 119
注释用于避免为实际匹配repo接口条件但不打算成为一个接口的接口创建存储库代理.只有在您开始使用功能扩展所有存储库时才需要它.让我给你举个例子:
假设您要向所有存储库添加方法foo().您将首先添加这样的repo界面
public interface com.foobar.MyBaseInterface<…,…> extends CrudRepository<…,…> {
void foo();
}
Run Code Online (Sandbox Code Playgroud)
您还可以添加相应的实现类,工厂等.您具体的存储库接口现在将扩展该中间接口:
public interface com.foobar.CustomerRepository extends MyBaseInterface<Customer, Long> {
}
Run Code Online (Sandbox Code Playgroud)
现在假设你引导 - 让我们说Spring Data JPA - 如下:
<jpa:repositories base-package="com.foobar" />
Run Code Online (Sandbox Code Playgroud)
您使用com.foobar
是因为您拥有CustomerRepository
相同的包.Spring Data基础结构现在无法告诉它MyBaseRepository
不是具体的存储库接口,而是充当中间存储库来公开其他方法.因此它会尝试为它创建一个存储库代理实例并失败.您现在可以使用@NoRepositoryBean
来注释此中间接口以基本上告诉Spring Data:不要为此接口创建存储库代理bean.
这种情况也是为什么CrudRepository
并且也PagingAndSortingRepository
带有这个注释的原因.如果软件包扫描意外地选择了这些(因为你不小心这样配置了),引导程序就会失败.
简而言之:使用注释来防止存储库接口被选为候选者,最终最终成为存储库bean实例.
我们可以声明一个新接口作为我们的自定义方法:
@NoRepositoryBean
public interface ExtendedRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
List<T> findByAttributeContainsText(String attributeName, String text);
}
Run Code Online (Sandbox Code Playgroud)
我们的接口扩展了 JpaRepository 接口,以便我们可以从所有标准行为中受益。
您还会注意到我们添加了 @NoRepositoryBean 注释。这是必要的,因为否则,默认的 Spring 行为是为 Repository 的所有子接口创建一个实现。
public interface ExtendedStudentRepository extends ExtendedRepository<Student, Long> {
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
27367 次 |
最近记录: |