我学习spring并且在我的第一个应用程序中,我对bean有不同的种类(@ Repository,@ Service)。现在我读到这些bean的默认范围是单例。
我的情况如下,我有两个服务,我注射相同的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的单例bean,那么在两个服务中注入UserDao的实例是一样的吗?容器如何管理?
答案 0 :(得分:1)
首先,单例设计模式的含义是每个应用程序只有一个实例,弹簧容器管理单例设计模式。
当bean是单例时,将只管理bean的一个共享实例,并且对具有与该bean定义匹配的id或id的bean的所有请求将导致Spring容器返回一个特定的bean实例。
换句话说,当你定义一个bean定义并且它的范围是一个单例时,Spring IoC容器将只创建一个由该bean定义定义的对象的一个实例。这个单实例将存储在这种单例bean的缓存中, 以及该命名bean的所有后续请求和引用都将导致返回缓存对象。
获取更多帮助,请转到here
答案 1 :(得分:0)
单独的范围是控制器管理的最简单的情况吗?
它为您创建一个bean:
@Repository
public class UserDao {
@Autowire也是按类型划分的。所以当它看到这个时:
@Autowired
UserDao userDao
它发现它只创建(或将创建)UserDao类型的一个bean,并且没有注入哪个bean的歧义。所以它在这里注入了那个bean。
当遇到第二个相同的@Autowire情况时,它会重复该决定,因此会注入相同的bean。这甚至都不是一个有趣的决定。