স্প্রিং ডেটা সংগ্রহস্থলগুলি বাস্তবে কীভাবে প্রয়োগ করা হয়?


111

আমি কিছুদিন ধরে আমার প্রকল্পে স্প্রিং ডেটা জেপিএ সংগ্রহস্থলের সাথে কাজ করছি এবং আমি নীচের বিষয়গুলি জানি:

  • সংগ্রহস্থল ইন্টারফেসে, আমরা পদ্ধতিগুলি findByCustomerNameAndPhone()( ডোমেন অবজেক্টে ধরে নেওয়া customerNameএবং phoneক্ষেত্রগুলি) এর মতো যুক্ত করতে পারি।
  • তারপরে, স্প্রিং রানটাইম (অ্যাপ্লিকেশন চলাকালীন) উপরোক্ত সংগ্রহস্থল ইন্টারফেস পদ্ধতি প্রয়োগ করে বাস্তবায়ন সরবরাহ করে।

এটি কীভাবে কোডিং হয়েছে এবং আমি স্প্রিং জেপিএ উত্স কোড এবং এপিআইগুলিতে নজর রেখেছি তাতে আমি আগ্রহী, তবে আমি নীচের প্রশ্নের উত্তর খুঁজে পাইনি:

  1. রানটাইম এবং পদ্ধতিগুলি প্রয়োগ ও ইনজেকশনের মাধ্যমে কীভাবে সংগ্রহস্থল বাস্তবায়ন শ্রেণি উত্পন্ন হয়?
  2. স্প্রিং ডেটা জেপিএ পদ্ধতিগুলি বাস্তবায়নের জন্য এবং গতিশীলভাবে ইনজেকশন দেওয়ার জন্য সিজিবিব বা কোনও বাইটকোড ম্যানিপুলেশন লাইব্রেরি ব্যবহার করে?

আপনি কি দয়া করে উপরের প্রশ্নাগুলি সহায়তা করতে এবং কোনও সমর্থিত নথিপত্র সরবরাহ করতে পারেন?

উত্তর:


144

প্রথমত, কোনও কোড জেনারেশন চলছে না, যার অর্থ: কোনও সিজিবিব নয়, কোনও বাইট-কোড জেনারেশন নয়। মৌলিক পদ্ধতির হ'ল একটি জেডিকে প্রক্সি উদাহরণটি ProxyFactoryইন্টারফেসটি ব্যাক করতে স্প্রিংয়ের এপিআই ব্যবহার করে প্রোগ্রামগতভাবে তৈরি করা হয়েছিল এবং MethodInterceptorসমস্ত কলগুলিকে দৃষ্টান্তে ডেকে আনে এবং পদ্ধতিটিকে উপযুক্ত জায়গায় স্থান দেয়:

  1. যদি ভাণ্ডারটি কাস্টম বাস্তবায়নের অংশ দিয়ে শুরু করা হয়েছে ( বিশদের জন্য রেফারেন্স ডকুমেন্টেশনের সেই অংশটি দেখুন), এবং সেই পদ্ধতিটি যে শ্রেণিতে প্রয়োগ করা হয়েছিল, কলটি সেখানে স্থানান্তরিত হবে।
  2. যদি পদ্ধতিটি একটি কোয়েরি পদ্ধতি হয় ( DefaultRepositoryInformationএটি কীভাবে নির্ধারণ করা হয় তা দেখুন), স্টোর নির্দিষ্ট ক্যোয়ারী এক্সিকিউশন মেকানিজম শুরুতে সেই পদ্ধতির জন্য নির্ধারিত কোয়েরিটিকে কিক করে এবং কার্যকর করে। তার জন্য একটি রেজোলিউশন প্রক্রিয়া এমন স্থানে রয়েছে যা বিভিন্ন স্থানে স্পষ্টভাবে ঘোষিত কোয়েরিগুলি সনাক্ত করার চেষ্টা করে ( @Queryপদ্ধতিটি ব্যবহার করে, জেপিএ নামের কোয়েরিগুলি) অবশেষে পদ্ধতির নাম থেকে কোয়েরি অনুসন্ধানে ফিরে আসে। কোয়েরি প্রক্রিয়া সনাক্তকরণের জন্য, দেখুন JpaQueryLookupStrategy। ক্যোয়ারী ডেরাইভেশনটির বিশ্লেষণ যুক্তি খুঁজে পাওয়া যাবে PartTree। প্রকৃত ক্যোয়ারীতে স্টোর নির্দিষ্ট অনুবাদ যেমন দেখা যায় JpaQueryCreator
  3. উপরের কোনওটি প্রয়োগ না করা হলে কার্যকরভাবে স্টোর-নির্দিষ্ট সংগ্রহস্থল বেস শ্রেণি দ্বারা ( SimpleJpaRepositoryজেপিএ ক্ষেত্রে) প্রয়োগ করা উচিত এবং কলটি এর উদাহরণে রূপান্তরিত হয়।

রাউটিং লজিকটি প্রয়োগকারী পদ্ধতি ইন্টারসেপ্টারটি QueryExecutorMethodInterceptor, উচ্চ স্তরের রাউটিং যুক্তিটি এখানে পাওয়া যাবে

এই প্রক্সিগুলির তৈরিকরণটি একটি স্ট্যান্ডার্ড জাভা ভিত্তিক কারখানার প্যাটার্ন বাস্তবায়নে আবদ্ধ। উচ্চ-স্তরের প্রক্সি তৈরির সন্ধান পাওয়া যাবে RepositoryFactorySupport। স্টোর-নির্দিষ্ট প্রয়োগগুলি তারপরে প্রয়োজনীয় অবকাঠামোগত উপাদানগুলি যুক্ত করুন যাতে জেপিএর জন্য আপনি এগিয়ে যেতে পারেন এবং কেবল এই জাতীয় কোড লিখতে পারেন:

EntityManager em =  // obtain an EntityManager
JpaRepositoryFactory factory = new JpaRepositoryFactory(em);
UserRepository repository = factory.getRepository(UserRepository.class);

আমি যে কারণে স্পষ্টভাবে উল্লেখ করেছি তা হ'ল এটি স্পষ্ট হয়ে উঠতে হবে যে এর মূল অংশে code কোডটির কোনও কিছুর জন্য প্রথমে স্প্রিং পাত্রে চালিত হওয়া দরকার না। এটি ক্লাসপথের একটি গ্রন্থাগার হিসাবে স্প্রিংয়ের প্রয়োজন (কারণ আমরা চাকাটি পুনরায় উদ্ভাবন করতে পছন্দ করি না), তবে সাধারণভাবে এটি ধারক অজ্ঞাবহ।

ডিআই কনটেইনারগুলির সাথে সংহতকরণটি সহজ করার জন্য আমরা অবশ্যই স্প্রিং জাভা কনফিগারেশন, একটি এক্সএমএল নেমস্পেস, তবে সিডিআই এক্সটেনশনের সাথে ইন্টিগ্রেশন তৈরি করেছি , যাতে স্প্রিং ডেটা সরল সিডিআই দৃশ্যে ব্যবহার করা যায়।


3
হাই অলিভার, আপনি কীভাবে বসন্তকে @Repositoryপ্রথম স্থানে টীকাগুলি ইন্টারফেসগুলি আবিষ্কার করেন তা বিশদ দিয়ে বলতে পারেন ? শোটির দিকে RepositoryFactorySupport#getRepository()তাকানো যে এটি প্যারামিটার হিসাবে ইন্টারফেস শ্রেণি নেয়, তাই এটি অন্য কোথাও আবিষ্কার করা উচিত। আমি বিশেষত কীভাবে কোনও টীকাকৃত ইন্টারফেসটি খুঁজে পেতে এবং স্বয়ংক্রিয়ভাবে একটি জেডিকে প্রক্সি বিন তৈরি করতে পারি যা ইন্টারফেসটি কার্যকর করে, খুব স্প্রিং-ডেটার মতো, তবে কোনও অ্যাপ্লিকেশন-নির্দিষ্ট উদ্দেশ্যে রিপোজিটরি সম্পর্কিত নয় not
ক্রিস রাইস

1
আপনি একবার দেখতে চান RepositoryComponentProvider। এখানে কোনও স্বয়ংক্রিয় জিনিস ঘটছে না তবে নির্দিষ্ট ধরণের (একটি টিকা দেওয়া বা একটি টীকাকরণ বহনকারী) এবং FactoryBeanসেগুলির প্রত্যেকটির জন্য একটি কনফিগার করা একটি উপাদান স্ক্যান scan
অলিভার ড্রটবহম

2
কোনও পুরানো থ্রেডে মন্তব্য করার জন্য দুঃখিত, তবে কৌতূহলী ছিল ... সঞ্চারটন প্রক্সিগুলি কি সিঙ্গলটন অবজেক্টস? আমরা এমন একটি সমস্যা দেখতে পাচ্ছি যার মাধ্যমে আমাদের কোড একটি রেপো পদ্ধতিতে কল করার চেষ্টা করছে তবে এটি কখনও প্রক্সিতে কল করতে সক্ষম হবে বলে মনে হয় না। এটি কেবল ঝুলছে। আমি অবাক হয়ে যদি এটি ব্যস্ত একটি সিঙ্গলটনের জন্য অপেক্ষা করে থাকে?
iu.david
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.