如何调用Spring Framework存储库方法

时间:2019-01-15 17:05:17

标签: java spring jpa

我知道这里有类似的问题,但没有一个对我有帮助。我一直遵循this tutorial,而我无法确定的部分是:

@SpringBootApplication
public class Application {

    private static final Logger log = 
    LoggerFactory.getLogger(Application.class);

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }

    @Bean
    public CommandLineRunner demo(CustomerRepository repository) {
        return (args) -> {
            // save a couple of customers
            ...
            // more lines, etc...

我不明白的是 传递到repository的{​​{1}}来自哪里。我知道demo注释可以做类似的事情,但是这里根本不使用它。

我问的更具体的原因是因为我正在尝试将他们在此处所做的事情适应我正在处理的应用程序。我有一个与所有持久性/存储库相关的类,并且我想调用诸如Autowiredsave之类的存储库方法。问题在于存储库是一个findAll,因此我无法实例化该存储库的对象来调用方法。那么,我是否必须创建一个interface接口的新类并创建该对象的对象?还是有使用注释的简便方法?

3 个答案:

答案 0 :(得分:1)

在创建@Bean时,将存储库添加到bean的参数中足以将存储库连接到bean中。就像在类内添加@Autowired或类似注释的类中添加@Component注释一样。

Spring主要与接口一起工作,因为它相对于接线与接线具体类更简单。

答案 1 :(得分:0)

您可以在类声明之前尝试@Repository吗?在Spring MVC结构中为我工作。

@Repository
public class EntityDAOImpl implements EntityDAO{
...
}

答案 2 :(得分:0)

值得一提的是,在启动时,Spring Boot应用程序旨在解决其依赖关系树。这意味着发现并实例化应用程序定义的Bean,这些Bean是用@ Service,@ Repository等注释的类。

这意味着将调用所有bean的默认构造函数(或标有@Autowire的构造函数),并在构造完所有bean之后,应用程序开始运行。

@Bean注释起作用的地方是,如果您有一个在编译时不知道其构造函数参数值的Bean(例如,如果您想插入“起始于”时间戳),那么您将定义一个带有@Configuration批注的类,并在其中公开@Bean方法,该方法将返回您的bean,并具有作为bean依赖项的参数。在其中,您将调用bean构造函数并返回bean。

现在,如果希望在应用程序解析后调用某个类的某个方法,则可以实现CommandLineRunner接口,也可以使用@PostConstruct注释方法。

一些有用的链接/参考:

  1. https://docs.spring.io/spring-javaconfig/docs/1.0.0.m3/reference/html/creating-bean-definitions.html

  2. https://www.baeldung.com/spring-inject-prototype-bean-into-singleton

  3. Running code after Spring Boot starts
  4. Execute method on startup in Spring