【问题标题】:Define bean depending on Spring's bean根据 Spring 的 bean 定义 bean
【发布时间】:2017-06-06 11:34:16
【问题描述】:

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

我正在寻找的是定义我的自定义 bean 的方式,它依赖于这样一个隐式 bean,例如new MyService( jedisConnectionFactory )。问题是我没有可以解析为该隐式 bean 的变量或方法。

现在我想出了以下解决方案:创建一个单独的BeanConfig 类,将ApplicationContext 自动装配/注入到其中,然后使用ApplicationContext.getBean( Class<T> ) 方法调用检索所需的bean:

@Bean
public Transport eventTransport() {
    final JedisConnectionFactory jedisConnectionFactory = context.getBean( JedisConnectionFactory.class );
    return new RedisTransport( jedisConnectionFactory.getHostName(), jedisConnectionFactory.getPort() );
}

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

【问题讨论】:

  • 只需将它们添加为@Bean 方法的方法参数即可。 public Transport eventTransport(JedisConnectionFactory connectionFactory)。通常,当您需要依靠 ApplicationContext(或 BeanFactory)来检索 bean 时,一般来说,您做错了(如果您不是框架/扩展开发人员)。
  • @M.Deinum 是的,我明白使用上下文,这就是为什么要问:) 我认为定义方法参数是我想要的,所以如果你把它作为答案发布我会接受的。谢谢!

标签: java spring spring-boot dependency-injection


【解决方案1】:

首先根据经验,如果您开始求助于ApplicationContextBeanFactory 来获取bean,一般来说,您做错了(至少在简单地使用Spring 开发应用程序时)。

在方法上使用@Bean 时,有效地使其成为这些bean 的工厂方法,您可以使用0 个或多个方法参数。 (这在reference guide 中也有解释)。参数根据上下文解析,并将注入 bean(如果找不到,则启动失败)。

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

@Bean
public Transport eventTransport(final JedisConnectionFactory jedisConnectionFactory) {
    return new RedisTransport( jedisConnectionFactory.getHostName(), jedisConnectionFactory.getPort() );
}

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

【讨论】:

  • 特别感谢文档链接 - 不知何故,我自己没能找到
【解决方案2】:

如果JedisConnectionFactory 类被spring 实例化,那么您可以在类级别简单地autowire 这个实例并使用它来创建RedisTransport 对象。

@Autowired
private JedisConnectionFactory jedisConnectionFactory;

@Bean
public Transport eventTransport() {
    return new RedisTransport( jedisConnectionFactory.getHostName(), jedisConnectionFactory.getPort() );
}

【讨论】:

  • 更好的是,把它作为方法参数,这样Spring能够更好地确定bean的顺序。
猜你喜欢
  • 1970-01-01
  • 2014-02-21
  • 2011-06-29
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 2016-03-18
相关资源
最近更新 更多