繁体   English   中英

春季启动。 获取bean作为对本地bean方法调用的响应

[英]Spring Boot. Get bean as response to local bean method call

我在工作@Configuration类和masterTransactionManager豆需要被注入masterDataSource豆。 我找到了示例https://www.codeday.top/2017/07/08/31074.html ,但它不起作用。

这里简化示例类

@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);
}

现在的问题是: new DataSourceTransactionManager(masterDataSource())如何工作? 我从未见过像第一个示例中那样Spring可以在方法调用上返回bean。 这是获取bean的适当解决方案吗? 如果这个电话正确,那为什么对我不起作用?

尽管在将Spring boot bean插入线程注入方法中提到它应该可以工作,但我无法找到有关此类bean调用方法的很多信息。 在我看来,事实并非如此。

更新:我看到什么错误

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

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

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

该应用程序启动没有错误。 开始使用实例化的bean(将数据写入数据库)时出现错误。 我认为这是调用masterDataSource()时返回不正确的bean(是否完全是bean,不确定masterDataSource()

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

Spring在作为容器的application context管理其bean和生命周期。 Application context是一个包含bean的容器。 当应用程序上下文自举时,bean也通过其定义的范围singletonprototyperequestsessionglobal-session )实例化。

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

Autowire发生是将一个bean实例注入另一个bean,这意味着我们要在哪里注入以及我们要注入什么-都应该是bean并存在于Spring IoC container (Application Context)

现在来问你一个问题。 如果您自动装配一个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构造函数。

因此,最重要的是,如果您使用@Autowired那么您将获得Spring管理的(生命周期)bean /对象,如果调用masterDataSource()则只需创建一个新对象即可,而不是Spring管理的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM