java - Spring 启动。获取 bean 作为对本地 bean 方法调用的响应

标签 java spring spring-boot

我在@Configuration类上工作,并且masterTransactionManager bean需要注入(inject)masterDataSource bean。我找到了例子 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 into bean injection methodology 中,我找不到很多关于此类 bean 调用方法的信息。提到它应该有效。但就我而言,情况并非如此。

更新:我看到了什么错误

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

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

还在 Debug模式下,我看到 spring bean 启动调用上的 bean 实例与我的类调用 masterDataSource() 方法时的返回不同。

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

时返回的不正确的 bean(它是不是 bean,不确定)的结果

最佳答案

在回答问题之前,我需要明确什么是 Autowiring

Spring 在作为容器的应用程序上下文内管理它们的 bean 和生命周期。 应用程序上下文是一个包含bean的容器。 当应用程序上下文引导时,bean 也会按其定义的 scope 进行实例化。 (单例原型(prototype)请求 session 全局 session )。

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

Autowire 将一个 bean 实例注入(inject)另一个 bean。这意味着我们注入(inject)的位置和注入(inject)的内容 —— 两者都应该是 bean,并且存在于 Spring IoC 容器 (应用程序上下文)

现在来回答你的问题。如果您 Autowiring 一个 bean,实际上您的实例化对象(由 spring 实例化)就在这里设置。如果您在示例中调用诸如 masterDataSource() 之类的方法:-

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

@Bean
@Primary
public DataSourceTransactionManager masterTransactionManager() {
    return new DataSourceTransactionManager(masterDataSource());
}

然后masterDataSource()还创建一个新对象并将其设置(注入(inject))到DataSourceTransactionManager构造函数。

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

关于java - Spring 启动。获取 bean 作为对本地 bean 方法调用的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47507207/

相关文章:

java - 如何从mp3文件中删除标题信息?

java - 创建表时 jdbc derby 语法错误

java - == 与 .equals - 为什么行为不同?

java - 我如何在远程服务器上部署jar文件

spring-boot - 如何在Gradle中使用Apache CXF + Spring Boot构建SOAP WS?

java - Spring 3 MVC + 磁贴 3 : Attribute "header" not found

java - 共享资源的 Java Web 应用程序的多个实例

java - Spring HibernateDaoSupport 创建多个 session

java - 在 IntelliJ Community 2017.1 中运行 Spring 启动测试时出错

spring-boot - 如何使用 Mockito 模拟 context.getBeansWithAnnotations