স্প্রিং এওপি বনাম অ্যাসপেক্টজে


178

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

কেউ কি একটি বসন্ত অ্যাপ্লিকেশনে স্প্রিং এওপি বনাম অ্যাসপেক্টজে ব্যবহারের বিভিন্ন উপকারিতা এবং বিষয়গুলি হাইলাইট করতে পারেন?


3
যখন স্প্রিংয়ে কিছু টিকা থাকে তবে জাভাতেও উপস্থিত থাকে আপনার কী ব্যবহার করা উচিত? জাভা। একই যুক্তি এই কার্যকারিতা জন্য প্রযোজ্য। বসন্ত বসন্ত। এখানে আজকে চলে গেছে আগামীকাল. (স্মরণকারী লোকেরা বসন্তের কিছুক্ষণ আগে স্ট্রুট ব্যবহার করেছিল)। AspectJ হল পছন্দের দীর্ঘমেয়াদী সমাধান। এটি বসন্তকে ছড়িয়ে দেবে। আমি স্প্রিংকে বরখাস্ত করছি না, কেবল এই দিকটির জন্য বলছি ...: -;
inor

উত্তর:


236

স্প্রিং-এওপি প্রো

  • AspectJ এর চেয়ে এটি ব্যবহার করা সহজ, যেহেতু আপনাকে এলটিডব্লিউ ( লোড-টাইম বয়ন ) বা এসপেক্টজে সংকলক ব্যবহার করতে হবে না ।

  • এটি প্রক্সি প্যাটার্ন এবং ডেকোরেটর প্যাটার্ন ব্যবহার করে

বসন্ত-এওপি কনস

  • এটি প্রক্সি ভিত্তিক এওপি, সুতরাং মূলত আপনি কেবল পদ্ধতি-প্রয়োগের জোড় পয়েন্টগুলি ব্যবহার করতে পারেন।
  • একই শ্রেণীর মধ্যে অন্য পদ্ধতি কল করার সময় দিকগুলি প্রয়োগ করা হয় না।
  • একটু রানটাইম ওভারহেড থাকতে পারে।
  • স্প্রিং-এওপি স্প্রিং কারখানা দ্বারা নির্মিত না এমন কোনও কিছুতে একটি দিক যোগ করতে পারে না

AspectJ প্রো

  • এটি সমস্ত জয়েন্টপয়েন্টগুলিকে সমর্থন করে। এর অর্থ আপনি কিছু করতে পারেন।
  • স্প্রিং এওপির চেয়ে রানটাইম ওভারহেড কম।

AspectJ কনস

  • সতর্ক হোন. আপনার দিকগুলি কেবল বুনতে চেয়েছিলেন তাতে বুনা হয় কিনা তা পরীক্ষা করে দেখুন।
  • আপনার অ্যাসপেক্টজে সংকলক সহ অতিরিক্ত বিল্ড প্রক্রিয়া প্রয়োজন বা এলটিডব্লু সেটআপ করতে হবে (লোড-টাইম বয়ন)

20
@ কনফিগার করার জন্য স্প্রিংয়ের মাধ্যমে অ্যাসপেকজ ব্যবহার প্রয়োজন। দস্তাবেজগুলি থেকে:If you need to advise objects not managed by the Spring container (such as domain objects typically), then you will need to use AspectJ.
এইচডিএভ

7
আমার জন্য অন্য বসন্ত-Aop বিরূদ্ধে প্রক্সি-ভিত্তিক পদ্ধতির কারণ অপাঠ্য দীর্ঘ stacktraces হয়
WRM

1
উত্তরের বিভ্রান্তিকর অংশ: কীভাবে একটি সরঞ্জামের জন্য একটি সামান্য রানটাইম ওভারহেড থাকা এবং অন্যটির জন্য সামান্য রানটাইম ওভারহেডের শঙ্কা থাকার সম্ভাবনা কীভাবে থাকে?
মোড়াকী

16
@ মোড়াকি: তিনি কনট হিসাবে 'কিছুটা ওভারহেড', এবং প্রো হিসাবে 'ছোট্ট ওভারহেড' বলেছেন। একক 'এ' পার্থক্য খুব গুরুত্বপূর্ণ - ইংরাজীতে, 'সামান্য' অর্থ 'কিছু', তবে 'ছোট' অর্থ 'প্রায় কোনওটিই নয়'।
ওয়াজেক

1
আপনার স্প্রিং এওপি প্রস (২ য় পয়েন্ট) - এ কেবলমাত্র একটি সন্দেহ - সময়)। কারণ, আমি অনুভূতির মধ্যে আছি যে অ্যাসপেক্টজে সময় সংকলন এবং স্প্রিং এওপি রান টাইম এওপি। Pls সহায়তা
পেডেন্টিক

21

অন্যেরা যা বলেছে তা বাদ দিয়ে - কেবল পুনরায় মন্তব্য করতে there are two major differences:

  1. একটি বুননের ধরণের সাথে সম্পর্কিত।
  2. জয়েন্টপয়েন্ট সংজ্ঞা আরেকটি।

স্প্রিং-এওপি: কনসেপ্ট ব্যবহার করে প্রক্সি দিয়ে রানটাইম বুনাdynamic proxy if interface exists or cglib library if direct implementation provided.

AspectJ:AspectJ Java Tools(ajc compiler) উত্স পাওয়া যায় বা পোস্ট সংকলন বুনন (সংকলিত ফাইল ব্যবহার করে) এর মাধ্যমে সময় বুননটি সঙ্কলন করুন। এছাড়াও, স্প্রিংয়ের সাথে লোড টাইম বুনন সক্ষম করা যায় - এটির aspectjসংজ্ঞা ফাইলটি প্রয়োজন এবং নমনীয়তা সরবরাহ করে।

সংকলন সময় বুনন কর্মক্ষমতা (কিছু ক্ষেত্রে) এবং এছাড়াও এর সুবিধা দিতে পারে joinpoint definition in Spring-aop is restricted to method definition only which is not the case for AspectJ.


20

একটি অতিরিক্ত নোট: উচ্চ লোডের অধীনে যদি পারফরম্যান্স গুরুত্বপূর্ণ হয় তবে আপনি এসপেক্টজে চাইবেন যা স্প্রিং এওপির চেয়ে 9-35x দ্রুত । 10ns বনাম 355ns এর মতো খুব বেশি শোনায় না, তবে আমি লোকদের অনেক দিক থেকে ব্যবহার করে দেখেছি। 10K এর দিকগুলির মূল্য। এই ক্ষেত্রে, আপনার অনুরোধ হাজার হাজার দিককে আঘাত করতে পারে। সেক্ষেত্রে আপনি সেই অনুরোধটিতে এমএস যোগ করছেন।

মানদণ্ড দেখুন ।



18

বসন্তের ব্যবহারকারী ম্যানুয়াল সরাসরি ঘোড়ার মুখ থেকে প্রচুর তথ্য দেবে।

.4.৪ অধ্যায় - যে এওপি ঘোষণার স্টাইলটি ব্যবহার করা উচিত তা চয়ন করা আপনার জন্য মারা গেছে কারণ এটি উভয়ের পক্ষে মতামত নিয়ে আলোচনা করে।

অনুচ্ছেদ .1.১.২ - স্প্রিং এওপি কাব্যাবিলিটিস এবং লক্ষ্যসমূহ এবং অধ্যায়সমূহ 6.২ - @ সহায়তা সমর্থন এবং 8.৮ - স্প্রিং অ্যাপ্লিকেশনগুলির সাথে এসপেক্টজে ব্যবহার বিশেষ আকর্ষণীয় হওয়া উচিত।


14

স্প্রিং এওপি বসন্তের কাঠামোর একটি প্রয়োজনীয় অঙ্গ। খুব প্রাথমিক পর্যায়ে, বসন্তের কাঠামোটি আইওসি এবং এওপি-র উপর ভিত্তি করে। স্প্রিংয়ের সরকারী কোর্সে একটি স্লাইড রয়েছে যা এতে বলে:

এওপি কাঠামোর অন্যতম গুরুত্বপূর্ণ অঙ্গ।

স্প্রিং-এ এওপি কীভাবে কাজ করে তা বোঝার মূল বিষয়টি হ'ল আপনি যখন স্প্রিংয়ের সাথে একটি JDKDynamicProxyদিকটি লেখেন তখন আমরা আপনার আইটেমগুলির জন্য একটি প্রক্সি তৈরির কাঠামো তৈরি করি, যদি আপনার শিম কোনও ইন্টারফেস প্রয়োগ করে বা সিজিএলআইবি এর মাধ্যমে যদি আপনার শিম কোনও বাস্তবায়ন না করে ইন্টারফেস. মনে রাখবেন যে আপনি যদি ক্লাস-পাথের সংস্করণ ৩.২ এর আগে স্প্রিং ব্যবহার করছেন তবে অবশ্যই আপনার ক্লাস-পাথে সিগ্লিব ২.২ থাকা উচিত। স্প্রিং ৩.২ থেকে শুরু করে এটি অকেজো কারণ সিগ্লিব ২.২ মূলটিতে অন্তর্ভুক্ত ছিল।

মটরশুটি তৈরির কাঠামোটি এমন একটি প্রক্সি তৈরি করবে যা আপনার অবজেক্টগুলিকে আবৃত করে এবং সুরক্ষা, লেনদেন পরিচালনা, লগিং ইত্যাদির মতো ক্রস কাটা উদ্বেগের দায়িত্ব যুক্ত করে।

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

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

অন্যদিকে, স্প্রিং এওপি দিয়ে আপনি এওপির সমস্ত শক্তি ব্যবহার করতে পারবেন না কারণ বাস্তবায়নটি আপনার কোডটি সংশোধন করার মাধ্যমে নয়, প্রক্সিগুলির মাধ্যমে হয়।

AspectJ হিসাবে, আপনি স্প্রিংএওপি-তে লোড-টাইম বয়ন ব্যবহার করতে পারেন। আপনি বসন্তে এই বৈশিষ্ট্যটি থেকে উপকার পেতে পারেন কোনও এজেন্ট এবং বিশেষ কনফিগারেশন @EnabledLoadWeavingবা এক্সএমএলে প্রয়োগ করা হয় । আপনি উদাহরণ হিসাবে নাম স্থানটি ব্যবহার করতে পারেন। তবে স্প্রিং এওপিতে আপনি সমস্ত ক্ষেত্রে বাধা দিতে পারবেন না। উদাহরণস্বরূপ, newকমান্ডটি স্প্রিং এওপি সমর্থন করে না।

তবে স্প্রিং এওপিতে আপনি aspectofবসন্তের কনফিগারেশন শিমটিতে কারখানা পদ্ধতিটি ব্যবহারের মাধ্যমে অ্যাসপেক্টজে ব্যবহার করে উপকৃত হতে পারেন ।

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

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

আমি আশা করি যে অ্যাস্পেক্টজে এবং স্প্রিং এওপি-র এই প্যানোরামিকটি আপনাকে দুটি পশনের পার্থক্য বুঝতে সহায়তা করে


0

আপনার দিকগুলি মিশন সমালোচনামূলক হবে এবং আপনার কোডটি কোথায় স্থাপন করা হচ্ছে তা বিবেচনা করা গুরুত্বপূর্ণ। স্প্রিং এওপি এর অর্থ হ'ল আপনি লোড-টাইম বুননের উপর নির্ভর করছেন। এটি বুনতে ব্যর্থ হতে পারে এবং আমার অভিজ্ঞতার অর্থ লগ হওয়া ত্রুটিগুলি থাকতে পারে তবে অ্যাপ্লিকেশনটি কোনও দিকবিহীন চলমান থেকে আটকাবে না [আমি এই সতর্কতার সাথে যুক্ত করব যে এটি এমনভাবে কনফিগার করা সম্ভব হতে পারে যে এটি না কেস; তবে আমি ব্যক্তিগতভাবে এটি সম্পর্কে সচেতন নই ]। সংকলন-সময় বয়ন এড়াতে।

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

আরেকটি বিবেচনা হ'ল আপনি কোনও পরিবেশে অ্যাপ্লিকেশনটি হোস্ট করছেন যেখানে আপনি কোনও সার্ভার / অ্যাপ্লিকেশন সূচনার সাফল্য বা ব্যর্থতা সরাসরি নজরদারি করতে সক্ষম হচ্ছেন বা আপনার অ্যাপ্লিকেশনটি আপনার তত্ত্বাবধানে নেই এমন পরিবেশে মোতায়েন করা হচ্ছে কিনা [যেমন এটি যেখানে একটি ক্লায়েন্ট দ্বারা হোস্ট করা হয়]। আবার, এটি সময় বুনন সংকলনের উপায় নির্দেশ করবে।

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


0

এই নিবন্ধটি সম্পর্কে বিষয় সম্পর্কে একটি ভাল ব্যাখ্যা আছে।

স্প্রিং এওপি এবং অ্যাসপেক্টজির বিভিন্ন লক্ষ্য রয়েছে।

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

অন্যদিকে, অ্যাসপেক্টজে হ'ল আসল এওপি প্রযুক্তি যার লক্ষ্য সম্পূর্ণ এওপি সমাধান সরবরাহ করা।


0

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

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

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