ক্ষেত্রে প্রক্সি নকশা প্যাটার্ন , মধ্যে পার্থক্য কি JDK এর ডায়নামিক প্রক্সি এবং তৃতীয় পক্ষের গতিশীল কোড নির্মাণ এপিআই গুলি যেমন CGLib ?
উভয় পদ্ধতির ব্যবহারের মধ্যে পার্থক্য কী এবং যখন একজনের একে অপরের চেয়ে বেশি পছন্দ করা উচিত?
ক্ষেত্রে প্রক্সি নকশা প্যাটার্ন , মধ্যে পার্থক্য কি JDK এর ডায়নামিক প্রক্সি এবং তৃতীয় পক্ষের গতিশীল কোড নির্মাণ এপিআই গুলি যেমন CGLib ?
উভয় পদ্ধতির ব্যবহারের মধ্যে পার্থক্য কী এবং যখন একজনের একে অপরের চেয়ে বেশি পছন্দ করা উচিত?
উত্তর:
জেডিকে ডায়নামিক প্রক্সি কেবল ইন্টারফেসের মাধ্যমে প্রক্সি করতে পারে (সুতরাং আপনার টার্গেট ক্লাসটি একটি ইন্টারফেস প্রয়োগ করতে হবে, যা প্রক্সি ক্লাস দ্বারা প্রয়োগ করা হয়)।
সিজিএলআইবি (এবং জাভাসিস্ট) সাবক্লাসিং করে একটি প্রক্সি তৈরি করতে পারে। এই দৃশ্যে প্রক্সি লক্ষ্য শ্রেণীর একটি সাবক্লাস হয়ে যায়। ইন্টারফেসের প্রয়োজন নেই।
সুতরাং জাভা ডায়নামিক প্রক্সিগুলি প্রক্সি করতে পারে: public class Foo implements iFoo
যেখানে সিজিএলআইবি প্রক্সি করতে পারে:public class Foo
সম্পাদনা করুন:
আমার উল্লেখ করা উচিত কারণ জাভাসিস্ট এবং সিজিএলআইবি সাবক্লাসিং করে প্রক্সি ব্যবহার করে, এই কারণেই আপনি চূড়ান্ত পদ্ধতিগুলি ঘোষণা করতে পারবেন না বা ফ্রেমওয়ার্কগুলি যখন এই উপর নির্ভর করে ব্যবহার করেন তখন ক্লাসটি চূড়ান্ত করতে পারবেন না। এটি এই পাঠাগারগুলিকে আপনার শ্রেণীর সাবক্লাস করার অনুমতি দেয় এবং আপনার পদ্ধতিগুলি ওভাররাইড করে would
কার্যকারিতা মধ্যে পার্থক্য
জেডিকে প্রক্সিগুলি সাবক্লাসিংয়ের সময় কোনও সেট ইন্টারফেস প্রয়োগ করার অনুমতি দেয় Object
। কোন ইন্টারফেস পদ্ধতি, প্লাস Object::hashCode
, Object::equals
এবং Object::toString
তারপর এ ফরোয়ার্ড করা হয়েছে InvocationHandler
। অতিরিক্তভাবে, স্ট্যান্ডার্ড লাইব্রেরি ইন্টারফেস java.lang.reflect.Proxy
প্রয়োগ করা হয়।
cglib আপনাকে কোনও অ-চূড়ান্ত শ্রেণীর সাবক্লাসিং করার সময় ইন্টারফেসের কোনও সেট প্রয়োগ করতে দেয়। এছাড়াও, পদ্ধতিগুলি optionচ্ছিকভাবে ওভাররাইড করা যেতে পারে, অর্থাত্ সমস্ত নন-অ্যাবস্ট্রাক্ট পদ্ধতিতে বাধা দেওয়ার প্রয়োজন নেই। তদুপরি, একটি পদ্ধতি বাস্তবায়নের বিভিন্ন উপায় রয়েছে। এটি একটি InvocationHandler
ক্লাসও সরবরাহ করে (ভিন্ন প্যাকেজে), তবে এটি আরও উন্নত ইন্টারসেপ্টর ব্যবহার করে সুপার পদ্ধতিগুলি কল করার অনুমতি দেয় যেমন উদাহরণ হিসাবে ক MethodInterceptor
। তদ্ব্যতীত, cglib বিশেষায়িত মতবিরোধের দ্বারা কর্মক্ষমতা উন্নত করতে পারে FixedValue
। আমি একবার cglib জন্য বিভিন্ন ইন্টারসেপ্টরের একটি সংক্ষিপ্তসার লিখেছি ।
পারফরম্যান্স পার্থক্য
জেডিকে প্রক্সিগুলি কেবলমাত্র একটি ইন্টারসেপশন প্রেরণকারী, এর পরিবর্তে নির্লিপ্তভাবে প্রয়োগ করা হয় InvocationHandler
। এটির জন্য একটি বাস্তবায়নের জন্য একটি ভার্চুয়াল পদ্ধতি প্রেরণ প্রয়োজন যা সর্বদা ইনলাইন করা যায় না। Cglib বিশেষায়িত বাইট কোড তৈরি করতে দেয় যা কখনও কখনও কর্মক্ষমতা উন্নত করতে পারে। 18 টি স্টাব পদ্ধতিতে একটি ইন্টারফেস বাস্তবায়নের জন্য এখানে কিছু তুলনা দেওয়া হয়েছে:
cglib JDK proxy
creation 804.000 (1.899) 973.650 (1.624)
invocation 0.002 (0.000) 0.005 (0.000)
ব্রেসগুলিতে স্ট্যান্ডার্ড বিচ্যুতি সহ ন্যানোসেকেন্ডগুলিতে সময়টি উল্লেখ করা হয়েছে। আপনি বাইট বুডির টিউটোরিয়ালে বেঞ্চমার্কে আরও বিশদ পেতে পারেন , যেখানে বাইট বুডি সিজিবিব-এর আরও আধুনিক বিকল্প। এছাড়াও, নোট করুন যে cglib আর সক্রিয় বিকাশের অধীনে নেই।
ডায়নামিক প্রক্সি: জেডিকে রিফ্লেকশন এপিআই ব্যবহার করে রানটাইমে ইন্টারফেসগুলির গতিশীল বাস্তবায়ন ।
উদাহরণ: বসন্ত নীচে লেনদেনের জন্য গতিশীল প্রক্সি ব্যবহার করে:
উত্পাদিত প্রক্সি শিমের শীর্ষে আসে। এটি শিমের মধ্যে অন্তর্জাতীয় আচরণ যুক্ত করে। এখানে জেডিকে রিফ্লেকশন এপিআই ব্যবহার করে রানটাইমের সময়ে প্রক্সিটি গতিশীলভাবে উত্পন্ন করে।
যখন কোনও অ্যাপ্লিকেশন বন্ধ হয়ে যায়, তখন প্রক্সিটি ধ্বংস হয়ে যায় এবং কেবলমাত্র ফাইল সিস্টেমে আমাদের ইন্টারফেস এবং বিন থাকবে।
উপরের উদাহরণে আমাদের ইন্টারফেস রয়েছে। তবে ইন্টারফেসের বেশিরভাগ বাস্তবায়নই সেরা নয়। সুতরাং বিন একটি ইন্টারফেস প্রয়োগ করে না, সে ক্ষেত্রে আমরা উত্তরাধিকার ব্যবহার করি:
এই জাতীয় প্রক্সি তৈরি করতে, স্প্রিং সিজিএলিব নামে একটি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করে ।
সিজিএলিব ( সি ওড জি অ্যানিরেশন লিব রারি ) এএসএম এর শীর্ষে নির্মিত , এটি মূলত জেনারেট প্রক্সি প্রসারণকারী শিম ব্যবহৃত হয় এবং প্রক্সি পদ্ধতিতে শিম আচরণ যুক্ত করে।
স্প্রিং এওপি প্রদত্ত টার্গেট অবজেক্টের জন্য প্রক্সি তৈরি করতে JDK গতিশীল প্রক্সি বা CGLIB ব্যবহার করে। (যখনই আপনার পছন্দ থাকে জেডিকে ডায়নামিক প্রক্সিগুলি পছন্দ করা হয়)।
লক্ষ্যযুক্ত বস্তু যদি অন্তত একটি ইন্টারফেস প্রয়োগ করে তবে জেডিকে ডায়নামিক প্রক্সি ব্যবহার করা হবে। লক্ষ্য ধরণের দ্বারা প্রয়োগ করা সমস্ত ইন্টারফেস প্রক্সাইড করা হবে। যদি লক্ষ্য বস্তুটি কোনও ইন্টারফেস বাস্তবায়ন না করে তবে একটি সিজিএলআইবি প্রক্সি তৈরি করা হবে।
আপনি যদি সিজিএলআইবি প্রক্সিং ব্যবহারকে জোর করতে চান (উদাহরণস্বরূপ, টার্গেট অবজেক্টের জন্য নির্ধারিত প্রতিটি পদ্ধতির প্রক্সি করা, কেবল তার ইন্টারফেস দ্বারা প্রয়োগ করা নয়) আপনি এটি করতে পারেন। তবে কিছু বিষয় বিবেচনা করতে হবে:
চূড়ান্ত পদ্ধতিগুলি পরামর্শ দেওয়া যায় না, কারণ সেগুলি ওভাররাইড করা যায় না।
আপনার ক্লাসপথে সিজিএলআইবি 2 বাইনারি লাগবে, যেখানে জেডিকে দিয়ে গতিশীল প্রক্সিগুলি পাওয়া যায়। যখন CGLIB দরকার হয় এবং CGLIB গ্রন্থাগার ক্লাসটি ক্লাসপথে পাওয়া যায় না তখন বসন্ত আপনাকে স্বয়ংক্রিয়ভাবে সতর্ক করবে।
আপনার প্রক্সাইড অবজেক্টের কনস্ট্রাক্টরকে দু'বার কল করা হবে। এটি সিজিআইএলআইবি প্রক্সি মডেলের একটি প্রাকৃতিক পরিণতি যার দ্বারা প্রতিটি প্রক্সিড অবজেক্টের জন্য একটি সাবক্লাস তৈরি করা হয়। প্রতিটি প্রক্সি উদাহরণ হিসাবে, দুটি বস্তু তৈরি করা হয়: প্রকৃত প্রক্সি বস্তু এবং সাবক্লাসের একটি উদাহরণ যা পরামর্শ কার্যকর করে। জেডিকে প্রক্সিগুলি ব্যবহার করার সময় এই আচরণটি প্রদর্শিত হয় না। সাধারণত, প্রক্সিড টাইপের কনস্ট্রাক্টরকে দু'বার কল করা কোনও সমস্যা নয়, কারণ এখানে কেবলমাত্র অ্যাসাইনমেন্ট হয় এবং কনস্ট্রাক্টরে কোনও বাস্তব যুক্তি প্রয়োগ করা হয় না।