2016-03-04 2 views
5

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

Я построил Spring MVC 4.0 приложения.

мои настройки, как это:

Controller >> Услуги >> DAO

в уровне контроллера я использую около 4 до 5 различных @Autowired переменные, как этот

@Autowired 
private ClientService clientService; 
@Autowired 
private CommentService commentService; 
@Autowired 
private SearchService searchService; 

В уровне обслуживания I Autowire также несколько DAO

@Autowired 
SearchDAO searchDAO; 

@Autowired 
private ActivityDAO activityDAO; 

@Autowired 
private UserService userService; 

I имеют около 10 различных контроллеров, и в большинстве из них I @Autowire те же услуги, так что мой вопрос в этом или нет?

Можно ли использовать @Autowire столько раз, сколько мне нужно или принесет слишком много памяти? Будет ли это иметь некоторые другие последствия для моего приложения?

Я использую Spring 4.0 + спящий режим JPA

+4

Я бы не стал беспокоиться об использовании памяти, но так много зависимостей может быть признаком нарушая «принцип единой ответственности». Это не сложное и быстрое правило, но есть такая возможность, что ваши классы имеют слишком много обязанностей. Возможно, вы можете разбить их на более мелкие услуги. –

+1

Бобы весны по умолчанию одиночные, поэтому существует только один экземпляр. Нет проблемы с памятью – Jens

+0

Я согласен с Али. Возможно, вы захотите разделить свои контроллеры так же, как и – Schrieveslaach

ответ

4

Там нет никаких проблем с @Autowired.

Autowired находит компонент в контексте Spring и присваивает переменной. Он просто ссылается на тот же объект службы/Dao bean. Он не будет создавать дубликаты.

Но так много объектов, введенных в один класс, является признаком одного класса, делающего много. Проверьте возможность рефакторинга класса на несколько классов, где это возможно.

0

@Autowired создаст экземпляр singleton конкретной службы в вашем приложении, поэтому я предполагаю, что наличие нескольких автоуровней одной и той же службы в разных контроллерах не должно быть проблемой памяти, если, конечно, объем компонента не является «прототипом», в этом случае весна будет создавать несколько экземпляров.

+0

Autowired не создаст экземпляр, а найдет bean-компонент и назначит переменной. Прототип области применим к тому месту, где создан bean-компонент, а не к Autowired. –

0

У меня около 10 различных контроллеров, и в большинстве случаев я @Autowire тех же услуг, так что мой вопрос в том или нет?

Это нормально для повторного использования услуг между контроллерами. Тем не менее, я смутился бы использовать более нескольких услуг в каждом контроллере и реорганизовать код, чтобы контроллер не стал «слишком толстым». Как правило, я стараюсь держать мои контроллеры в качестве слоя сопоставления между миром HTTP и миром Java и отбрасывать всю бизнес-логику до уровня обслуживания.

Весна будет создавать бобы с singelton scope по умолчанию, что означает, что если вы будете автоповторить один и тот же компонент в нескольких контроллерах, они будут совместно использовать один и тот же экземпляр компонента.

Можно ли использовать @Autowire столько раз, сколько мне нужно или принесет слишком много памяти? Будет ли это иметь некоторые другие последствия для моего приложения?

Автоудаление само по себе не требует большой памяти, это просто ссылка на экземпляр объекта Java.Как правило, весенние бобы не содержат какого-либо состояния (они делегируют это компонентам, таким как кеши и базы данных), поэтому, если вы ничего не делаете, вам не нужно беспокоиться об использовании памяти.

Следует обратить внимание на то, что вам следует избегать создания круговых зависимостей между компонентами. Поскольку вы используете полевую инъекцию, Spring выдает исключение во время инициализации приложения, и вам нужно реорганизовать ваше приложение.

1

Ответы и некоторые комментарии уже дали ответ о вашей памяти. О другой Ваш вопрос

У меня есть около 10 различных контроллеров и в большинстве из них я @Autowire те же услуги, Так что мой вопрос заключается в следующем порядке или нет?

С точки зрения дизайна это звучит очень плохо. Али Дегани упомянул принцип единой ответственности. Фактически, если вы должны перенести свое обслуживание с автоссылки в качестве полей на автоссылку через конструктор, это сразу подскажет, следует ли вам подумать о рефакторе, amongst other benefits

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