是否可以与所有请求共享相同的对象?

时间:2016-05-17 11:52:10

标签: java spring spring-boot

我想通过启动应用程序为我的身份验证服务生成一个密钥,并将其用于所有请求。所以我必须将它存储在某个地方并使其可访问。我需要一些其他的对象以及所有请求的共享 在C#中,可以通过静态变量进行,但不能在Spring Boot中进行。 你知道这样做的方法吗? 我知道一个解决方法,在启动时生成所有并将它们放入数据库,但我认为这是一种肮脏的方式。

我是Spring Boot的新手并感谢他们的帮助。

1 个答案:

答案 0 :(得分:1)

我认为你错过了Springboot是什么,它与静态范围无关。

由于spring嵌入了自己的DI框架,您可以创建可注入的bean,然后在其他托管bean中的任何位置使用它们。可注入bean是生命周期由DI容器管理的类,它们可以根据您的需要进行不同的实例化。您可以查看Spring bean scope

如果您希望所有请求的bean保持不变,则必须使用范围Singleton,这是默认值。

// No need to provide the scope, since singleton is the default one
@Component
public MySingletonBean {

    private final String key;

    // Yes, the constructor is private, but spring will see it anyway
    private MySingletonBean() {
        key = generateAKey();
    }

    private String getKey() {
        return this.key;
    }
}

使用此组件(DI框架称为单例),您可以在应用程序的任何位置使用相同的密钥,除非服务器重新启动,否则密钥将保持不变。

您可以在@Inject

的任何地方使用它

在控制器中使用它的示例

@RestController
public void MyController {

    @Inject
    private MySingletonBean mySingletonBean;

    @RequestMapping("/")
    public String index() {
        String key = mySingletonBean.getKey();
        return key;
    }
}

不要自己使用MySingletonBean构造函数。 IOC框架将负责bean实例化