首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据Spring的bean定义bean

根据Spring的bean定义bean
EN

Stack Overflow用户
提问于 2017-06-06 11:34:16
回答 2查看 224关注 0票数 0

当使用Spring时,很多bean都是由Spring本身隐式创建的。例如,当我链接spring-boot-starter-data-redis依赖项时,jedisConnectionFactory bean将自动在幕后创建。

我所要寻找的是用依赖于这样一个隐式bean (例如new MyService( jedisConnectionFactory ) )来定义自定义bean的方法。问题是,我没有一个变量或方法来解决这个隐式bean。

现在,我已经提出了以下解决方案:创建一个单独的BeanConfig类,将ApplicationContext注入其中,然后使用ApplicationContext.getBean( Class )方法调用检索所需的bean:

代码语言:javascript
复制
@Bean
public Transport eventTransport() {
    final JedisConnectionFactory jedisConnectionFactory = context.getBean( JedisConnectionFactory.class );
    return new RedisTransport( jedisConnectionFactory.getHostName(), jedisConnectionFactory.getPort() );
}

是否有任何集成的方法来获得对内部定义的bean的引用?这样,我就可以将这个bean定义移动到MyApplication类中,而无需注入ApplicationContext实例。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-06 12:51:33

首先,作为经验规则,如果您开始使用ApplicationContextBeanFactory来获取bean,一般来说,您做错了(至少在使用Spring开发应用程序时是如此)。

当在方法上使用@Bean,有效地使它成为那些bean的工厂方法时,您可以使用0或更多的方法参数。(这在参考指南中也有解释)。参数将根据上下文进行解析,并将注入bean(如果找不到就会失败)。

因此,在您的示例中,您可以简单地添加JedisConnnectionFactory (或者可能是ConnectionFactory接口)作为eventTransport方法的方法参数。

代码语言:javascript
复制
@Bean
public Transport eventTransport(final JedisConnectionFactory jedisConnectionFactory) {
    return new RedisTransport( jedisConnectionFactory.getHostName(), jedisConnectionFactory.getPort() );
}

这还允许Spring解决bean之间的依赖关系,而不是希望bean已经构建并完全可以使用。

票数 2
EN

Stack Overflow用户

发布于 2017-06-06 11:41:51

如果JedisConnectionFactory类被spring实例化,那么您可以简单地在类级别上对该实例进行autowire,并使用同样的方法创建RedisTransport对象。

代码语言:javascript
复制
@Autowired
private JedisConnectionFactory jedisConnectionFactory;

@Bean
public Transport eventTransport() {
    return new RedisTransport( jedisConnectionFactory.getHostName(), jedisConnectionFactory.getPort() );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44388939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档