服务器端分包结构回顾

现在很多的Java应用都采用Eric在《DDD》中提出的域分层结构,
所以大部分项目看起来像下面这个样子分包:
action
service
dao
domain
exception
util

最近做的这个项目也采用了类似的结构,
其中service和dao的关系是一个老生常谈的问题,
dao只对数据访问进行隔离,比如:Hibernate过时了,我们需要按一套全新的持久化方案,只需把Dao的实现类替换掉就行了。
service包括所有的业务逻辑,使用dao存取数据,并向Action功能提供服务。
然而,大部分企业应用中,业务逻辑就是对数据库的操作,
所以就出现了大量的service变成了dao的代理,
为此,有人提出,如果只是简单数据操作,action可以直接调用dao,因为同样保持着单向依赖。
但是,允许这样做后,dao函数的粒度较小,action变相的成了业务逻辑处理中心。
还有一个问题是,复杂的SQL语句,是业务还是数据操作?该放在dao,还是service?
其实放在dao或service, 都能说得通,
但我觉得应该放在service, SQL语句本身是业务逻辑,只是执行它的应该是数据操作接口,
如果dao只是作为数据操作接口,在现在数据自动映射处理框架的面前,是否有必要存在?
我比较赞同统一dao接口为一个特殊的服务, 如:PersistentService
持久化服务接口:

public interface PersistentService extends Service {

void save(Entity entity);

void batchSave(Collection<Entity> entities);

void update(Entity entity);

void batchUpdate(Collection<Entity> entities);

void saveOrUpdate(Entity entity);

void batchSaveOrUpdate(Collection<Entity> entities);

void remove(Entity entity);

void batchRemove(Collection<Entity> entities);

void remove(Class<?> entityClass, Long id);

void batchRemove(Class<?> entityClass, Collection<Long> entityIds);

Entity get(Entity entity);

Entity get(Class<?> entityClass, Long id);

Entity get(Class<?> entityClass, String property, Serializable value);

Collection<Entity> find(Entity entity);

Collection<Entity> find(Class<?> entityClass, String property, Serializable value);

Collection<Entity> find(String query);

Page<Entity> findPage(Entity entity);

Page<Entity> findPage(Class<?> entityClass, String property, Serializable value);

Page<Entity> findPage(String query);

......

}


然后,实现不同ORM框架的映射,如:

public class HibernatePersistentService implements PersistentService {

......

}


或者SQL映射框架,如:

public class IbatisPersistentService implements PersistentService {

......

}


或者非数据库持久化,如:

public class XmlPersistentService implements PersistentService {

......

}



然后,在其它业务类服务基类中缺省由框架自动注入持久化服务:

public abstract class AbstractService implements Service {

/**
* 日志输出接口
*/
protected final Logger logger = LoggerFactory.getLogger(getClass());

/**
* 持久化服务
*/
protected PersistentService persistentService;

// IoC注入接口
public void setPersistentService(PersistentService persistentService) {
this.persistentService = persistentService;
}

}


业务类服务中使用如:

public class UserServiceImpl extends AbstractService implements UserService {

public User login(String username, String password) {
// 直接使用持久化服务接口
User user = persistentService.get(User.class, "username" username);
....
}

}


这样统一后,
service表示无状态的服务模型,服务可以再依赖服务,并且像邮件发送等也应该成为服务,而不是util工具。
action表示有状态的功能模型,代表一个用户可具体操作的功能。
模块间服务模型共享,并定义好依赖关系。
模块间功能模型使用名称空间相互区隔,互不干扰。

如:
雇员管理服务:包括雇员增删改查接口,数据一致性检查等。
雇员管理功能:包括新增雇员的界面,界面控制,数据传输等。

提成管理功能,也可依赖雇员管理服务,通过服务获取提成雇员的信息。
但提成管理功能却不会依赖雇员管理功能,因为它不关心雇员信息是怎么维护的。

如果雇员信息是从HR系统同步过来的,那样就只需要雇员管理服务,而不需要雇员管理功能,或者同步过程就是雇员管理功能。

所以服务模型和功能模型应该分别打成jar包,便于部署。
引用:AgileBoot项目的建立是因为作者想在闲暇时间自己捣鼓一些小东西。为了快速开发,作者在网上找了很多快速开发脚手架,括Ruoyi、Jeecg-boot、ElAdmin、renren等框架。 引用:最后,作者选择了Ruoyi框架作为自己开发小东西的脚手架。作者非常感谢Ruoyi的作者整理出这个项目。 针对您的问题,关于SpringBoot和Vue前后端分包,可以按照以下方法进行: 1. 首先,您可以将SpringBoot作为后端框架,负责处理业务逻辑和数据存储。SpringBoot提供了丰富的功能和库,可以轻松地构建和扩展后端服务。 2. 其次,您可以将Vue作为前端框架,负责用户界面的展示和交互。Vue是一个灵活的JavaScript框架,可以帮助您构建现代化的、响应式的用户界面。 3. 对于前后端分包,您可以将前端代码和后端代码分别组织在不同的目录中。例如,将前端代码放在一个名为"frontend"的目录中,将后端代码放在一个名为"backend"的目录中。这样可以更好地管理和维护代码。 4. 在前端和后端之间进行通信可以使用RESTful API。通过定义API接口,前端可以向后端发送请求并获取数据,实现数据的交互和传输。 5. 在前端开发中,您可以使用Vue提供的组件和工具来构建用户界面。同时,您可以使用Vue的路由功能来管理不同页面之间的导航和跳转。 6. 在后端开发中,您可以使用SpringBoot提供的注解和功能来定义和处理API接口。通过编写控制器类和服务类,可以实现业务逻辑的处理和数据库的操作。 总结来说,通过将SpringBoot作为后端框架,Vue作为前端框架,并进行前后端分包的方式,可以更好地实现前后端的分离和开发。这种架构可以提高开发效率,并使代码更加清晰和可维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值