জেডিকে ডায়নামিক প্রক্সি এবং সিজিবিবের মধ্যে পার্থক্য কী?


147

ক্ষেত্রে প্রক্সি নকশা প্যাটার্ন , মধ্যে পার্থক্য কি JDK এর ডায়নামিক প্রক্সি এবং তৃতীয় পক্ষের গতিশীল কোড নির্মাণ এপিআই গুলি যেমন CGLib ?

উভয় পদ্ধতির ব্যবহারের মধ্যে পার্থক্য কী এবং যখন একজনের একে অপরের চেয়ে বেশি পছন্দ করা উচিত?


3
কোডটি এখানে পান: < gist.github.com/ksauzz/1563486 >। সিজিবিলে আপনি উভয় শ্রেণীর প্রক্সি এবং ইন্টারফেস প্রক্সি তৈরি করতে পারেন। স্প্রিং পূর্বনির্ধারিতভাবে সিজি্লিব ব্যবহার করে যখন এসপেক্টজে জাভা প্রক্সি ব্যবহার করে। এটিও পড়ুন: jnb.ociweb.com/jnb/jnbNov2005.html ;)
রায়

উত্তর:


185

জেডিকে ডায়নামিক প্রক্সি কেবল ইন্টারফেসের মাধ্যমে প্রক্সি করতে পারে (সুতরাং আপনার টার্গেট ক্লাসটি একটি ইন্টারফেস প্রয়োগ করতে হবে, যা প্রক্সি ক্লাস দ্বারা প্রয়োগ করা হয়)।

সিজিএলআইবি (এবং জাভাসিস্ট) সাবক্লাসিং করে একটি প্রক্সি তৈরি করতে পারে। এই দৃশ্যে প্রক্সি লক্ষ্য শ্রেণীর একটি সাবক্লাস হয়ে যায়। ইন্টারফেসের প্রয়োজন নেই।

সুতরাং জাভা ডায়নামিক প্রক্সিগুলি প্রক্সি করতে পারে: public class Foo implements iFooযেখানে সিজিএলআইবি প্রক্সি করতে পারে:public class Foo

সম্পাদনা করুন:

আমার উল্লেখ করা উচিত কারণ জাভাসিস্ট এবং সিজিএলআইবি সাবক্লাসিং করে প্রক্সি ব্যবহার করে, এই কারণেই আপনি চূড়ান্ত পদ্ধতিগুলি ঘোষণা করতে পারবেন না বা ফ্রেমওয়ার্কগুলি যখন এই উপর নির্ভর করে ব্যবহার করেন তখন ক্লাসটি চূড়ান্ত করতে পারবেন না। এটি এই পাঠাগারগুলিকে আপনার শ্রেণীর সাবক্লাস করার অনুমতি দেয় এবং আপনার পদ্ধতিগুলি ওভাররাইড করে would


ধন্যবাদ .. !! তবে আপনি যদি কোনও ক্ষেত্রে অন্যের ব্যবহার চিত্রিত করার জন্য আমাকে একটি উদাহরণ কোড (বা লিংক) দিতে পারেন তবে এটি সহায়ক হবে .. !!!
কেডিজাভা

1
নোট করুন যে জেডিকে প্রক্সিগুলি প্রকৃতপক্ষে IFoo এর জন্য প্রক্সিটি বন্ধ করে দিচ্ছে না কোনওরকম ফু-এর জন্য নয়। এটি বরং একটি গুরুত্বপূর্ণ পার্থক্য। এছাড়াও, cglib প্রক্সিগুলি সম্পূর্ণ সাবক্লাস - সেটির সুবিধা নিন! আপনার উত্সাহিত কেবলমাত্র প্রক্সি পদ্ধতিতে ফিল্টারগুলি ব্যবহার করুন এবং উত্পন্ন শ্রেণিটি সরাসরি ব্যবহার করুন।
lscoughlin

9
এটিও লক্ষ করা উচিত যে সিজিএলআইবি সাব-ক্লাস তৈরির জন্য সঠিক শ্রেণীর সাথে সঠিক কনস্ট্রাক্টরকে কল করতে সক্ষম হওয়ার জন্য সুপার ক্লাস সম্পর্কে পর্যাপ্ত পরিমাণে জানা দরকার। ইন্টারফেস ভিত্তিক প্রক্সি যা কনস্ট্রাক্টরদের সম্পর্কে চিন্তা করে না তার বিপরীতে। এটি সিডিলিব প্রক্সির সাথে কাজ করে জেডকে প্রক্সির তুলনায় কম "স্বয়ংক্রিয়"। আর একটি পার্থক্য হ'ল "স্ট্যাক" ব্যয়। একটি জেডিকে প্রক্সি সর্বদা কল প্রতি অতিরিক্ত স্ট্যাক ফ্রেমগুলি অন্তর্ভুক্ত করে যখন কোনও সিজিএলিব কোনও অতিরিক্ত স্ট্যাক ফ্রেমের জন্য ব্যয় করতে পারে না। এটি অ্যাপটি যত জটিল আকার ধারণ করে ক্রমশ প্রাসঙ্গিক হয়ে ওঠে (কারণ বড় স্ট্যাক, মেমরির থ্রেডগুলি বেশি পরিমাণে গ্রাস করে)।
রায়

1
cglib চূড়ান্ত পদ্ধতিগুলির প্রক্সি করতে পারে না, তবে ব্যতিক্রম নিক্ষেপ করবে না gist.github.com/mhewedy/7345403cfa52e6f47563f8a204ec0e80
মুহাম্মদ হেউডি

হ্যাঁ, সিজিবিআইবি কেবল চূড়ান্ত পদ্ধতিগুলি উপেক্ষা করে।
yashjain12yj

56

কার্যকারিতা মধ্যে পার্থক্য

  • জেডিকে প্রক্সিগুলি সাবক্লাসিংয়ের সময় কোনও সেট ইন্টারফেস প্রয়োগ করার অনুমতি দেয় 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 আর সক্রিয় বিকাশের অধীনে নেই।


2
পরবর্তীকালের পারফরম্যান্স সুবিধাগুলি কেন বসন্তের ডকুমেন্টেশনগুলি সিডিবিলের চেয়ে জেডিকে প্রক্সিংয়ের পক্ষে? docs.spring.io/spring/docs/2.5.x/references/…
P4ndaman

2
Cglib একটি বাহ্যিক নির্ভরশীল এবং বর্তমানে অসমর্থিত। তৃতীয় পক্ষের সফ্টওয়্যারটির উপর নির্ভর করা সর্বদা একটি জুয়া তাই যতটা সম্ভব কম লোক এতে নির্ভর করে its
রাফায়েল শীতকালীন

আপনার ব্লগে আপনি বলেছেন: "তবে, ইনভোকেশনহ্যান্ডলার # অনুরোধ পদ্ধতি নিয়ে আসা প্রক্সি অবজেক্টের কোনও পদ্ধতি কল করার সময় আপনার সতর্কতা অবলম্বন করা উচিত this । " আপনি কি বোঝাতে চেয়েছেন?
Koray Tugay

আপনি যদি প্রক্সি অবজেক্টে কোনও পদ্ধতিতে কল করেন তবে যে কোনও কলই আমাদের ডাকে হ্যান্ডলার। যদি কোনও আহবানী হ্যান্ডলার অবজেক্টগুলিতে একটি কলকে ডেলিগেট করে তবে উল্লিখিত পুনরাবৃত্তি ঘটে।
রাফায়েল

হাই রাফেল, বার্তা আপনার উত্তরের সাথে সম্পর্কিত নয়, আমি আপনাকে 5 বছর আগে করা একটি সম্পাদনা সম্পর্কে পিন করছি । যেহেতু সিজিবিব স্পষ্টতই ২০১২ সালে কমিট করেছে, এবং গ্রেপ্তার হওয়া কোনও উন্নয়ন এর রেডমিমে দেখায় না , তাই আমি আপনার বিবৃতিটিকে ট্যাগের অংশ থেকে সরিয়েছি । উল্লেখ করার মতো প্রাসঙ্গিক কিছু থাকলে ট্যাগ বিবরণ / সংক্ষিপ্ত বিবরণ উন্নত করুন।
Cœur

28

ডায়নামিক প্রক্সি: জেডিকে রিফ্লেকশন এপিআই ব্যবহার করে রানটাইমে ইন্টারফেসগুলির গতিশীল বাস্তবায়ন ।

উদাহরণ: বসন্ত নীচে লেনদেনের জন্য গতিশীল প্রক্সি ব্যবহার করে:

এখানে চিত্র বর্ণনা লিখুন

উত্পাদিত প্রক্সি শিমের শীর্ষে আসে। এটি শিমের মধ্যে অন্তর্জাতীয় আচরণ যুক্ত করে। এখানে জেডিকে রিফ্লেকশন এপিআই ব্যবহার করে রানটাইমের সময়ে প্রক্সিটি গতিশীলভাবে উত্পন্ন করে।

যখন কোনও অ্যাপ্লিকেশন বন্ধ হয়ে যায়, তখন প্রক্সিটি ধ্বংস হয়ে যায় এবং কেবলমাত্র ফাইল সিস্টেমে আমাদের ইন্টারফেস এবং বিন থাকবে।


উপরের উদাহরণে আমাদের ইন্টারফেস রয়েছে। তবে ইন্টারফেসের বেশিরভাগ বাস্তবায়নই সেরা নয়। সুতরাং বিন একটি ইন্টারফেস প্রয়োগ করে না, সে ক্ষেত্রে আমরা উত্তরাধিকার ব্যবহার করি:

এখানে চিত্র বর্ণনা লিখুন

এই জাতীয় প্রক্সি তৈরি করতে, স্প্রিং সিজিএলিব নামে একটি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করে ।

সিজিএলিব ( সি ওড জি অ্যানিরেশন লিব রারি ) এএসএম এর শীর্ষে নির্মিত , এটি মূলত জেনারেট প্রক্সি প্রসারণকারী শিম ব্যবহৃত হয় এবং প্রক্সি পদ্ধতিতে শিম আচরণ যুক্ত করে।

জেডিকে ডায়নামিক প্রক্সি এবং সিজিএলিবের উদাহরণ

বসন্ত রেফ


5

স্প্রিং ডকুমেন্টেশন থেকে :

স্প্রিং এওপি প্রদত্ত টার্গেট অবজেক্টের জন্য প্রক্সি তৈরি করতে JDK গতিশীল প্রক্সি বা CGLIB ব্যবহার করে। (যখনই আপনার পছন্দ থাকে জেডিকে ডায়নামিক প্রক্সিগুলি পছন্দ করা হয়)।

লক্ষ্যযুক্ত বস্তু যদি অন্তত একটি ইন্টারফেস প্রয়োগ করে তবে জেডিকে ডায়নামিক প্রক্সি ব্যবহার করা হবে। লক্ষ্য ধরণের দ্বারা প্রয়োগ করা সমস্ত ইন্টারফেস প্রক্সাইড করা হবে। যদি লক্ষ্য বস্তুটি কোনও ইন্টারফেস বাস্তবায়ন না করে তবে একটি সিজিএলআইবি প্রক্সি তৈরি করা হবে।

আপনি যদি সিজিএলআইবি প্রক্সিং ব্যবহারকে জোর করতে চান (উদাহরণস্বরূপ, টার্গেট অবজেক্টের জন্য নির্ধারিত প্রতিটি পদ্ধতির প্রক্সি করা, কেবল তার ইন্টারফেস দ্বারা প্রয়োগ করা নয়) আপনি এটি করতে পারেন। তবে কিছু বিষয় বিবেচনা করতে হবে:

চূড়ান্ত পদ্ধতিগুলি পরামর্শ দেওয়া যায় না, কারণ সেগুলি ওভাররাইড করা যায় না।

আপনার ক্লাসপথে সিজিএলআইবি 2 বাইনারি লাগবে, যেখানে জেডিকে দিয়ে গতিশীল প্রক্সিগুলি পাওয়া যায়। যখন CGLIB দরকার হয় এবং CGLIB গ্রন্থাগার ক্লাসটি ক্লাসপথে পাওয়া যায় না তখন বসন্ত আপনাকে স্বয়ংক্রিয়ভাবে সতর্ক করবে।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.