2010-12-14 3 views
1

Весной 3 не представляется возможным установить @Autowired либо в статических полях или методах, так, так как я хочу, чтобы объявить служебный класс, такие как:Util класса для экранной Услуги весной 3

public class SchoolYearServiceUtil { 
    private static SchoolYearService schoolYearService; 

    public static SchoolYear getSchoolYear(Long id) { 
     return schoolYearService.get(id); 
    } 
} 

в во избежание необходимости вводить schoolYearService всюду (jsp, командный класс ...), в котором он мне нужен. В этом случае мне не нужен интерфейс, который будет реализован SchoolYearServiceUtil.

Я не хочу, чтобы инициализировать объект с помощью кода, но получая тот же экземпляр, что и Spring.

Какой был бы лучший вариант реализации getSchoolYear как статического метода?

Спасибо.

Будет ли это концептуально неправильно ?:

@Component 
public class SchoolYearServiceUtil { 

private static SchoolYearService schoolYearService; 

@Autowired(required = true) 
private SchoolYearServiceUtil(@Qualifier("schoolYearServiceImpl") SchoolYearService schoolYearService) { 
    SchoolYearServiceUtil.schoolYearService = schoolYearService; 
} 

public static SchoolYearService getSchoolYearService() { 
    return schoolYearService; 
} 

public static SchoolYear getSchoolYear(Long id) { 

    return getSchoolYearService().get(id); 
} 
} 

Я должен убедиться, что только Spring называет один раз в конструктор и конструктор вызывается нигде, поэтому я объявил конструктор как частный.

+3

Вам не хватает точки инъекции зависимостей, которая * является *, чтобы вводить службу везде, где это необходимо. То, что вы описываете, является шаблоном Locator Service, который является противоположным DI. Весна вам не поможет. – skaffman

+0

@Juan: Это не концептуально «неправильно», это просто не то, как Весна что-то делает. Весна построена вокруг DI, и то, что вы описываете, не является DI. – skaffman

+0

@skaffman Что вы думаете о решении, которое я разместил? Я понимаю, что вы говорите, но я хочу, чтобы класс util мог вызвать службу, инициализированную весной. Таким образом, оба вызова Сервиса, где это вводится, и вызовы службы через ServiceUtil обрабатываются одним и тем же экземпляром. – 2010-12-14 17:38:50

ответ

1

Я полностью поддерживаю комментарий скаффмана. Вам не нужны поля static с DI. Вы просто определяете компонент области Singleton (по умолчанию).

Существует способ получения стакана статически, но вы должны знать, что его нельзя использовать в обычных ситуациях. (есть некоторые действительные приложения). Используется WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext)

Вы заметили, что вам необходимо передать аргумент ServletContext.

Смежные вопросы