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)来替代缺省的构造器。