在阅读Spring框架的文档时,我偶然发现了两种不同的在工厂方法中传递Bean依赖关系的样式。第一个是这样的(直接使用依赖项的工厂方法):
@Configuration
public class MessagingConfiguration {
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
return connectionFactory;
}
@Bean
public RabbitTemplate rabbitTemplate() {
return new RabbitTemplate(connectionFactory());
}
}
第二个看起来像这样(在工厂方法中将依赖项作为参数注入):
@Configuration
public class MessagingConfiguration {
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
return connectionFactory;
}
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
return new RabbitTemplate(connectionFactory);
}
}
我想知道两种解决方案的优点和缺点是什么,哪一种更可取?
在正常使用情况下,两种方法之间应该不会有太大的区别。但是,如果要将配置分成多个类,则不能简单地使用第一个解决方案。假设您要将两个@Bean方法放入单独的类中,并通过@Import将第一个方法导入第二个方法中,则编译器没有机会知道RabbitTemplate(connectionFactory()中第一个类的connectionFactory()方法。 ))第二类的构造函数。因此,您将遇到编译器错误。要解决此问题,可以使用spring文档推荐的第二种方法:注入对导入的@Bean定义的依赖项
注入对导入的@Bean定义的依赖
上面的示例有效,但过于简单。在大多数实际情况下,Bean在配置类之间将相互依赖。当使用XML时,这本身就不是问题,因为不涉及编译器,并且可以简单地声明ref =“ someBean”并相信Spring会在容器初始化期间解决这个问题。当然,当使用@Configuration类时,Java编译器会对配置模型施加约束,因为对其他bean的引用必须是有效的Java语法。
幸运的是,解决这个问题很简单。正如我们已经讨论的那样,@Bean方法可以具有任意数量的描述Bean依赖关系的参数。让我们考虑一个带有多个@Configuration类的更真实的场景,每个类都依赖于其他声明的bean:
@Configuration
public class ServiceConfig {
@Bean
public TransferService transferService(AccountRepository accountRepository) {
return new TransferServiceImpl(accountRepository);
}
}
@Configuration
public class RepositoryConfig {
@Bean
public AccountRepository accountRepository(DataSource dataSource) {
return new JdbcAccountRepository(dataSource);
}
}
@Configuration
@Import({ServiceConfig.class, RepositoryConfig.class})
public class SystemTestConfig {
@Bean
public DataSource dataSource() {
// return new DataSource
}
}
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SystemTestConfig.class);
// everything wires up across configuration classes...
TransferService transferService = ctx.getBean(TransferService.class);
transferService.transfer(100.00, "A123", "C456");
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句