根据Spring的bean

时间:2017-06-06 11:34:17

标签: java spring spring-boot dependency-injection

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

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

目前我已经提出了以下解决方案:创建一个单独的BeanConfig类,autowire / inject 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实例。

2 个答案:

答案 0 :(得分:2)

首先作为经验法则,如果你开始诉诸class SomeClass2(): def func2(self): obj = SomeClass1() a = SomeClass1.func1(obj, "string") # this will help you understand the meaning of `self` as parameters inside those functions. ApplicationContext获取bean,一般来说,做错了(至少在使用Spring开发应用程序时) 。

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

因此,在您的情况下,您只需添加@Bean(或可能是JedisConnnectionFactory接口)作为ConnectionFactory方法的方法参数。

eventTransport

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

答案 1 :(得分:0)

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

@Autowired
private JedisConnectionFactory jedisConnectionFactory;

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