当使用Spring时,很多bean都是由Spring本身隐式创建的。例如,当我链接spring-boot-starter-data-redis依赖项时,jedisConnectionFactory bean将自动在幕后创建。
我所要寻找的是用依赖于这样一个隐式bean (例如new MyService( jedisConnectionFactory ) )来定义自定义bean的方法。问题是,我没有一个变量或方法来解决这个隐式bean。
现在,我已经提出了以下解决方案:创建一个单独的BeanConfig类,将ApplicationContext注入其中,然后使用ApplicationContext.getBean( Class )方法调用检索所需的bean:
@Bean
public Transport eventTransport() {
final JedisConnectionFactory jedisConnectionFactory = context.getBean( JedisConnectionFactory.class );
return new RedisTransport( jedisConnectionFactory.getHostName(), jedisConnectionFactory.getPort() );
}是否有任何集成的方法来获得对内部定义的bean的引用?这样,我就可以将这个bean定义移动到MyApplication类中,而无需注入ApplicationContext实例。
发布于 2017-06-06 12:51:33
首先,作为经验规则,如果您开始使用ApplicationContext或BeanFactory来获取bean,一般来说,您做错了(至少在使用Spring开发应用程序时是如此)。
当在方法上使用@Bean,有效地使它成为那些bean的工厂方法时,您可以使用0或更多的方法参数。(这在参考指南中也有解释)。参数将根据上下文进行解析,并将注入bean(如果找不到就会失败)。
因此,在您的示例中,您可以简单地添加JedisConnnectionFactory (或者可能是ConnectionFactory接口)作为eventTransport方法的方法参数。
@Bean
public Transport eventTransport(final JedisConnectionFactory jedisConnectionFactory) {
return new RedisTransport( jedisConnectionFactory.getHostName(), jedisConnectionFactory.getPort() );
}这还允许Spring解决bean之间的依赖关系,而不是希望bean已经构建并完全可以使用。
发布于 2017-06-06 11:41:51
如果JedisConnectionFactory类被spring实例化,那么您可以简单地在类级别上对该实例进行autowire,并使用同样的方法创建RedisTransport对象。
@Autowired
private JedisConnectionFactory jedisConnectionFactory;
@Bean
public Transport eventTransport() {
return new RedisTransport( jedisConnectionFactory.getHostName(), jedisConnectionFactory.getPort() );
}https://stackoverflow.com/questions/44388939
复制相似问题