猿问

通过方法调用与新运算符获取 Spring bean

我对这个小话题感到困惑。我在某处读到,如果一个类用 注释@Component,它是 spring 管理的 bean,每当需要时,spring 都会提供它。我将它与 bean 的范围混淆了。让我解释:


比方说一堂课


@Component

public class Example{ }

如果我在其他类中使用 实例化这个类new Example(),容器会一直为我提供相同的 Example 对象吗?还是每次都会返回我新的对象?


这是令人困惑的部分:


如果在同一个班级我有两个这样的豆子:


@Component

public class Example {

    @Bean DataSource sqlDataSource() {

         // some logic

    }

    @Bean @Scope("prototype") SomeObject getSomeObject() {

         return new SomeObject(sqlDataSource()); //**

    }


}

在这种情况下会发生什么?每次请求 SomeObject bean 时,sqlDataSource() 方法调用都会一次又一次地返回相同的对象,还是每次请求 SomeObject 时都会返回新的 DataSource 实例?


请帮忙。


HUX布斯
浏览 85回答 2
2回答

天涯尽头无女友

是一个方法级别的注解,指示 Spring 在调用该方法时创建一个 bean。这意味着具有与 XML 配置中的标记相同的功能。这个注解必须在 @Configuration 注解的类中使用,否则如果你从另一个方法调用该方法,它将是一个普通的 java new 操作,而不是 spring 的。请参阅这篇文章-> @Bean inside class with @Configuration and witout牢记这一点 new SomeObject(sqlDataSource()); 将等于 new SomeObject(new SqlDataSource());如果您使用 @Configuration 注释 Example 将会发生的是,您将始终获得一个具有相同 sqlDataSource 对象的新 SomeObject 实例,这意味着 Spring 将只创建一个 sqlDataSource 因为它是单例的。

POPMUISE

@Bean DataSource sqlDataSource() {     // some logic}这定义了 DataSource 的单例实例。因此,每次您请求 SomeObject 的实例时,都会创建一个新的 SomeObject(虽然它是在原型范围内定义的),但它们都将共享相同的 DataSource 对象(因为它是一个单例 bean)。
随时随地看视频慕课网APP

相关分类

Java
我要回答