Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java设计问题_Java_Spring - Fatal编程技术网

Java设计问题

Java设计问题,java,spring,Java,Spring,我希望用户通过objectmanager进行所有持久化操作,而不是直接使用UserDao,如何使UserDao对用户不可见。我正在使用spring将实现注入UserDao public class ObjectManager { public static UserDao USER_DAO; @Inject public void setUserDao(UserDao userDao) { ObjectManager.USER_DAO = userDao; } }

我希望用户通过objectmanager进行所有持久化操作,而不是直接使用UserDao,如何使UserDao对用户不可见。我正在使用spring将实现注入UserDao

public class ObjectManager {

  public static UserDao USER_DAO;

  @Inject
  public void setUserDao(UserDao userDao) {
     ObjectManager.USER_DAO = userDao;
  }
}

public interface UserDao extends GenericDAO<User,Long>{
  User findUserByUsername(String username);
}

我试图实现的是,每个人都遵循一条路径来执行持久性操作,在我的例子中,它将是ObjectManager.USER_DAO.saveobj..类似的东西,而不是一个开发人员执行userDao.saveobj..ObjectManager纯粹是为了方便。任何主体都可以键入objectManager。IDE将显示可用的dao列表。实现这一点的正常方法是将UserDao范围更改为包级别,并让ObjectManager假设ObjectManager是同一个包的一部分,充当其外观。由于UserDao在包之外是不可访问的,所以没有其他客户机可以实例化它


但既然您使用的是Spring,我相信您不能这样做。我想到的一个解决方法是将UserDao注入ObjectManager。这样,其他代码就无法使用bean名称进行查找,或者其他cfg无法引用它。

听起来您想在持久性DAO层和服务层之间添加一个层。我有一个项目,我做了类似的事情,插入了一个存储库层

当您有一个分层应用程序时,您可以创建一个多模块构建,并在构建时强制实现层之间的依赖关系。因此,DAO层不在服务层的编译时类路径上。

您可以将构造函数设置为私有,Spring DI仍将使用反射实例化它们

使用api/类的用户程序员如果也使用反射,仍然可以实例化类,但是正常使用新MyClass会导致编译时错误。但问题仍然是,你想要实现什么

我的建议是:不要这样做

这将使您的DAO类与您的中心静态ObjectManager类紧密耦合,没有明显的原因。这使得应用程序中的代码很难进行单元测试,因为像ObjectManager.USER_DAO.saveobj这样的静态引用不能被模拟。此外,该应用程序将更难维护,因为对ObjectManager的任何更改都将影响未来场景中几乎所有的代码示例:您希望将一些DAO访问器移出ObjectManager


如果您重视可测试性和可维护性,请避免使用静态访问的全局类。

您能描述一下为什么要隐藏UserDao吗?ObjectManager类的作用是什么?如果您将这些类公开给其他开发人员,如何阻止他们直接访问底层持久层并以这种方式执行操作?我想您是对的,没有什么可以阻止它们我试图实现的是,每个人都遵循一条路径来执行持久性操作,在我的例子中,它将是ObjectManager.USER_DAO.saveobj..类似的东西,而不是一个开发人员执行userDao.saveobj..ObjectManager纯粹是为了方便。任何主体都可以键入objectManager。IDE将显示可用的dao列表如果ObjectManager只是为了方便起见,没有添加任何行为,那么如果类选择直接访问dao,我看不出有任何危害。我明白了,就像我说的,私有构造函数将与SpringDI一起使用。您能否给出一些代码示例,说明ObjectManager的内联定义意味着什么。这样其他代码就无法使用bean名称进行查找,或者其他cfg无法引用它。通过提供引用文档的链接更新了帖子。单击内部bean定义突出显示的链接