Java 弹簧靴。获取bean作为对本地bean方法调用的响应

Java 弹簧靴。获取bean作为对本地bean方法调用的响应,java,spring,spring-boot,Java,Spring,Spring Boot,我在@Configuration类上工作,masterTransactionManagerbean需要注入masterDataSourcebean。我找到了一个例子,但它不起作用 这里是简化的示例类 @Configuration public class MasterDataSourceConfig { @Bean @Primary public DataSource masterDataSource() { DruidDataSource dataSou

我在
@Configuration
类上工作,
masterTransactionManager
bean需要注入
masterDataSource
bean。我找到了一个例子,但它不起作用

这里是简化的示例类

@Configuration
public class MasterDataSourceConfig {
    @Bean
    @Primary
    public DataSource masterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        ...
        return dataSource;
    }

    @Bean
    @Primary
    public DataSourceTransactionManager masterTransactionManager() {

        /*
        * Spring not injects bean here, instead
        * it just get new instance
        * of DataSource object
        */
        return new DataSourceTransactionManager(masterDataSource());
    }
}
我可以通过传递bean引用作为参数来解决这个问题:

@Bean
@Primary
public DataSourceTransactionManager masterTransactionManager(
    @Qualifier("schmodelAuditDataSource") DataSource dataSource) {

    /*
    * Now bean injected, and everything works as it should
    */
    return new DataSourceTransactionManager(dataSource);
}
现在的问题是:它如何工作呢?我以前从未见过Spring可以像第一个示例中那样在方法调用时返回bean。这是获取bean的正确解决方案吗?如果这是一个合适的电话,那么为什么它对我不起作用呢

我找不到很多关于这种bean调用方法的信息,尽管在线程中提到它应该可以工作。而我的情况并非如此

更新:我看到了什么错误

我在第一种情况下得到的错误是

查询数据库时出错。原因:org.springframework.jdbc.CannotGetJdbcConnectionException

同样在调试模式下,我看到Springbean初始化调用上的bean实例与我的类调用
masterDataSource()
方法时返回的实例不同


应用程序启动时没有错误。我在开始使用实例化的bean(将数据写入数据库)时出错。我认为这是由于调用
masterDataSource()

时返回了不正确的bean(是否是bean,不确定)的结果。在回答问题之前,我需要澄清什么是
Autowiring

Spring在
应用程序上下文中管理他们的bean和生命周期,后者是一个容器<代码>应用程序上下文
是一个包含bean的容器。 当应用程序上下文引导时,bean也通过其定义的(单例原型请求会话全局会话)实例化

Spring的默认作用域是singleton,指它立即实例化并在应用程序上下文中共享对象(通常是缓存对象)

Autowire会将一个bean实例注入到另一个bean中。这意味着我们注入的位置和注入的内容都应该是bean,并且都位于
SpringIoC容器中(应用程序上下文)

现在来问你一个问题。如果您自动连接一个bean,实际上您的实例化对象(由spring实例化)设置在这里。如果您在示例中调用一些方法,如
masterDataSource()
:-

@Bean
@Primary
public DataSource masterDataSource() {
    DruidDataSource dataSource = new DruidDataSource();
    ...
    return dataSource;
}

@Bean
@Primary
public DataSourceTransactionManager masterTransactionManager() {
    return new DataSourceTransactionManager(masterDataSource());
}
然后
masterDataSource()
还创建一个新对象,并将其设置(注入)为
DataSourceTransactionManager
constructor


所以底线是,如果您使用了
@Autowired
,那么您就得到了spring管理的(生命周期)bean/object,如果您调用了
masterDataSource()
,那么您只需在spring管理的object之外创建一个新的对象。

在回答问题之前,我需要澄清什么是
Autowiring

Spring在
应用程序上下文中管理他们的bean和生命周期,后者是一个容器<代码>应用程序上下文
是一个包含bean的容器。 当应用程序上下文引导时,bean也通过其定义的(单例原型请求会话全局会话)实例化

Spring的默认作用域是singleton,指它立即实例化并在应用程序上下文中共享对象(通常是缓存对象)

Autowire会将一个bean实例注入到另一个bean中。这意味着我们注入的位置和注入的内容都应该是bean,并且都位于
SpringIoC容器中(应用程序上下文)

现在来问你一个问题。如果您自动连接一个bean,实际上您的实例化对象(由spring实例化)设置在这里。如果您在示例中调用一些方法,如
masterDataSource()
:-

@Bean
@Primary
public DataSource masterDataSource() {
    DruidDataSource dataSource = new DruidDataSource();
    ...
    return dataSource;
}

@Bean
@Primary
public DataSourceTransactionManager masterTransactionManager() {
    return new DataSourceTransactionManager(masterDataSource());
}
然后
masterDataSource()
还创建一个新对象,并将其设置(注入)为
DataSourceTransactionManager
constructor


所以底线是,如果您使用了
@Autowired
,那么您得到了spring管理的(生命周期)bean/object,如果您调用了
masterDataSource()
,那么您只需在spring管理的object之外创建一个新对象。

如果您注入了一个bean,那么在spring中使用
@Autowired
@inject
注释,但我问的问题不同。像masterDataSource()这样的方法调用怎么能返回bean,而不仅仅是新的对象实例呢?第一种情况显示了什么错误?请参阅我的带有错误描述的更新帖子如果您注入bean,然后在spring中使用
@Autowired
@inject
注释。好的,我使用这个,但我问的问题不同。像masterDataSource()这样的方法调用如何返回bean,而不是只返回新的对象实例?第一种情况显示了什么错误?请参阅我的更新后的错误描述