带有 Autowired Spring JPA bean 的 Vaadin 构造函数

Vaadin constructor with Autowired Spring JPA beans

我有一个 Spring 启动应用程序

@SpringBootApplication
public class TaxApplication {

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

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

我已经使用 Spring JPA 进行数据访问

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.show-sql=true

我已经为帐户设置了一个 JPA 存储库 table:

public interface AccountRepository extends JpaRepository<Account, Long> {

    List<Account> findByNameStartsWithIgnoreCase(String name);
}

在我的 MainView 中,AccountRepository 没有被 Spring 框架获取 @Autowired

我可以通过构造函数注入获取它的一个实例:

public MainView(AccountRepository accountRepository) {
}

但是如果我尝试使用自动装配构造函数输出 'null'

@Route
@Configurable
@PageTitle("Basic App Layout")
@CssImport(value = "combobox-styles.css", themeFor="vaadin-combo-box-overlay")
public class MainView extends AppLayout {
    
    @Autowired
    AccountRepository accountRepository;
    
    public MainView() {
        
        System.out.println(accountRepository);
    }
}

这是因为代码是从MainView Constructor调用的吗?我们如何将 Autowired JPA bean 与 Vaadin 一起使用?

编辑: 我已将@EnableJpaRepositories 添加到应用程序,但自动装配仍然失败

@SpringBootApplication
@EnableJpaRepositories(basePackages= {"org.mypackage.tax.repo"})
public class TaxApplication {

您可以尝试将 @EnableJpaRepositories 注释添加到您的 TaxApplication class

将此添加到您的申请中 TaxApplication:

@EnableJpaRepositories(basePackages= {"com.tax.persistence"})

com.tax.persistence 是包含您的存储库的包。

您也可以用 @Component 注释 MainView 使其成为 Spring bean。

这就是 Spring 中自动装配的工作原理。

使用构造函数注入时,只要只有一个构造函数,就可以省略 @Autowired 注解,但它仍然是自动装配的。

当您使用字段或设置器时,将在构建 bean 后注入依赖项。这与 Vaadin 无关。

构造函数注入通常优于字段注入。它使 class 更容易测试,因为您可以在自己实例化时轻松地将模拟或存根传递给构造函数。