【问题标题】:Managing singleton beans管理单例 bean
【发布时间】:2014-07-05 15:13:26
【问题描述】:

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

【问题讨论】:

    标签: java spring


    【解决方案1】:

    首先,单例设计模式的含义是每个应用程序只有一个实例,而spring容器管理单例设计模式。

    当一个 bean 是单例时,只有一个 bean 的共享实例将被管理,并且所有对 id 或 id 与该 bean 定义匹配的 bean 的请求都将导致 Spring 容器返回一个特定的 bean 实例。

    换句话说,当您定义一个 bean 定义并将其限定为单例时,Spring IoC 容器将创建该 bean 定义所定义的对象的一个​​实例。这个单个实例将存储在此类单例 bean 的缓存中, 并且对该命名 bean 的所有后续请求和引用都将导致返回缓存的对象。

    如需更多帮助,请转至here

    【讨论】:

      【解决方案2】:

      单例范围不是控制器最容易管理的情况吗?

      它为你创建一个 bean:

      @Repository
      public class UserDao {
      

      @Autowire 也是按类型划分的。所以当它看到这个时:

      @Autowired
      UserDao userDao
      

      它发现只有一个它已经创建(或将要创建)的 UserDao 类型的 bean,并且在注入哪个 bean 时没有歧义。所以它会在此处注入该 bean。

      当它遇到第二个相同的@Autowire 情况时,它会重复决定并注入相同的 bean。这甚至不是一个有趣的决定。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-28
        • 1970-01-01
        相关资源
        最近更新 更多