注入Spring存储库及其提供的类

时间:2015-11-30 15:44:27

标签: java spring spring-data

有没有办法提取所有Repositories以及他们提供的Class<T>

我有一些Repositories使用限定符注释:

@NetworkDataProvider
@Repository
public interface SwitchRepository extends CrudRepository<Switch, SwitchPK>

他们提供的bean使用元数据进行注释,元数据定义了它们在GUI中的显示方式:

@Entity
@Table(...)
public class Switch implements Serializable {

    @Column(name = "switch_name")
    @NotNull
    @UIName(value = "name of switch")
    @UIPrio(value = 2)
    private String name;

现在我必须提取所有存储库及其相应的类:

@Autowired
@NetworkDataProvider
List<Repository<?>> repositories;

public List<RepositoryClassTuple> getAllNetworkDataProvider() {
    return repositories.map(r -> 
        new RepositoryClassTuple(r, /* how to do this */ r.getProidedClass())).asList();
}

有没有办法做到这一点?我真的需要存储库提供的数据bean的注释。

3 个答案:

答案 0 :(得分:3)

您可以定义界面:

public interface NetworkRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {

    Class<T> getType();

}

然后你可以定义你的实现:

public interface PersonRepository extends NetworkRepository<Person, Long> {

    @Override
    default Class<Person> getType() {
        return Person.class;
   }
}

public interface AnimalRepository extends NetworkRepository<Animal, Long> {

    @Override
    default Class<Animal> getType() {
        return Animal.class;
   }
}

然后把它们全部拿走:

@Autowired
Collection<NetworkRepository> networkRepositories;

最后,您可以使用getType()方法获取课程信息。

重要事项:您必须在NetworkRepository无法扫描的软件包中声明Spring Data

答案 1 :(得分:2)

您可以创建名为MyRepository

的界面
public interface MyRepository{

}

然后,所有存储库类都必须实现您的接口:

@Repository("foo")
public class FooExample implements MyRepository{

}

@Repository("bar")
public class BarExample implements MyRepository{

}

最后,您可以注入MyRepository bean的映射:

@Component
public class ExampleConsumer {

    private final Map<String, MyRepository> repositories;

    @Autowired
    public ExampleConsumer(Map<String, MyRepository> repositories) {
        this.examples = examples;
    }
}

在这种情况下,地图将包含两个条目:

&#34;富&#34; - &GT; FooExample实例

&#34;杆&#34; - &GT; BarExample实例

另一种方法是使用java Reflection来读取注释

Class aClass = TheClass.class;
Annotation annotation = aClass.getAnnotation(MyAnnotation.class);

if(annotation instanceof MyAnnotation){
    MyAnnotation myAnnotation = (MyAnnotation) annotation;
    System.out.println("name: " + myAnnotation.name());
    System.out.println("value: " + myAnnotation.value());
}

这里有一个教程

http://tutorials.jenkov.com/java-reflection/annotations.html

答案 2 :(得分:2)

Spring Data有一个名为Repositories的类型,它带有ListableBeanFactory,然后可用于检查存储库:

Repositories repositories = new Repositories(beanFactory);

for (Class<?> domainType : repositories) {
  RepositoryInformation info = repositories.getRepositoryInformationFor(domainType);
  …
}

我仍然想知道为什么你需要搞砸这种低级别的东西。真正的应用程序代码应该没什么。