Java 根据Spring定义bean';黄豆

Java 根据Spring定义bean';黄豆,java,spring,spring-boot,dependency-injection,Java,Spring,Spring Boot,Dependency Injection,当使用SpringBoot时,很多bean都是由SpringBoot本身隐式创建的。例如,当我链接spring boot starter数据redis依赖项时,会在引擎盖下自动创建jedisConnectionFactorybean 我要寻找的是一种定义自定义bean的方法,它依赖于这样一个隐式bean,例如newmyservice(jedisConnectionFactory)。问题是我没有一个变量或方法可以解析为隐式bean 目前,我提出了以下解决方案:创建一个单独的BeanConfig类,

当使用SpringBoot时,很多bean都是由SpringBoot本身隐式创建的。例如,当我链接
spring boot starter数据redis
依赖项时,会在引擎盖下自动创建
jedisConnectionFactory
bean

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

目前,我提出了以下解决方案:创建一个单独的
BeanConfig
类,将
ApplicationContext
自动连接/注入,然后使用方法调用检索所需的bean:

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

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

如果
JedisConnectionFactory
类被spring实例化,那么您只需在类级别上
autowire
这个实例,并使用它来创建
redisport
对象

@Autowired
private JedisConnectionFactory jedisConnectionFactory;

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

如果
JedisConnectionFactory
类被spring实例化,那么您可以在类级别简单地
autowire
该实例,并使用该实例创建
redisport
对象

@Autowired
private JedisConnectionFactory jedisConnectionFactory;

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

首先,根据经验,如果您开始使用
ApplicationContext
BeanFactory
来获取bean,那么一般来说,您的做法是错误的(至少在使用Spring开发应用程序时是错误的)

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

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

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

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

首先,如果您开始求助于
ApplicationContext
BeanFactory
来获取bean,那么一般来说,您的做法是错误的(至少在使用Spring开发应用程序时是这样)

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

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

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

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

只需将它们添加为
@bean
方法的方法参数。
公共交通事件传输(JedisConnectionFactory connectionFactory)
。通常,当您需要依赖
应用程序上下文
(或
BeanFactory
)来检索bean时,一般来说,您的做法是错误的(如果您不是框架/扩展开发人员的话)。@M.Deinum是的,我了解如何使用上下文,这就是为什么问:)我认为定义方法参数正是我想要的,所以如果您将其作为答案发布,我将接受它。谢谢只需将它们添加为
@Bean
方法的方法参数<代码>公共交通事件交通(JedisConnectionFactory connectionFactory)。通常,当您需要依赖
ApplicationContext
(或
BeanFactory
)来检索bean时,一般来说,您的做法是错误的(如果您不是框架/扩展开发人员的话)。@M.Deinum是的,我知道如何使用上下文,这就是为什么问:)我认为定义方法参数正是我想要的,所以如果你把它作为一个答案发布,我会接受它。谢谢更好的是,把它作为一个方法参数,这样Spring就能更好地确定bean的顺序。更好的是,把它作为一个方法参数,通过这种方式,Spring能够更好地确定bean的顺序。特别感谢文档链接——不知何故,我自己没有找到它。特别感谢文档链接——不知何故,我自己没有找到它