使用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
实例。
答案 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() );
}