當我讀here時,grails使用methodMissing將GORM方法注入到域類中,但是說methodMissing執行起來很昂貴,只有在調度失敗的情況下才會發生,爲什麼這些方法不是通過metaClass或AST Transformations注入?任何線索?爲什麼GORM使用methodMissing
2
A
回答
7
使用methodMissing並不昂貴,因爲Grails在MOP中僅在第一次執行未找到的方法時才創建新方法。子順序執行發生在新創建的方法上。
考慮一個具有許多屬性的域類。如果所有findBy *,findAlLBy *,countBy *等排列都應該在編譯時創建,那麼這些類很容易變得非常大。通過使用methodeMissing,只會創建運行時實際使用的方法。
5
據我瞭解代碼,這些信息已過時。這些方法被注入metaClasses。看看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源代碼時的發現。
相關問題
- 1. invokeMethod和methodMissing有什麼區別?
- 2. 爲什麼gmagick :: thumbnailimage比exec(gm)慢?
- 3. Groovy的methodMissing
- 4. methodMissing closure - 未封裝?
- 5. nodejs gm使用流兩次
- 6. MethodMissing參數數量訂單
- 7. Groovy methodMissing沒有參數調用
- 8. Kerberos - 什麼是SPN,爲什麼使用
- 9. 爲什麼渲染操作後我的地圖不會生成? (Rails和YM4R/GM)
- 10. Xcode 6 GM與iPhone 5s(iOS 8 GM) - 0xE8000070
- 11. GM在xcode發佈中意味着什麼
- 12. gm和mk在gmtime()和mktime()中代表什麼?
- 13. 在nodejs中使用gm的圓角
- 14. 如何使用gm node.js進行組合?
- 15. WKCrownDelegate似乎沒有使用Xcode 9 GM
- 16. 使用gm轉換圖像並將其調整爲png
- 17. 爲什麼在項目中使用'assert'? (爲什麼使用它這麼多次)
- 18. 爲什麼要使用Windows.Forms.Timer?
- 19. 爲什麼使用functionName()== functionName.prototype.constructor()
- 20. 爲什麼使用MEMCACHED_BEHAVIOR_NOREPLY?
- 21. 爲什麼使用#'與lambda?
- 22. 爲什麼使用curses.ascii.islower?
- 23. 爲什麼mongoDB使用objectID?
- 24. 爲什麼使用ServletContext.setAttribute()?
- 25. 爲什麼要使用Mockito?
- 26. 爲什麼不使用XMLHttpRequest?
- 27. 爲什麼使用Swing BoxLayout
- 28. 爲什麼使用INSERT/* + APPEND * /?
- 29. Mysql爲什麼使用utf8_slovenian_ci?
- 30. 爲什麼使用指針
從Grails 2開始,大多數方法都是使用AST添加的。動態方法(findBy *,findAllBy *等)並不是因爲@sbglasius指出最好添加那些點播 –
好吧,所以據我瞭解sbglasius和Tomasz都是正確的,不是嗎?我的意思是Tomasz指出有些方法是由AST添加的,但由於sbglasius並未指向動態發現者。 –
對,都是正確的 –