当前位置: 首页 > 知识库问答 >
问题:

有人可以为springboot注入的一个用例向我解释

杭柏
2023-03-14

我从一位同事的代码中读到了这几行:

    @Bean(name = "mysql")
    @ConfigurationProperties(prefix = "spring.mysql")
    @Primary
    public DataSource mysqlDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public ClassA classA () {
        return new ClassA (this.mysqlDataSource());
    }

    @Bean
    public ClassB classB () {
        return new ClassB (this.mysqlDataSource());
    }

我认为这将为Bean classA和classB创建2个数据源。为了注入数据源,我们需要如下内容:

    @Bean
    public ClassA classA (DataSource ds) {
        return new ClassA (ds);
    }

但是Spring只创建了一个数据源,this.mysqlDataSource()每次都返回相同的数据源。它是怎么发生的?如果我确实需要另一个数据源,我需要立即创建它?

共有1个答案

方博学
2023-03-14

Spring说@component@configuration有不同的含义。如果使用@configuration而不是@component,则将使用CGLIB代理。

“常规Spring组件中的@bean方法的处理方式不同于Spring@configuration类中的对应方法。不同的是,@component类没有使用cglib增强,以拦截方法和字段的调用。CGLIB代理是调用@configuration类中@bean方法中的方法或字段创建对协作对象的bean元数据引用的手段;这样的方法不是用正常的Java语义调用的,而是通过容器来提供Spring bean的通常生命周期管理和代理,即使是在通过编程调用@bean方法引用其他bean时也是如此。相反,在普通@component类中调用@bean方法中的方法或字段具有标准的Java语义,不应用特殊的cglib处理或其他约束。“

https://docs.spring.io/spring/docs/5.0.4.release/spring-framework-reference/core.html#spring-core

或者,您可以将@configurationproperties保留在类级别中,并从datasource中删除@bean以便将mysqldatasource()视为常规方法。

 类似资料:
  • 问题内容: 我不太了解Java中“ this”的用法。如果有人可以帮助我澄清一下,我将不胜感激。 在此网站上显示:http : //docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html “在实例方法或构造函数中,这是对当前对象的引用,该对象是正在调用其方法或构造函数的对象。使用此方法,您可以从实例方法或构造函数中引用当前对象的任何成员。

  • 问题内容: 情况1:这不会引起?。谁能告诉我为什么这不会导致ConcurrentModificationException。 情况2:这是由于我尝试访问AsyncThread中的线程不安全的人员列表。我可以使我的“人员列表”实现是线程安全的,并且应该可以运行。 谁能解释我到底发生了什么。我无法理解这是如何解决问题的。 案例2是否将实现从更改为推荐? 添加例外: 05-28 20:34:21.073

  • 问题内容: 有人可以在hibernate状态下向我解释吗?我很难理解它。 如果可以举一个例子来解释它,那就最棒了,并且它在哪种用例中最适用? 问题答案: 这是Object DB的一个很好的解释。 指定ManyToOne或OneToOne关系属性,该属性提供EmbeddedId主键,EmbeddedId主键内的属性或父实体的简单主键的映射。value元素指定关系属性所对应的组合键中的属性。如果实体的

  • 从Web API 2的模板中,post方法总是这样的: 我不理解这个< code>CreatedAtRoute()方法。有人能给我解释一下吗?

  • 本文向大家介绍有人可以向我解释JavaScript变量之前的加号吗?,包括了有人可以向我解释JavaScript变量之前的加号吗?的使用技巧和注意事项,需要的朋友参考一下 变量之前的加号(+)定义您要使用的变量是数字变量。 在下面的代码中,有关于加号的简短描述。以下是代码- 示例 要运行上述程序,您需要使用以下命令- 输出结果 在这里,我的文件名为demo149.js。这将产生以下输出-

  • 问题内容: 我只是在android上开始,而我的java很生锈。我不记得曾经见过像这样嵌套在另一个函数中的函数。有人可以向我确切解释final的作用,并解释为什么您要在另一个函数中嵌套这样的功能吗? 问题答案: 这是一个匿名类。实际发生的情况是正在使用重写的函数创建 的子类。 关于匿名类的最优雅的事情之一是,它们使您可以在需要的地方准确定义单发类。此外,匿名类具有简洁的语法,可减少代码中的混乱情况