java - 通过方法调用获取 Spring beans 与 new 运算符

标签 java spring

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

假设有一个类

@Component
public class Example{ }

如果我使用new Example()在其他类中实例化此类,容器是否会始终为我提供相同的示例对象?或者它每次都会返回我新的对象?

这里是令人困惑的部分:

如果在同一个类中我有两个像这样的bean:

@Component
public class Example {
    @Bean DataSource sqlDataSource() {
         // some logic
    }
    @Bean @Scope("prototype") SomeObject getSomeObject() {
         return new SomeObject(sqlDataSource()); //**
    }

}

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

最佳答案

@Bean 是一个方法级注释,指示 Spring 在调用该方法时创建一个 bean。这意味着具有与 XML 配置中标记相同的功能。

这个注解必须在@Configuration注解的类内部使用,否则如果你从另一个方法调用该方法,它将是一个普通的java new操作,而不是spring的。请参阅这篇文章 --> @Bean inside class with @Configuration and witout it

牢记这一点 new SomeObject(sqlDataSource());将等于 new SomeObject(new SqlDataSource());

如果你用@Configuration注释Example,将会发生的情况是,你总是会得到一个具有相同sqlDataSource对象的新SomeObject实例,这意味着Spring将只创建一个sqlDataSource,因为它是单例的。

关于java - 通过方法调用获取 Spring beans 与 new 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54501280/

相关文章:

大量客户端的java心跳实现

java - 创建没有实体的spring存储库

java - 将不透明的 Jlabel 添加到透明的 Jdialog?

java - 如何将 InputStream 转换为 DataHandler?

java.lang.IllegalArgumentException : 'dataSource' or 'jdbcTemplate' is required when starting tomcat 异常

Java多线程

java - spring data rest 存储库中的更新方法

java - Struts 2 应用程序在通过管理控制台部署时出错

java.lang.NoSuchMethodError : 'void org. thymeleaf.standard.processor.AbstractStandardExpressionAttributeTagProcessor

Spring MVC 主页 Controller