类似Spring的Bean,Service是flying中最重要的组成部分,是它负责完成所有可用的业务处理。服务可以是单例,也可以是每次创建新实例,通过配置标明。
本框架都是以服务为中心建立的,建设服务、面向前端(如ajax)暴露服务、面向其他系统提供服务。
服务的开发
类似Spring,无需继承框架中的任何类或者实现任何接口。
服务的注册
类似Spring,提供两种注册方式
①使用注解,示例:
@Service("UserService")
public class UserService { doSomething }
②使用配置文件
<service id="CategoryService" type="class">
<target>com.flying.cms.service.CategoryService</target>
</service>
服务的参数
虽然服务的参数可以不做任何处理,类似int age这样,但是我们还是建议加上Param注解,通过Param注解,可以处理一下事件:
1、增加有效性说明,如required、max、min等
2、增加远程调用的方便性(参考后续远程服务调用RMI等文章)
3、便于前端(ajax等)的服务调用
服务的运行过程
服务的运行包括两部分,服务体和注解处理。一些业务仅通过注解既可以完成,如前面看到的Dao一样;一些业务需要通过一些列的注解完成或者服务体完成,如:
@RemoveCache(tag="pas.Menu")
@DaoCreate(entity="security.menu")
public Data create(
@Param(value="name", required=true)String name,
@Param(value="url",required=true)String url,
@Param(value="remarks",required=true)String remarks,
@Param(value="perm_id",required=true)long perm_id,
@Param(value="sort_id",required=true)long sort_id,
@Param(value="parent_id",required=true)long parent_id) throws Exception {
return null;
}
创建一个菜单对象,并删除缓存中的内容
@Transaction
public Data createWithPerms(
@Param(value="name", required=true)String name,
@Param(value="remarks",required=true)String remarks,
@Param(value="perm_ids",required=true)long[] perm_ids) throws Exception {
Data d = this.create(name, remarks);
long role_id = d.getLong("role_id", 0);
if(perm_ids != null)
for(long perm_id: perm_ids) {
this.addPermToRole(role_id, perm_id);
}
return new Data(Codes.CODE, Codes.SUCCESS);
}
在事务中,服务体执行一系列的动作
运行原理
系统在执行过程中,根据注解和服务体,生成一个责任链,一次从最外面的注解开始执行,直到最里层的服务体。通过注解协助服务完成业务处理工作,能够极大的提升代码服务和简化切面编程。
当前系统中提供的注解包括:
数据库操作相关的:DaoCreate,DaoUpdate,DaoRemove,DaoQuery,Transaction
缓存相关的:UseCache,RemoveCache,Level2Cache
日志相关的:DefaultServiceInvokeAnnotation,MethodLogger
安全相关的:MethodAuthentication
还可以开发任意定制的服务注解,详细参考后续注解相关文章。
框架源码:https://github.com/hifong/flying
Demo应用:https://github.com/hifong/pas
技术QQ群:455852142