`
bonny
  • 浏览: 76419 次
  • 性别: Icon_minigender_1
  • 来自: SH
社区版块
存档分类
最新评论

GRAILS框架运行机制探

阅读更多
grails提供了一个基于约定的MVC web框架。那么,这个框架是如何运作的呢?
我们知道grails框架提供了DSL风格的控制器和高度简化的domain,框架几乎帮我们做了所有的事情,我们仅仅集中精力到业务上。
框架做了以下的工作
1,整个MVC流程的运转(这个大家很熟,多数MVC框架都提供)
2,DSL风格的控制器(动态增强)
3,增强的domain

查看了grails的代码,知道grails是通过springmvc来实现grails框架的,不同的地方,在得到control以后,grails利用groovy语言的动态能力对control进行了增强。

GORM的增强时比较有意思的。
grails通过加载sessionfactorybean的时候(ConfigurableLocalSessionFactoryBean),会依次生成sessionfacoty和domainclass,并且利用spring的beanaware能力,在GORMEnhancingBeanPostProcessor的postProcessAfterInitialization方法中,
DomainClassGrailsPlugin.enhanceDomainClasses(application, applicationContext)
HibernatePluginSupport.enhanceSessionFactory(sf, application, applicationContext)


static enhanceDomainClasses(GrailsApplication application, ApplicationContext ctx) {
        for(GrailsDomainClass dc in application.domainClasses) {
			def domainClass = dc
            MetaClass metaClass = domainClass.metaClass

            metaClass.ident = {-> delegate[domainClass.identifier.name] }
            metaClass.constructor = {->
                if(ctx.containsBean(domainClass.fullName)) {
                    ctx.getBean(domainClass.fullName)
                }
                else {
                    BeanUtils.instantiateClass(domainClass.clazz)
                }
            }
            metaClass.static.create = {-> ctx.getBean(domainClass.getFullName()) }

            addValidationMethods(application, domainClass, ctx)
            addRelationshipManagementMethods(domainClass)
        }
    }

另外,HibernatePluginSupport是作为插件加载的,但是现在很多代码写死在grails里的,因此GORM现在和hibernate是强耦合的(我看了,代码写的一团浆糊,解耦的话估计工作量不小)

grails的插件运行机制是DefaultGrailsPlugin载入所有插件,//调用plugin的doWithSpring方法,加载plugin到spring的ApplicationContext

   def doWithSpring = {  .....  }


 Closure c = (Closure)this.plugin.getProperty(DO_WITH_SPRING);
            BeanBuilder bb = new BeanBuilder(getParentCtx(),springConfig, application.getClassLoader());
            Binding b = new Binding();
            b.setVariable("application", application);
            b.setVariable("manager", getManager());
            b.setVariable("plugin", this);
            b.setVariable("parentCtx", getParentCtx());
            b.setVariable("resolver", getResolver());
            bb.setBinding(b);
            c.setDelegate(bb);
            bb.invokeMethod("beans", new Object[]{c});
     


doWithSpring是委托执行,委托beanbuilder执行闭包
	private BeanBuilder invokeBeanDefiningClosure(Closure callable) {

		callable.setDelegate(this);
  //      callable.setResolveStrategy(Closure.DELEGATE_FIRST);
        callable.call();
		finalizeDeferredProperties();

        return this;
    }

doWithApplicationContext是直接执行,参数是applicationContext
    public void doWithApplicationContext(ApplicationContext applicationContext) {
        if(this.pluginBean.isReadableProperty(DO_WITH_APPLICATION_CONTEXT)) {
            Closure c = (Closure)this.plugin.getProperty(DO_WITH_APPLICATION_CONTEXT);
            c.setDelegate(this);
            c.call(new Object[]{applicationContext});
        }

分享到:
评论
3 楼 bonny 2009-05-01  
1,闭包可以看成代码块,可以被当成参数引用和调用。
2,闭包debug的时候看起来像内部类。
3,this,owner,delegate,it
4,委托
2 楼 bonny 2009-05-01  
http://romejiang.iteye.com/blog/214812

闭包概念
Groovy语言中闭包(closure)是一个非常重要的概念,而且深入的理解了闭包对充分用好Groovy有很大帮助。对闭包比较书面的一种解释“闭包是可以用作函数参数和方法参数的代码块”。其实Groovy的闭包更象是一个“代码块”或者方法指针,代码在某处被定义然后在其后的调用处执行。
现在支持闭包的语言有 Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Perl,Ruby 和 Python 。
闭包基础
来看一个例子:
def square = {it * it} // 定义一个叫square的闭包。it是默认的 参数名称
assert 4 == square(2) // 使用闭包
assert [1,4,9] == [1,2,3].collect(square) // 使用闭包

闭包类似Java的内类,区别是闭包只有单一的方法可以调用,但可以有任意的参数,闭包用“{}”括起,“->”前面是参数,后面是处理语句,可以直接调用,也可以使用call调用。不管那种调用,最后groovy编译器都会把编译成对doCall方法的调用,这是groovy对闭包的一个隐藏方法。
def closure = { param -> println("hello ${param}") }
closure.call("world!")

def closure = { greeting, name -> println(greeting + name) }
closure.call("hello ", "world!")
第一个例子演示了在字符串内使用参数的形式:${param}
第二个例子演示了多参数形式:用“,”分隔参数
如果你的参数少于2个,那么它可以直接忽略掉。如果只有一个参数,可以不写,而使用缺省的参数“it”,如下面的例子:
closure = { println "hello " + it }
closure.call("world!")
把闭包当作变量返回的例子:
def localMethod() {
  def localVariable = new java.util.Date()
  return { println localVariable }
}

def clos = localMethod()

println "Executing the closure:"
clos()

Groovy闭包中几个隐含变量
it:默认的参数名,调用是如果没有传参数,it为null
this : 跟Java一样,是定义闭包所在类的一个引用,不管有多少层闭包嵌套,this指向的都是最上层的类。
owner : 封闭闭包的对象(如果只有一层闭包就是this,如果有多层闭包嵌套就是含有此闭包的上层闭包)
delegate :缺省值是owner,但是可以改变,后面详说。
看例子:
class Class1 {
  def closure = {
    println " ============================== "
    println "this = "+ this.class.name
    println "owner = " + owner.class.name
    println "delegate = " + delegate.class.name
    def nestedClos = {
        println " ============================== "
        println "this = "+ this.class.name
        println "owner = " + owner.class.name
        println "delegate = " + delegate.class.name
      def thirdClos = {
            println " ============================== "
            println "this = "+ this.class.name
            println "owner = " + owner.class.name
            println "delegate = " + delegate.class.name
      }
      thirdClos() 
    }
    nestedClos()
  }
}

def clos = new Class1().closure
//clos.delegate = this
clos()
执行结果:
==============================
this = Class1
owner = Class1
delegate = Class1
==============================
this = Class1
owner = Class1$_closure1
delegate = Class1$_closure1
==============================
this = Class1
owner = Class1$_closure1_closure2
delegate = Class1$_closure1_closure2
闭包实现接口
前面说了用闭包实现类,或继承其他类。现在看看怎么实现接口。

interface Test
{
def test()
}


def test = {
println'ok'
} as Test
    
test.test()
如果接口只有一个方法需要实现,比如Comparator,Runnable等接口就可以直接实现方法后加上 as Runnable接口名就可以。
多方法接口,groovy用Map的方法实现。
interface MultiFuncTest
{
    def test1()
    def test2(str)
}


def impl = [test1:{println'test'},
        test2:{str -> println str}] as MultiFuncTest

impl.test1()
impl.test2('ok')

delegate委托的用法
delegate委托在是一种常用设计模式,但在java中实现相对比较繁琐,groovy直接在GroovyObject中已经实现了delegate模式,所以在groovy中应用delegate很方便。
class Dog{
    def play = {
      "wang wang!"
    }
    def childmind = {
        println       delegate.play();     
    }
}
class Cat {
    def play = {"mi mi !"}
}
def dog = new Dog()
def cat = new Cat()
dog.childmind()
dog.childmind.delegate  = cat;
dog.childmind()
上面的例子是狗爸爸让老猫帮忙照看他的狗儿子玩游戏。
闭包是Groovy一种核心技术,也是现在比较流行的动态语言的核心技术,所以全面稳定的掌握闭包是非常必要的。

参考:
http://blog.csdn.net/hivon/archive/2008/04/23/2318760.aspx  Groovy探索之闭包 三
http://www.chinagroovy.org/groovywiki/doku.php/wiki:user_guide:closures Groovy文档翻译,什么是闭包
1 楼 bonny 2009-05-01  
待续:

1,闭包作为groovy一个基础设置,还不太了解其内部构造和常用方法,要抽时间看看。
2,在grails框架里看到groovy的meta编程机制结合spring结合闭包的代码,要挑一个仔细看看,这次看的很粗

相关推荐

    Java程序员使用Grails的十大优势

    Grails框架以其易学性著称,尤其对于已经熟悉Java的开发者来说,它提供了一个无缝过渡的平台。由于Grails基于Groovy语言,该语言的设计理念是与Java高度兼容,这意味着Java开发者几乎可以直接上手使用Groovy语法,而...

    GrailsWeb应用框架grails-core

    "grails-core"是Grails框架的核心模块,包含了构建、运行和管理Grails应用程序所需的基本组件和服务。这个框架的主要目标是提高开发效率,通过简化开发流程和提供丰富的内置功能来实现快速的Web应用开发。 **Groovy...

    Grails技术精解与Web开发实践.pdf

    Grails技术精解与Web开发实践这本书是针对Grails框架的一本教程书籍,它详细介绍了Grails框架的安装和配置、核心概念、主要组件以及如何运用Grails进行Web应用的开发。书中可能涵盖了以下知识点: 1. Grails框架的...

    grails-core源码

    Grails采用Spring框架的依赖注入,使得对象之间的关系在运行时动态决定,增强了代码的可测试性和可维护性。`ApplicationContext`是依赖注入的核心,它管理所有bean的创建和销毁。 五、模板引擎和视图渲染 Grails的...

    grails-1.3.0.RC2

    在研究 `grails-1.3.0.RC2` 源代码时,开发者可以深入了解Grails框架的架构,学习如何实现MVC模式,以及如何利用Groovy语言的特性来优化Web应用的开发。此外,还可以探索框架的内部工作原理,比如GORM是如何处理...

    Grails1.1中文文档.rar

    6. **URL Mappings**:Grails 提供了优雅的URL映射机制,允许开发者定义易于理解和使用的URL结构。 7. **Plugins**:Grails 插件系统是其一大亮点,提供了大量的预构建组件,如Spring Security、Hibernate、RESTful...

    Grails学习记录

    【标签】:“源码”与“工具”这两个标签暗示了这篇学习记录可能涵盖了Grails框架的源代码解析以及开发者工具的使用技巧。对于“源码”,可能涉及到对Grails内部机制的理解,如控制器、服务、领域模型等的实现;而...

    Getting Started with Grails

    #### 一、Grails框架简介 Grails是一个全栈式的Web应用开发框架,基于一系列成熟且广受好评的开源技术构建,如Spring、Hibernate、Ant、JUnit等。它充分利用了Groovy动态编程语言的优势,并遵循约定优于配置...

    grails使用手册

    `api`目录可能包含Grails框架的API文档,这对于了解和使用Grails的各种类库和方法至关重要。开发者可以通过这些文档学习如何有效地调用Grails的API,例如Domain Classes(领域模型)、Controllers、Services、...

    grails-2.3.6.zip

    7. **Grails Filters**: 过滤器(Filters)是Grails中用于在请求处理前后执行代码的机制,常用于登录验证、日志记录等场景。开发者可以轻松地定义全局或特定控制器的过滤器。 8. ** Geb和Spock 测试**: Geb是一个...

    Grails基础教程.pdf

    - 生产效率高:得益于Groovy语言的强大特性和Grails框架的高度自动化能力,开发人员能够更加专注于业务逻辑的实现。 **1.6 Grails入门** - **运行Grails命令**:通过简单的命令行指令即可快速创建新项目或执行各种...

    Grails技术精解与web开发实践2-10章

    《Grails技术精解与Web开发实践2-10章》是针对Grails框架的一份珍贵资源,适合初学者及有经验的开发者深入理解并掌握Grails技术。这本书的章节涵盖了从基础到进阶的多个方面,旨在帮助读者全面了解和运用Grails进行...

    grails-docs-2.1.1.zip

    4. **api**: API文档,列出Grails框架的类库、方法和接口,是开发者的重要参考。 5. **img**: 图像文件,可能用于美化文档或示例。 6. **js**: JavaScript文件,用于增强页面交互性和功能。 7. **ref**: 可能是...

    grails 中文第二版

    ### Grails框架中文第二版知识点概述 #### 一、简介 **Grails 2.0新特性** 1. **面向开发的特性** - 改进了开发者体验,例如通过简化配置来提高开发效率。 - 引入了新的工具和功能,如Groovy模板引擎Thymeleaf...

Global site tag (gtag.js) - Google Analytics