हम ThreadLocal
का उपयोग करते हुए कुछ डेटाबेस विभाजन जानकारी सेट करने के लिए स्प्रिंग के TransactionInterceptor
का उपयोग कर रहे हैं जब भी @Transactional
एनोटेशन के साथ चिह्नित एक डीएओ विधि निष्पादित की जाती है। हमें अपने प्रश्नों को अलग-अलग डेटाबेस विभाजनों में रूट करने में सक्षम होने की आवश्यकता है।स्प्रिंग बीन कैसे पता लगा सकता है कि यह स्वयं को एओपी प्रॉक्सी में लपेटा गया है?
यह सबसे डीएओ तरीकों के लिए ठीक काम करता है:
// this causes the invoke method to set a thread-local with the host name of
// the database server the partition is on
@Transactional
public int deleteAll() throws LocalDataException {
समस्या यह है कि जब हम संदर्भ के लिए डीएओ के अंदर डीएओ प्रॉक्सी वस्तु ही जरूरत है। आमतौर पर हम फोन करने वाले प्रॉक्सी-दाव में पारित करना होगा:
public Pager<Foo, Long> getPager(FooDao proxyDao) {
इस कोड को जो स्पष्ट रूप से सकल है में ऐसा दिखाई देता है।
fooDao.getPager(fooDao);
समस्या यह है कि जब हम FooDao के अंदर कर रहे हैं, this
नहीं प्रॉक्सी डीएओ है कि हम की जरूरत है।
क्या बीन के लिए यह बेहतर तकनीक है कि यह इसके आसपास एक प्रॉक्सी रैपर है? मैंने Spring AOPUtils पर देखा है लेकिन मुझे ऑब्जेक्ट के लिए प्रॉक्सी खोजने का कोई तरीका नहीं दिख रहा है। मैं उदाहरण के लिए isAopProxy(...)
नहीं चाहता। मैंने Spring AOP docs भी पढ़ा है, लेकिन जब तक मैं अपने स्वयं के एओपी देशी कोड को लागू नहीं करता, तब तक मैं वहां कोई समाधान नहीं देख सकता।
मुझे संदेह है कि मैं ApplicationContextAware
उपयोगिता बीन और setProxyDao(...)
विधि के साथ डीएओ को इंजेक्ट करने में सक्षम हो सकता हूं, लेकिन यह एक हैक जैसा भी लगता है। कोई अन्य विचार मैं प्रॉक्सी का पता कैसे लगा सकता हूं ताकि मैं इसे बीन के भीतर से उपयोग कर सकूं? किसी भी मदद के लिए धन्यवाद।
मूल Aspectj लोड/संकलन समय का उपयोग कर बुनाई एक विकल्प नहीं है - तो सलाह प्रॉक्सी में बुनाई होगी और आपको प्रॉक्सी का कोई मुद्दा नहीं होना चाहिए और प्रॉक्सी के भीतर यह संदर्भ नहीं होना चाहिए? –
'यह' @ थोरबोजर्न नहीं करेगा क्योंकि पोस्ट स्टेटस के रूप में, मुझे प्रॉक्सी _not_ बीन स्वयं की आवश्यकता है। – Gray
अपना खुद का मूल एओपी लिखना मेरा एकमात्र समाधान @ बिजू हो सकता है। अगर मैं कर सकता हूं तो मैं इससे बचने की उम्मीद कर रहा था। धन्यवाद था। – Gray