Grails 1.1 运行时添加动态方法 - 跟ApplicationContext交互

doWithDynamicMethods 闭包的参数是Spring 的 ApplicationContext 实例,这点非常有用,因为这允许你和该应用上下文实例中的对象进行交互。

比如你打算实现一个跟Hibernate交互的方法,那你可以联合着 HibernateTemplate来使用SessionFactory 例,

代码如下:import org.springframework.orm.hibernate3.HibernateTemplate class ExampleHibernatePlugin { def doWithDynamicMethods = { applicationContext -> application.domainClasses.each { domainClass -> domainClass.metaClass.static.load = { Long id-> def sf = applicationContext.sessionFactory def template = new HibernateTemplate(sf) template.load(delegate, id) } } } }另外因为Spring容器具有自动装配和依赖注入的能力,你可以在运行时实现更强大的动态构造器,此构造器使用applicationContext来装配你的对象及其依赖:class MyConstructorPlugin { def doWithDynamicMethods = { applicationContext -> application.domainClasses.each { domainClass -> domainClass.metaClass.constructor = {-> return applicationContext.getBean(domainClass.name) } } } }这里我们实际做的是通过查找Spring的原型beans(prototyped beans)来替代缺省的构造器。