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});
}
分享到:
相关推荐
Grails框架以其易学性著称,尤其对于已经熟悉Java的开发者来说,它提供了一个无缝过渡的平台。由于Grails基于Groovy语言,该语言的设计理念是与Java高度兼容,这意味着Java开发者几乎可以直接上手使用Groovy语法,而...
"grails-core"是Grails框架的核心模块,包含了构建、运行和管理Grails应用程序所需的基本组件和服务。这个框架的主要目标是提高开发效率,通过简化开发流程和提供丰富的内置功能来实现快速的Web应用开发。 **Groovy...
Grails技术精解与Web开发实践这本书是针对Grails框架的一本教程书籍,它详细介绍了Grails框架的安装和配置、核心概念、主要组件以及如何运用Grails进行Web应用的开发。书中可能涵盖了以下知识点: 1. Grails框架的...
Grails采用Spring框架的依赖注入,使得对象之间的关系在运行时动态决定,增强了代码的可测试性和可维护性。`ApplicationContext`是依赖注入的核心,它管理所有bean的创建和销毁。 五、模板引擎和视图渲染 Grails的...
在研究 `grails-1.3.0.RC2` 源代码时,开发者可以深入了解Grails框架的架构,学习如何实现MVC模式,以及如何利用Groovy语言的特性来优化Web应用的开发。此外,还可以探索框架的内部工作原理,比如GORM是如何处理...
6. **URL Mappings**:Grails 提供了优雅的URL映射机制,允许开发者定义易于理解和使用的URL结构。 7. **Plugins**:Grails 插件系统是其一大亮点,提供了大量的预构建组件,如Spring Security、Hibernate、RESTful...
【标签】:“源码”与“工具”这两个标签暗示了这篇学习记录可能涵盖了Grails框架的源代码解析以及开发者工具的使用技巧。对于“源码”,可能涉及到对Grails内部机制的理解,如控制器、服务、领域模型等的实现;而...
#### 一、Grails框架简介 Grails是一个全栈式的Web应用开发框架,基于一系列成熟且广受好评的开源技术构建,如Spring、Hibernate、Ant、JUnit等。它充分利用了Groovy动态编程语言的优势,并遵循约定优于配置...
`api`目录可能包含Grails框架的API文档,这对于了解和使用Grails的各种类库和方法至关重要。开发者可以通过这些文档学习如何有效地调用Grails的API,例如Domain Classes(领域模型)、Controllers、Services、...
7. **Grails Filters**: 过滤器(Filters)是Grails中用于在请求处理前后执行代码的机制,常用于登录验证、日志记录等场景。开发者可以轻松地定义全局或特定控制器的过滤器。 8. ** Geb和Spock 测试**: Geb是一个...
- 生产效率高:得益于Groovy语言的强大特性和Grails框架的高度自动化能力,开发人员能够更加专注于业务逻辑的实现。 **1.6 Grails入门** - **运行Grails命令**:通过简单的命令行指令即可快速创建新项目或执行各种...
《Grails技术精解与Web开发实践2-10章》是针对Grails框架的一份珍贵资源,适合初学者及有经验的开发者深入理解并掌握Grails技术。这本书的章节涵盖了从基础到进阶的多个方面,旨在帮助读者全面了解和运用Grails进行...
4. **api**: API文档,列出Grails框架的类库、方法和接口,是开发者的重要参考。 5. **img**: 图像文件,可能用于美化文档或示例。 6. **js**: JavaScript文件,用于增强页面交互性和功能。 7. **ref**: 可能是...
### Grails框架中文第二版知识点概述 #### 一、简介 **Grails 2.0新特性** 1. **面向开发的特性** - 改进了开发者体验,例如通过简化配置来提高开发效率。 - 引入了新的工具和功能,如Groovy模板引擎Thymeleaf...