自GoogleGuice出现以后一直对它好奇,很希望在自己的项目中加入这一块,可惜公司内所有项目都是基于Spring的,所以一直对它半知半解,现在项目完成,有一段空闲时间,于是马上对Guice开始研究,简单的例子很早就跑过,所有目标放在web开发平台这块,想用guice把Spring给替了,经过三个星期的反复修改代码,最终终于完成了目前这个简单的开发平台。现在把部分基于这个平台的代码放出来,大家批评批评。
首先说一下包含哪些第三方开源框架,在以前公司的项目中,都是本人搭建开发平台。
两年当中一之使用WebWork.Spring Hibernate这样的组合,现在肯定有人会说,那你用guice代替spring很简单啊,因为guice发布了一个plugin,可以直接应用到struts2中,而我用webwork迁移到struts2基本只需要用半小时就可全部搞定。当然我也试了,一切OK。但是发现一个问题,Guice Injector对象是在当用户访问一个Action之后才进行实例的,所以如果用户没有访问任何Action时候,你又象在Action之前通过Guice inject你需要的对象时候,是无奈的。什么时候会遇到这样的问题呢?HibernateSessionInView时候就会遇到。Spring提供的HibernateSessionInView实现是在Filter里,并且是在启动项目时候就将HibernateSessionFactory创建,所以在Filter里可直接引用SessionFactory,而我现在遇到的问题就是我是先到Filter然后才到Action,而第一次到Filter时Guice无法给我inject SessionFactory,所以,我又有了一个想法,把webwork也抛弃了吧,用了这么长时间的webwork对它的内部实现已经很清楚了,于是,我开始了自己的MVC层+guice+Hibernate的整合。保留webwork的经典Interceptor,自己的MVC也有这个机制,实现了的Interceptor有:1.Action CleanUp Interceptor 清理ActionContext.
2.Action Exception Interceptor 异常跳转
3.Action TokenValidator Interceptor Token验证
4.Action Params Interceptor httpServletRequest参数绑定
5.Action Result Interceptor result跳转
6.Action ReqSet Interceptor httpServletRequest.setAttribute 这6个拦截
而Action也没有定义在xml文件中了,而是以Annotation的方式来实现的
具体代码如下:
@Action(name = "cpny", namespace = "/hr")
public class SysCompanyAction extends ActionSupport<SysCompany> {}
正如大家看见的 这样定义一个Action,就可以用http://localhost/hr/cpny.action来访问默认执行execute方法
而webwork方便大家的也在于只要是Action的属性,并提供getter setter方法 都可以从http参数中自动求值,这点我也是基于Annotation实现的,只是起的名字有点怪,呵呵。
@ReqGet
private Long id;
@ReqGet
private String _cpnyName;
@ReqGet
@ModelDriver
@ReqSet
private SysCompany sysCompany;
id将从request参数中获取,并自动进行类型转换 _cpnyName也如此,而sysCompany则使用@ModelDriver 将request参数中的值封装为sysCompany对象。假设request中存在如下请求参数id=1&_cpnyName=javaeye&sysCompany.id=1&sysCompany.cpnyId=google 则会正确匹配并装换成功,sysCompany如果包含其他对象则可以sysCompany.object.id=1这样的形式 如同ognl。还一点需要和大家解释在webwork中使用valueStack的方式将整个Action压入stack中在用ww标签进行求值,而这一步我没有实现,因为如果那样我还需要写一套类似ww的标签,显得有些麻烦,本人比较懒,所以采用JSTL,那当然需要在request里setAttribute所以我用@ReqSet来代表在action执行完毕以后将这些属性自动set进去。这样大家就可在页面上用<c:out value="${sysCompany.id}"/>形式访问了
接下来到执行完成以后的页面跳转了,同样采用Annotation定义
@PageFlow(result = { @Result(name = "input", path = "/view/sys/editCompany.jsp", type = Dispatcher.Forward) })
public String input() throws Exception {
if (id != null) {
this.sysCompany = this.sysCompanyService.getCompanyById(id);
}
return "input";
}
大家一看就明白,也和webwork的xml类似。@Result可定义多个,针对有不同结果返回的方法。
而guice可直接在Action里Inject
@Inject
private SysCompanyService sysCompanyService;
免去了烦人的setter方法,呵呵 这样整个action无论是inject 还是从request获取参数都不再需要setter getter方法了,清爽了好多。
接着是也许我的一个创新,但是估计会招来骂声,就是DAO与Service的关系。以往的应用都是dao提供基本操作方法,Service调用Dao。Action调用Service.再平常不过了。而我在这里把DAO“省”去了。
大家先看看代码吧
@Singleton
public class SysCompanyService {
@Inject
private SysCompanyDao sysCompanyDao;
@Transactional(type=TransactionType.READ_ONLY)
@FinderByCriteria(value=SysCompany.class,orderBy=@OrderBy(column="id"))
public Page<SysCompany> getResultPage(
@FirstResult int start ,
@MaxResults int limit,
@LIKE(column="cpnyNameZh") String _cpnyName,
@By(group="asd") String sort,
@Order(group="asd") boolean isAsc
) {
return null;
}
@Transactional(type = TransactionType.READ_ONLY)
@FinderById(SysCompany.class)
public SysCompany getCompanyById(@PK
Long id) {
return null;
}
@Transactional(type = TransactionType.READ_WRITE)
@Persistence(PersistenceType.SAVEORUPDATE)
public void saveCompany(@PO
SysCompany sysCompany) {
}
@Transactional(type = TransactionType.READ_WRITE)
@Persistence(PersistenceType.DELETE)
public void deleteCompany(@PO
SysCompany sysCompany) {
};
@Transactional(type = TransactionType.READ_WRITE)
public void deleteCompanyById(Long id) {
this.deleteCompany(this.sysCompanyDao.getById(id));
}
}
这样写的方式完全来源于基于guice Annotation的持久层框架warp-persistence
我只是做了一些扩展 比如@Persistence 需要指定PersistenceType参数携带@PO就能进行相应持久化操作
@FinderById需要指定PO.class,参数携带@PK 就能通过id查询对象。这样简单的操作
还有一个是@FinderByCriteria 做得过于复杂,不过是一个创新。至于能不能用在项目上不说,但是是我学习Annotation的一个阶段,而且我不再需要写任何dao 只需要声明一下Annotation,并且Service还是
@Singleton的。
现在重点解释一下@FinderByCriteria
@Transactional(type=TransactionType.READ_ONLY)
@FinderByCriteria(value=SysCompany.class,orderBy=@OrderBy(column="id"))
public Page<SysCompany> getResultPage(
@FirstResult int start ,
@MaxResults int limit,
@LIKE(column="cpnyNameZh") String _cpnyName,
@By(group="myOrderBy") String sort,
@Order(group="myOrderBy") boolean isAsc
) {
return null;
}
@FinderByCriteria(value=SysCompany.class,orderBy=@OrderBy(column="id"))第1个参数为查询的PO.class,而后面可任意追加一些固定的条件和排序方法,以上为追加了固定的按id进行ASC排序的条件
接着@FirstResult int start ,@MaxResults int limit,指名需要进行分页操作,并传入参数,@LIKE(column="cpnyNameZh") String _cpnyName,表示对cpnyNameZh进行模糊查询
@By(group="myOrderBy") String sort,@Order(group="myOrderBy") boolean isAsc,则接收用户需要以哪个字段进行升或降序的排序方式 注意中间一个参数group="myOrderBy" 表示@By ,@Order 是一组 by接收需要排序的字段而isAsc接收升或降序方式
这样在后台生成的SQL语句则是
select
*
from
( select
this_.id as id0_0_,
this_.CPNY_ID as CPNY2_0_0_,
this_.CPNY_NAME_EN as CPNY3_0_0_,
this_.CPNY_NAME_KO as CPNY4_0_0_,
this_.CPNY_NAME_ZH as CPNY5_0_0_,
this_.CREATED as CREATED0_0_,
this_.CREATEDBY as CREATEDBY0_0_,
this_.UPDATED as UPDATED0_0_,
this_.UPDATEDBY as UPDATEDBY0_0_,
this_.USE_YN as USE10_0_0_
from
SYS_COMPANY this_
where
this_.CPNY_NAME_ZH like ?
order by
this_.CPNY_NAME_ZH asc,
this_.id asc )
where
rownum <= ?
说得有些乱,不知道各位理解没理解。发帖只是想让各位高手批评批评。我有哪些没考虑到的或者哪些不应该这样做的。
分享到:
相关推荐
这个“基于Guice的HelloWorld项目”就是一个简单的示例,用于展示如何使用Guice进行依赖注入。 首先,我们需要理解Guice的核心概念——Injector。Injector是Guice的核心类,它负责创建对象并管理它们的生命周期。...
而 Google 的 Guice 则是一个流行的依赖注入框架,它简化了对象的创建和管理过程。本文将详细介绍如何将 Apache Shiro 集成到基于 Guice 的应用中。 #### Apache Shiro 与 Guice 集成概述 自 Shiro 1.2 版本起,...
5. **测试**:在Guice中,我们可以使用`Guice.createInjector()`创建一个测试用的Injector,然后在这个Injector中注入模拟的依赖,进行测试。这种方式比传统方式更易于维护和扩展。 6. **绑定(Bindings)**:Guice...
Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC)。Guice非常小而且快。Guice是类型安全的,它能够对构造函数,属性,方法(包含任意个参数的任意方法,而不仅仅是setter...
Guice 3.0的一个典型应用是创建一个简单的服务容器。首先,定义接口和服务实现: ```java public interface MyService { void doSomething(); } public class MyServiceImpl implements MyService { @Override ...
在Java Web开发中,Jersey是一个流行的RESTful服务实现框架,而Guice是Google提供的一个轻量级依赖注入(DI)容器。这篇笔记将深入探讨如何将这两个强大的工具集成为一体,以优化项目架构和提高代码可维护性。 **一...
标题《Learning Google Guice》指出本文档是关于学习谷歌Guice的,Guice是由谷歌开发的一个轻量级的依赖注入框架,其核心理念是简化Java应用程序中组件的创建和组装过程,通过依赖注入提高模块间的解耦,从而使得...
Guice,由Google开发的一个轻量级依赖注入框架,为构建这样的插件系统提供了便利。本文将深入探讨如何利用Guice构建一个简单的插件系统。 ### 1. 依赖注入(Dependency Injection) 依赖注入是Guice的核心理念,它...
Guice是一个轻量级的依赖注入框架,由Google开发,它使得Java开发者能够更方便地管理对象之间的依赖关系,从而简化代码结构,提高可测试性和可维护性。 描述中提到的"reportng"是TestNG的一个增强插件,专门用于...
该项目为基于Google Guice框架的Android应用版本3.0设计源码,已退役。源码包含1170个文件,其中Java源文件697个,HTML文件218个,JAR文件70个,XML文件64个,PNG文件34个,属性文件16个,IML文件15个,SHA1文件6个...
Guice是针对Java平台的,它要求至少使用Java 6进行开发。Guice通过提供一种声明式的方式来管理对象的生命周期和它们之间的依赖关系,从而简化了复杂应用的构建。 在Guice中,我们创建一个名为`Module`的类来定义...
Robojuice是一款专门为Android平台设计的依赖注入框架,它基于Google的Guice库,并针对Android进行了优化。这个jar包文件下载包含两个重要的组件:`guice-2.0-no_aop.jar`和`roboguice-1.1.2.jar`。在这里,我们深入...
标题 "guice-throwingproviders-3.2.1.zip" 暗示了这是一个关于Google Guice框架的扩展,具体来说是ThrowingProviders模块的一个版本。Guice是一款轻量级的依赖注入(DI)框架,它使得在Java应用程序中管理对象的...
首先,Guice 是由 Google 开发的一个轻量级的 DI 框架,它的核心设计理念是简洁和易用。Guice 的注入主要通过注解来实现,如 `@Inject`,这使得代码更加整洁,减少了 XML 配置文件的需求。在提供的示例中,我们看到 ...
6. 混合语言构建:因为Gradle是基于Groovy的,所以它天然支持混合语言构建,使得开发者能够在一个项目中轻松地使用多种编程语言。 7. 插件支持:Gradle有非常丰富的插件生态系统,用户可以通过插件来扩展Gradle的...
这篇文章提到了Guice,这是一个由Google开发的轻量级Java依赖注入框架,用于简化Java应用程序的构建和测试。依赖注入(Dependency Injection,DI)是一种设计模式,它可以帮助我们解耦代码,使组件之间通过接口进行...
首先,Guice3是一个轻量级的依赖注入框架,由Google开发。它简化了Java应用中的对象创建和管理,通过自动管理对象的生命周期和依赖关系,使代码更加模块化和可测试。Guice3主要特点包括:类型安全的依赖注入、提供...
Mojave MVC Web框架======================== Mojave(发音为Mo-hav-ee)是一个注释驱动的基于POJO的Java Web应用程序开发框架。 它借鉴了Spring Web MVC和EJB 3.1的思想,并合并了Guice。 它试图: 通过提供IoC功能...
这个开源项目很可能是提供了一个中间件,使得基于Spring的应用可以轻松地接入WAMP协议,从而实现跨平台、跨语言的实时通信。 【标签】"开源项目" 表示这是一个开放源代码的软件项目,意味着任何人都可以查看、使用...