#java #spring
#java #spring
Вопрос:
Я изучаю spring, и в моем первом приложении у меня есть другой тип компонента (@Repository,@Service). Теперь я прочитал, что областью по умолчанию для этих компонентов является singleton.
Моя ситуация следующая, у меня есть две службы, в которые я внедряю один и тот же Dao.
@Service
public class MyFirtsServiceImpl implements MyFirtsService{
@Autowired
UserDao userDao
}
@Service
public class MySecondServiceImpl implements MySecondService{
@Autowired
UserDao userDao
}
@Repository
public class UserDao {
//methods to manage the persistence
}
Теперь у меня есть некоторые сомнения по поводу этой ситуации. Поскольку UserDao является одноэлементным компонентом, то экземпляр UserDao, введенный в обе службы, одинаков? Как контейнер управляет этим?
Ответ №1:
прежде всего, значение шаблона одноэлементного проектирования заключается только в одном экземпляре для каждого приложения, а контейнер spring управляет шаблоном одноэлементного проектирования.
Когда компонент является одноэлементным, будет управляться только один общий экземпляр компонента, и все запросы к компонентам с идентификатором или идентификаторами, соответствующими этому определению компонента, приведут к тому, что этот конкретный экземпляр компонента будет возвращен контейнером Spring.
Другими словами, когда вы определяете определение компонента и оно определяется как одноэлементный, тогда контейнер Spring IoC создаст ровно один экземпляр объекта, определенного этим определением компонента. Этот единственный экземпляр будет сохранен в кэше таких одноэлементных компонентов, и все последующие запросы и ссылки на этот именованный компонент приведут к возврату кэшированного объекта.
за дополнительной помощью обращайтесь сюда
Ответ №2:
Не является ли singleton scope самым простым случаем для управления контроллером?
Это создает компонент для вашего:
@Repository
public class UserDao {
Также @Autowire определяется типом. Итак, когда он видит это:
@Autowired
UserDao userDao
он обнаруживает, что существует только один компонент, который он создал (или создаст) типа UserDao, и нет никакой двусмысленности в том, какой из них вводить. Итак, он вводит этот компонент сюда.
Когда он сталкивается со второй идентичной ситуацией @Autowire, он повторяет решение и, таким образом, вводит тот же компонент. Это даже не интересное решение.