Глядя на Grails 3 documentation следующее написано о прицелах:Grails 3 Контроллер Сфера
прототипа (по умолчанию) - новый контроллер будет создан для каждого запроса (рекомендуется для действий в качестве свойств Closure)
нечетная часть здесь является то, что я получаю значительно различающиеся результаты в Grails 3.1.4, если я явно состояние:
static scope = "prototype"
Tak е, например, следующие 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, и это же сообщение выполняется. Это почти так, как будто объем этого контроллера аналогичен области применения @ApplicationScope JSF. После хорошего 5-10 минут простоя запрос выполняется снова, но сценарий остается.
Если статическая область видимости указано:
После каждого закрытия браузера, «должны загрузить пользователей» выполняется, как ожидалось.
Вопрос в том, является ли документация неправильной для области по умолчанию? Если это не так, то в чем разница между явным заявлением scope = "prototype" и отсутствием его (помимо очевидного выше)?
Если ваша настройка конфигурации такова, как описано выше, ваши контроллеры будут областью «singleton», если у вас нет «static scope = ...» в контроллере. Это объясняет, почему вы видите другое поведение, когда в вашем контроллере есть «static scope =« прототип ». –