gpt4 book ai didi

session - Grails 3 Controller 范围

转载 作者:行者123 更新时间:2023-12-02 14:18:57 24 4
gpt4 key购买 nike

查看Grails 3 documentation,下面是有关范围的内容:

prototype (default) - A new controller will be created for each request (recommended for actions as Closure properties)



奇怪的是,如果我明确声明,我在Grails 3.1.4中得到的结果会明显不同:
static scope = "prototype"

以下面的UserController为例
class UserController {
def userService
List<String> users

def loadUsers() {
if (!users) {
println("########## have to load users");
try {
user = userService.getAllUsersInAd()
} catch (Exception e) {
// do something
}
} else {
println("########## dont have to do it " + users.size());
}
}
}

以及以下UserService
class UserService {
def getAllUsersInAd() {
println("######### querying")
return new ArrayList<String>();
}
}

如果省略静态范围:

当我关闭Firefox浏览器并重新打开它时,无论我关闭/重新打开它多少次,“都不必执行”。更奇怪的是,当我关闭Firefox时,我可以打开一个完全不同的浏览器(例如chrome),并且执行相同的消息。几乎就像该 Controller 的作用域与JSF的@ApplicationScope相似。
经过5-10分钟的空闲时间后,将再次执行查询,但情况仍然存在。

如果声明了静态范围:

关闭每个浏览器后,将按预期执行“必须加载用户”。

我的问题是,默认范围的文档是否错误?如果不是,那么显式声明scope =“prototype”和省略它(除了上面明显的内容)有什么区别?

最佳答案

在Grails 3.1.4应用程序的默认生成的application.yml文件中,您应该看到如下设置:

grails:
controllers:
defaultScope: singleton

那告诉框架使 Controller 单例。如果未设置默认范围,则默认范围为 prototype

关于session - Grails 3 Controller 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36486360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com