管理单例bean

时间:2014-07-05 15:13:26

标签: java spring

我学习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的实例是一样的吗?容器如何管理?

2 个答案:

答案 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。这甚至都不是一个有趣的决定。