据我了解代码,此信息已过时。这些方法被注入到元类中。查看 grails-hiberante 插件的代码。
HibernateGrailsPlugin.groovy (github) 每次上下文启动时都会执行第 49 行:
def doWithDynamicMethods = HibernatePluginSupport.doWithDynamicMethods
然后,打开HibernatePluginSupport (github) 并按照流程操作:
/*451*/ static final doWithDynamicMethods = { ApplicationContext ctx ->
def grailsApplication = application
enhanceSessionFactories(ctx, grailsApplication)
}
/*456*/ static void enhanceSessionFactories(ApplicationContext ctx, grailsApplication, source = null)
// calls in line 464:
/*464* enhanceSessionFactory sessionFactory, grailsApplication, ctx, suffix, datastores, source
这个闭包在 enhanceSessionFactory 方法中是至关重要的:
/*548*/ def enhanceEntity = ...
它在第 581-583 行中为每个实体调用。方法是从方法registerNamespaceMethods 中的第587 行生成的。据我正确理解,这些方法从第 597 行直接注入到 metaClass:
def classLoader = application.classLoader
def finders = HibernateGormEnhancer.createPersistentMethods(application, classLoader, datastore)
def staticApi = new HibernateGormStaticApi(dc.clazz, datastore, finders, classLoader, transactionManager)
dc.metaClass.static."$getter" = { -> staticApi }
def validateApi = new HibernateGormValidationApi(dc.clazz, datastore, classLoader)
def instanceApi = new HibernateGormInstanceApi(dc.clazz, datastore, classLoader)
dc.metaClass."$getter" = { -> new InstanceProxy(delegate, instanceApi, validateApi) }
如果我错了,请修改并纠正我。我不太相信这一切都是正确的。这些只是我在阅读 Grails 源代码时的发现。