Управление одноэлементными компонентами

#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, он повторяет решение и, таким образом, вводит тот же компонент. Это даже не интересное решение.