如果我在配置类上使用@ActiveProfiles注释而不是在定义我的bean的类上使用它,那么在Spring中会发生什么?

我正在攻读Spring Core认证,我对将配置文件用于JUnit测试有一些疑问。

所以我知道如果我按以下方式编写一个类:

@Profile("stub") @Repository public class StubAccountRepository implements AccountRepository { private Logger logger = Logger.getLogger(StubAccountRepository.class); private Map accountsByCreditCard = new HashMap(); /** * Creates a single test account with two beneficiaries. Also logs creation * so we know which repository we are using. */ public StubAccountRepository() { logger.info("Creating " + getClass().getSimpleName()); Account account = new Account("123456789", "Keith and Keri Donald"); account.addBeneficiary("Annabelle", Percentage.valueOf("50%")); account.addBeneficiary("Corgan", Percentage.valueOf("50%")); accountsByCreditCard.put("1234123412341234", account); } public Account findByCreditCard(String creditCardNumber) { Account account = accountsByCreditCard.get(creditCardNumber); if (account == null) { throw new EmptyResultDataAccessException(1); } return account; } public void updateBeneficiaries(Account account) { // nothing to do, everything is in memory } } 

我声明属于存根配置文件的服务bean

所以,如果我的测试类是这样的:

 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes=TestInfrastructureConfig.class) @ActiveProfiles("stub") public class RewardNetworkTests { ..................................... ..................................... ..................................... } 

这意味着它将使用属于存根配置文件的bean bean和没有配置文件的bean。 是对的还是我错过了什么?

如果在类(其实例将是一个Spring bean)上使用@ActiveProfiles注释,我会在Java配置类上使用它会发生什么?

喜欢它的东西:

 @Configuration @Profile("jdbc-dev") public class TestInfrastructureDevConfig { /** * 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(); } } 

到底是做什么的? 我认为这个类中配置的所有bean都属于jdbc-dev配置文件,但我不确定。 你能给我更多关于这件事的信息吗?

为什么我必须在**配置类*上使用@Profile注释而不是直接注释我的bean?

TNX

如果查看ActiveProfiles注释的JavaDoc,它包含以下文本:

ActiveProfiles是一个类级别注释,用于声明在为测试类加载ApplicationContext时应使用哪些活动Bean定义概要文件。

这意味着它只应该用于为测试类声明活动的Spring配置文件。 所以如果将它放在Configuration类上它应该没有效果。

至于@Profile注释,它可以在方法和类级别上使用。 如果在配置类中使用@Bean注释的方法上使用它,则只有该bean属于该配置文件。 如果在配置类上使用它,它将应用于配置类中的所有bean,如果在@Component类上使用它,则配置文件将应用于该类所表示的bean。

@Profile注释JavaDoc提供了有关这些规则的更详细说明。

为什么我必须在**配置类*上使用@Profile注释而不是直接注释我的bean?

好吧,如果给定配置类中的所有bean都应该仅对某些配置文件处于活动状态,那么在配置类上全局声明它是有意义的,以避免必须在所有bean上单独指定配置文件。 但是,如果你要注释所有的个体豆,它也会起作用。