当前位置: 首页 > 知识库问答 >
问题:

这两个Spring Java配置类是如何协同工作的?

暨修洁
2023-03-14

我正在为Spring Core认证学习,对于使用Java配置方式配置Bean的相关练习,我有以下疑问。

package config;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import rewards.RewardNetwork;
import rewards.internal.RewardNetworkImpl;
import rewards.internal.account.AccountRepository;
import rewards.internal.account.JdbcAccountRepository;
import rewards.internal.restaurant.JdbcRestaurantRepository;
import rewards.internal.restaurant.RestaurantRepository;
import rewards.internal.reward.JdbcRewardRepository;
import rewards.internal.reward.RewardRepository;

@Configuration
public class RewardsConfig {

    @Autowired
    DataSource dataSource;

    @Bean
    public RewardNetwork rewardNetwork(){
        return new RewardNetworkImpl(accountRepository(), restaurantRepository(), rewardRepository());
    }

    @Bean
    public AccountRepository accountRepository(){
        JdbcAccountRepository repository = new JdbcAccountRepository();
        repository.setDataSource(dataSource);
        return repository;
    }

    @Bean
    public RestaurantRepository restaurantRepository(){
        JdbcRestaurantRepository repository = new JdbcRestaurantRepository();
        repository.setDataSource(dataSource);
        return repository;
    }

    @Bean
    public RewardRepository rewardRepository(){
        JdbcRewardRepository repository = new JdbcRewardRepository();
        repository.setDataSource(dataSource);
        return repository;
    }

}

Java配置的正确解释是Spring吗?

例如,我可以说RewardNetwork是声明的bean,而RewardNetworkImpl是这个bean的当前实现吗?

所有的3Beans(AccountRepository,RestaurantRepository和RewardRepository)都依赖于另一个bean数据源,正如您在前面的代码片段中看到的,该数据源声明为@AutoWired:

@Autowired
DataSource dataSource;

因此,在我的示例中,它被声明到单元测试文件夹src/test/java:

package rewards;

import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;

@Configuration
public class TestInfrastructureConfig {

    /**
     * Creates an in-memory "rewards" database populated 
     * with test data for fast testing
     */
    @Bean
    public DataSource dataSource(){
        return
            (new EmbeddedDatabaseBuilder())
            .addScript("classpath:rewards/testdb/schema.sql")
            .addScript("classpath:rewards/testdb/test-data.sql")
            .build();
    }   
}

因此dataSource bean定义了一个仅对测试环境有效的数据源(在执行单元测试时使用)。

现在我的疑问是:我有两个不同的配置类,而dataSource bean没有定义到RewardsConfig配置类中,而RewardsConfig配置类包含使用它的3个bean。为什么我不能不使用@import注释将其用于rewardsconfig?

@Import(TestInfrastructureConfig.class)

共有1个答案

段干飞翮
2023-03-14

您不必导入bean来使它们可用于自动生成。@import用于添加额外的配置类。

您真的不想硬导入一个测试配置类,因为这样您的生产代码就引用了仅测试的代码(并且,在这种情况下,总是激活它)。相反,把您的配置类想得更像一个抽象类:声明autowired bean,但不要担心它们是如何到达那里的。下游(运行时)配置将提供它们,您不需要知道如何提供。也许您提供了一个内存中的H2来测试并在实际运行中使用Spring Cloud连接器,这并不重要。

 类似资料:
  • 在Spring Hibernate XML配置中,我有 我知道SpringJava配置的等价物如下:LocalSessionFactoryBuilder(dataSource())。AddAnnotatedClass(Foo.class)。buildSessionFactory(); 我的问题是,如果我不使用LocalSessionFactoryBuilder类,而是使用HibernateJpaV

  • 问题内容: 我有一份詹金斯工作,后来被克隆和修改。现在,我想比较两个作业的配置。不是历史更改,不是结果,而是两个作业的配置。 是否可以比较两个Jenkins作业的配置? 问题答案: 尝试: 要么

  • 这是来自SQLZOO.NET的问题

  • 我打算在Hardhat中开发我的智能合约,并在RSK regtest本地节点上测试它们。我找到了一个松露测试配置。 我需要什么配置来在RSK regtest上运行我的测试?

  • 我正在使用Spring Boot 2。使用Hibernate 5连接不同服务器上的两个不同的MySQL数据库(Bar和Foo)。我试图从REST Controller中的方法列出实体的所有信息(自己的属性和@OneToOne和@ManyToOne关系)。 我已经遵循了几个教程来做到这一点,因此,我能够获得我的数据库(Foo)的所有信息,但是,当检索集时,我总是得到我的辅助数据库(Bar)的异常。如

  • 我试图了解mysql查询在GROUP BY和不使用GROUP BY的情况下是如何工作的。 假设我有一个FILM_ACTORS表,其中每个ACTOR_ID都有一个相应的film_id。于是同一个演员参演了N部不同的电影。 我想选出参与20部电影的演员: 这个查询起作用,并返回参与20部电影的actor_id。但如果我只是: 为什么该查询仅在我将其等于film_actor表(5463)的大小时才返回值