在Spring中传递Bean依赖关系的首选方法是什么

迈克尔·里斯

在阅读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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JMS的spring boot依赖关系是什么?

Spring Boot中的分层Bean依赖关系

R中的“反向依赖关系”是什么?

Spring进行依赖注入的最小依赖关系是什么?

在Spring MVC 3中指定HTTP“位置”响应标头的首选方法是什么?

在Django中建立具有深层依赖关系的数据库的正确方法是什么?

在Gradle中排除埋葬依赖关系的最佳方法是什么?

解决Java项目之间的依赖关系的最佳方法是什么?

在Laravel Eloquent中传递参数的最佳方法是什么,关系(方法)以及它之间的区别是什么

Maven中的依赖关系:ejb类型的作用是什么?

在 Hibernate 中存储坐标 (x,y) 的首选方法是什么?

在Django中访问设置信息的首选方法是什么?

在Express中存储环境/配置变量的首选方法是什么?

在猫鼬中定义数组的首选方法是什么?

从Python中的多个列表组成集合的首选方法是什么

在Spring MVC中,bean反序列化和验证所涉及的对象之间是什么关系?

Gradle传递依赖中的“ all * .exclude”是什么意思?

Spring Javaconfig Bean间依赖关系

在Spring Boot和JPA中更新n-m关系的正确方法是什么?

OSGi与依赖注入之间的关系是什么

Go同步goroutine的首选方法是什么

投放图片的首选方法是什么

实现hashCode()的首选方法是什么?

角度-终止Observable的首选方法是什么?

JSXGraph:标记轴的首选方法是什么?

定义一个 bean 的正确方法是什么,该 bean 包含从 Spring 中的映射创建的对象列表

Spring无法解析List类型的bean的@Bean依赖关系?

UML中首选的组合或聚合是什么?

Kotlin Spring Boot教程中的Web依赖是什么?