@ রিসোর্স বনাম @ অটোভায়ার্ড


380

কোন এনোটেশন, @ রিসোর্স ( jsr250 ) বা @ অটোওয়ার্ড (স্প্রিং-নির্দিষ্ট) আমার ডিআই-তে ব্যবহার করা উচিত?

আমি অতীতে সফলভাবে উভয় ব্যবহার করেছি @Resource(name="blah")এবং@Autowired @Qualifier("blah")

আমার প্রবৃত্তিটি @Resourceট্যাগটি আটকে রাখার কারণ এটি জেএসআর লোকেরা অনুমোদন করেছে।
কারও কি এই সম্পর্কে দৃ strong় চিন্তা আছে?


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

উত্তর:


194

প্রাক-3.0-এর বসন্তে এটি কোনটি গুরুত্বপূর্ণ নয়।

বসন্ত 3.0 এ স্ট্যান্ডার্ড ( জেএসআর -330 ) টীকাটির জন্য সমর্থন রয়েছে @javax.inject.Inject- এর সংমিশ্রণ সহ এটি ব্যবহার করুন @Qualifier। নোট করুন যে বসন্ত এখন @javax.inject.Qualifierমেটা-টীকাকে সমর্থন করে :

@Qualifier
@Retention(RUNTIME)
public @interface YourQualifier {}

সুতরাং আপনি করতে পারেন

<bean class="com.pkg.SomeBean">
   <qualifier type="YourQualifier"/>
</bean>

অথবা

@YourQualifier
@Component
public class SomeBean implements Foo { .. }

এবং তারপর:

@Inject @YourQualifier private Foo foo;

এটি স্ট্রিং-নামগুলির কম ব্যবহার করে, যা ভুল বানানযুক্ত হতে পারে এবং বজায় রাখা আরও শক্ত।


মূল প্রশ্ন হিসাবে: উভয়ই, টীকাটির কোনও বৈশিষ্ট্য নির্দিষ্ট না করে, টাইপ করে ইনজেকশনটি সঞ্চালন করুন। পার্থক্য হল:

  • @Resource আপনাকে ইনজেকশন করা শিমের একটি নাম নির্দিষ্ট করতে দেয়
  • @Autowired আপনাকে এটি অ-বাধ্যতামূলক হিসাবে চিহ্নিত করতে দেয়।

এই নিরীহ প্রশ্ন মত দেখতে পারে, কিন্তু যখন আপনি ইনজেকশন এই শৈলী ব্যবহার, আপনার জন্য একটি পাবলিক সেটার প্রয়োজন নেই fooবা একটি কন্সট্রাকটর SomeBeanএকটি সঙ্গে FooPARAM?
স্নেকসে

: - @Snekse আমার উত্তর পেয়েছিলাম stackoverflow.com/questions/3536674/...
Snekse

নাঃ। আপনার এর কোনও দরকার নেই। খালি মাঠ। (বসন্ত এটিকে প্রতিবিম্বের মাধ্যমে
পপুলেট করে

@Bozho এই উত্তরটি আসলে মধ্যে পার্থক্য প্রদর্শন করা হয় না @Resourceএবং @Autowiredপ্রকৃত উত্তর এক @Ichthyo পোস্ট করেছে, আমি এই এক আপডেট করা আবশ্যক মনে করি।
বরিস ট্রুখভ

1
হ্যাঁ. আসলে আমি মাঝে মাঝে পদ্ধতির আরও ভাল বিকল্প সরবরাহ করে প্রশ্নের উত্তর দিয়ে থাকি। তবে আমি নীচের মূল প্রশ্নের উত্তরটি সম্পূর্ণতার জন্য অন্তর্ভুক্ত করেছি
বোজো

508

উভয় @Autowired(বা @Inject) এবং @Resourceসমানভাবে ভাল কাজ। তবে ধারণাগত পার্থক্য বা অর্থের মধ্যে একটি পার্থক্য রয়েছে

  • @Resourceমানে নাম হিসাবে একটি পরিচিত উত্স পান । নামটি টীকাযুক্ত সেটার বা ক্ষেত্রের নাম থেকে নেওয়া হয়, বা এটি নাম-পরামিতি থেকে নেওয়া হয়।
  • @Injectঅথবা টাইপ করে উপযুক্ত অন্য উপাদানগুলিতে@Autowired তারের চেষ্টা করুন ।

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


81
হ্যাঁ, এটি একটি গ্রহণযোগ্য উত্তর হওয়া উচিত। উদাহরণস্বরূপ, যদি আপনার কোনও @Resourceটীকাযুক্ত ক্ষেত্র থাকে এবং মাঠের নামটি ধারক শিমের আইডির সাথে মেলে তবে স্প্রিংটি org.springframework.beans.factory.BeanNotOfRequiredTypeExceptionতাদের প্রকারের পার্থক্য দেখা দিলে নিক্ষেপ করবে this এটি কারণ শিমগুলি প্রথমে @Resourceটীকা অনুসারে টীকা অনুসারে নামের সাথে মিলে যায় । তবে যদি সম্পদের নাম শিমের নামের সাথে মেলে না, তবে স্প্রিংটি তাদের টাইপ করে তারযুক্ত করবে।
বরিস ট্রুখভ

আপনি অন্য পোস্টটি উল্লেখ করতে পারেন যা এই দুটিয়ের মধ্যে পার্থক্য জানায় যখন আপনি একটি সাধারণ এমএপি ব্যবহার করার চেষ্টা করেন। stackoverflow.com/questions/13913752/...
Anver Sadhat

4
গ্রহণযোগ্য উত্তর যেমন কেবল একটি সম্পূর্ণ ভিন্ন "সেরা অনুশীলন" এর সুপারিশ না করে প্রকৃতপক্ষে প্রশ্নের উত্তর দেওয়ার জন্য +1। আমি এই ব্লগ পোস্টটিও
জুলাই 4

1
: পাঠকদের জন্য, নিবন্ধ @Jules এখানে দ্বারা নির্দিষ্ট একটি সারসংক্ষেপ খুঁজে দয়া stackoverflow.com/a/23887596/363573
স্টিফেন

3
এর একটি নিহিততা: আপনি যখন কোনও মানচিত্র / তালিকার সিম ইনজেকশন করতে চান, @Autowireকাজ করবে না এবং করবে না। সেক্ষেত্রে আপনাকে ব্যবহার করতে হবে @Resource
রিকার্ডো ভ্যান ডেন ব্রুক

76

প্রাথমিক পার্থক্যটি হ'ল @Autowiredএকটি বসন্তের টীকা। যেখানে @Resource, JSR-250 দ্বারা নির্দিষ্ট করা হয় আপনি নিজেকে নির্দিষ্ট। সুতরাং উত্তরটি জাভার অংশ যেখানে পূর্ববর্তীটি স্প্রিং নির্দিষ্ট।

সুতরাং, আপনি এক অর্থে এটির পরামর্শ দিচ্ছেন। আমি দেখেছি ভাবেন ব্যবহার @Autowiredসঙ্গে @Qualifierকারণ এটির আরও বেশি শক্তিশালী। কিছু কাঠামো থেকে অন্য কিছুতে স্থানান্তর করা খুব অসম্ভব বলে মনে করা হয়, যদি মিথ নয় তবে বিশেষত বসন্তের ক্ষেত্রে।


7
+1 টি, কারণ @Autowiredসঙ্গে @Qualifierসত্যিই হয় JSR মান চেয়ে অধিক শক্তিশালী @Resourceটীকা (সঙ্গে উদাহরণস্বরূপ ঐচ্ছিক নির্ভরতা মনে @Autowired(required=false)। আপনার সাথে এটা করতে পার না @Resource)
স্টিফান Haberl

70

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

টীকাগুলি সঠিক প্রয়োগটি কীভাবে নির্বাচন করে?

@Autowired এবং @Inject

  1. টাইপ অনুসারে ম্যাচগুলি
  2. কোয়ালিফায়ারদের দ্বারা সীমাবদ্ধ
  3. নাম অনুসারে ম্যাচগুলি

@Resource

  1. নাম অনুসারে ম্যাচগুলি
  2. টাইপ অনুসারে ম্যাচগুলি
  3. কোয়ালিফায়ারদের দ্বারা নিষেধাজ্ঞাগুলি (নাম অনুসারে যদি ম্যাচটি পাওয়া যায় তবে তা উপেক্ষা করা হবে)

আমার মটরশুটি ইনজেকশন দেওয়ার জন্য কোন টিকা (বা সংমিশ্রণ) ব্যবহার করা উচিত?

  1. স্পষ্টভাবে আপনার উপাদানটির নাম দিন [@ কম্পোনেন্ট ("beanName")]]

  2. [@ রিসোর্স (নাম = "beanName")] বৈশিষ্ট্য @Resourceসহ ব্যবহার করুন name]

আমি কেন ব্যবহার করব না @Qualifier?

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

শিম ইঞ্জেকশন কি আমার প্রোগ্রামকে ধীর করে দেয়?

উপাদানগুলির জন্য নির্দিষ্ট প্যাকেজগুলি স্ক্যান করুন [context:component-scan base-package="com.sourceallies.person"]। যদিও component-scanএটি আরও কনফিগারেশনের ফলস্বরূপ এটি আপনার বসন্ত প্রসঙ্গে অপ্রয়োজনীয় উপাদান যুক্ত করার সম্ভাবনা হ্রাস করে।


তথ্যসূত্র: @ রিসোর্স, @ অটোভায়ার্ড এবং @ ইনজেক্ট সহ স্প্রিং ইনজেকশন


39

স্প্রিং 3.0.x রেফারেন্স ম্যানুয়াল থেকে এটিই পেয়েছি : -

ডগা

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

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

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


বর্তমান সংস্করণটির জন্য ডকস.স্প্রিং.ইও / স্প্রিং / ডকস / বর্তমান / স্প্রিং-ফ্রেমওয়ার্ক-রেফারেন্স / টি দেখুন (টিপটি আপডেট করা হয়েছিল)
Lu55

27

@ অটোয়ারওয়্যারড + @ কোয়ালিফায়ার কেবল স্প্রিং ডিআইয়ের সাথে কাজ করবে, যদি আপনি ভবিষ্যতে অন্য কিছু ডিআই ব্যবহার করতে চান তবে @ রিসোর্স ভাল বিকল্প।

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

উদাহরণস্বরূপ: যদি আপনার একাধিক বাস্তবায়নের সাথে ইন্টারফেস থাকে

interface parent {

}
@Service("actualService")
class ActualService implements parent{

}
@Service("stubbedService")
class SubbedService implements parent{

}

@ অ্যাটুওয়ার্ড এবং @ কোয়ালিফায়ার সহ আপনার নির্দিষ্ট বাচ্চাদের বাস্তবায়ন যেমন সেট করা দরকার

@Autowired
@Qualifier("actualService") or 
@Qualifier("stubbedService") 
Parent object;

@ রিসোর্স করার সময় যা স্থানধারক সরবরাহ করে না আপনি প্লেসহোল্ডার রাখতে পারেন এবং নির্দিষ্ট শিশু প্রয়োগের জন্য ইনজেক্ট করার জন্য সম্পত্তি ফাইলটি ব্যবহার করতে পারেন

@Resource(name="${service.name}")
Parent object;  

যেখানে সম্পত্তি.Name হিসাবে সম্পত্তি ফাইলে সেট করা আছে

#service.name=actualService
 service.name=stubbedService

আশা করি যে কাউকে সাহায্য করবে :)


16

দুজনেই সমান ভাল। রিসোর্স ব্যবহারের সুবিধা ভবিষ্যতে যদি আপনি বসন্ত ব্যতীত অন্য কোনও ডিআই কাঠামোতে চান তবে আপনার কোড পরিবর্তনগুলি আরও সহজ হবে। আপনার কোড স্বতঃপ্রযুক্তি ব্যবহার করে স্প্রিংস ডিআই এর সাথে দৃly়ভাবে মিলিত।


17
কখনো ঘটবে না. এমনকি যদি তা করেও থাকে - টীকাগুলির নামগুলি অনুসন্ধান / প্রতিস্থাপন করা আপনার সমস্যার সর্বনিম্ন হতে চলেছে।
ড্যানিয়েল আলেকিয়ুক

13

আপনি যখন এই দুটি টীকাগুলির বেস ক্লাসগুলি থেকে সমালোচনা বিশ্লেষণ করবেন You আপনি নিম্নলিখিত পার্থক্যগুলি বুঝতে পারবেন।

@AutowiredAutowiredAnnotationBeanPostProcessor নির্ভরতা ইনজেকশন ব্যবহার করে। নির্ভরতা ইনজেকশন
@Resourceব্যবহার CommonAnnotationBeanPostProcessorকরে।

যদিও তারা বিভিন্ন পোস্ট প্রসেসরের ক্লাস ব্যবহার করে তারা সবাই প্রায় একই রকম আচরণ করে। পার্থক্যগুলি সমালোচনামূলকভাবে তাদের কার্যকর করার পথে রয়েছে যা আমি নীচে তুলে ধরেছি।

@Autowired / @Inject

1. প্রকার অনুসারে
ম্যাচগুলি 2. কোয়ালিফায়ার
দ্বারা নিয়ন্ত্রিত 3. নাম অনুসারে ম্যাচ

@Resource

1. নাম অনুসারে
ম্যাচগুলি 2. টাইপ অনুসারে
ম্যাচগুলি 3. কোয়ালিফায়ার দ্বারা রাষ্ট্রগুলি (ম্যাচটি যদি নাম অনুসারে পাওয়া যায় তবে উপেক্ষা করা হবে)


6

সঙ্গে @Resourceআপনি শিম স্ব-ইনজেকশন করতে পারেন, এটি অর্ডার সব অতিরিক্ত যুক্তিবিজ্ঞান লেনদেনের বা নিরাপত্তা সংক্রান্ত কাপড় মত শিম পোস্ট প্রসেসর দ্বারা যোগ চালানোর জন্য প্রয়োজন হতে পারে।

স্প্রিং 4.3+ এর @Autowiredসাথে এটিও সক্ষম।


2

@Resourceজেএনডিআই এর মাধ্যমে সংজ্ঞায়িত প্রায়শই উচ্চ-স্তরের অবজেক্টগুলি ব্যবহার করে। @Autowiredবা @Injectআরও সাধারণ মটরশুটি দ্বারা ব্যবহৃত হবে।

আমি যতদূর জানি, এটি কোনও স্পেসিফিকেশন নয়, এমনকি একটি সম্মেলনও নয়। স্ট্যান্ডার্ড কোডটি এ টীকাগুলি ব্যবহার করবে এটি আরও যুক্তিসঙ্গত।


0

এখানে একটি নোট হিসাবে: SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContextএবং টীকা দিয়ে কাজ করে SpringBeanAutowiringSupport.processInjectionBasedOnServletContext না@Resource । সুতরাং, পার্থক্য আছে।

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