স্প্রিং ফ্রেমওয়ার্কে @ ইনজেক্ট এবং অটোয়ার্ডের মধ্যে পার্থক্য কী? কোনটি কোন অবস্থায় ব্যবহার করতে হবে?


694

আমি স্প্রিংসোর্সে কয়েকটি ব্লগ নিয়ে যাচ্ছি এবং একটি ব্লগে লেখক ব্যবহার করছেন @Injectএবং আমি মনে করি তিনিও এটি ব্যবহার করতে পারেন @Autowired

কোডের টুকরোটি এখানে:

@Inject private CustomerOrderService customerOrderService;

আমি এর মধ্যে পার্থক্য সম্পর্কে নিশ্চিত নই @Injectএবং @Autowiredযদি কেউ তাদের পার্থক্য ব্যাখ্যা করে এবং কোনটি কোন পরিস্থিতিতে ব্যবহার করতে হয় তবে এটির প্রশংসা করব?


3
আমার কাছে কোনও উত্তর নেই, যেহেতু আমি এটিতেও
সাগর ভি


2
'@ ইনজেক্ট' এবং '@ অটোভায়ার্ড' এর মধ্যে পার্থক্যটি এই নিবন্ধটিতে ভালভাবে ব্যাখ্যা করা হয়েছে alextheedom.wordpress.com/2016/02/13/…
অ্যালেক্স থিডোম

উত্তর:


718

এখানে ধরে নিচ্ছেন আপনি javax.inject.Injectটীকাগুলি উল্লেখ করছেন । @Injectজাভা সিডিআই ( কনটেক্সটস এবং ডিপেন্ডেন্সি ইনজেকশন ) স্ট্যান্ডার্ডের অংশ যা জাভা ই ই 6 (জেএসআর -299) এ চালু হয়েছে, আরও পড়ুন । বসন্ত @Injectতাদের নিজস্ব টীকাটির সাথে প্রতিশব্দ ব্যবহার করে সমর্থন করা বেছে নিয়েছে @Autowired

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


115
সুতরাং তত্ত্বে যদি আপনি @ ইনজেক্ট ব্যবহার করেন তবে আপনি বসন্তকে অন্য ডিআই কাঠামোর সাথে প্রতিস্থাপন করতে পারেন যেমন গুইস এবং একইভাবে আপনার নির্ভরতা ইনজেক্ট করতে পারেন।
অ্যালেক্স বার্নস

71
পেডেন্টিক হওয়ার ঝুঁকিতে: @Injectসিডিআই (জেএসআর -299) থেকে পৃথক জেএসআর (জেএসআর -330)।
ব্র্যাড কাপিট

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

18
আমি আপনার সাথে একমত যে আমরা প্রায়শই ডিআই ফ্রেমওয়ার্কগুলি পরিবর্তন করি না। তবে যদি আমাদের সোর্স কোডে একাধিক প্যাকেজ থাকে এবং আপনি যদি একটি সাধারণ প্যাকেজ তৈরি করতে চান যা আপনি একাধিক প্রকল্পের মধ্যে ভাগ করতে চান এবং তারপরে @Injectজেএসআর টীকাটি সহ @Autowiredযা আপনার কোড বেসটি লক করে স্প্রিং ডিআই ব্যবহার করার চেয়ে ভাল ।
আদিত্য

3
@Injectএকা ব্যবহার করা কাঠামোর স্বাধীনতা নিশ্চিত করে না। এছাড়াও আপনি স্প্রিং এর মত ফ্রেমওয়ার্ক নির্ভরশীল মেকানিজম ছাড়া ইঞ্জেকশনভিত্তিক মটরশুটি ডিক্লেয়ার প্রয়োজন চাই @Componentবা application.xml, কিন্তু ব্যবহারের @Namedএবং @Singletonবর্গ স্তরের উপর। কোনও স্প্রিং প্রকল্প যদি সত্যিই আজকের মতো মটরশুটি ঘোষণা করে তবে কোনও ধারণা নেই - আমি এমনকি এমন কোনও প্রকল্পের কথাও শুনিনি যা স্প্রিং থেকে জেইইতে চলে গেছে ...
মার্কাস কে।

162

এখানে একটি হল ব্লগ পোস্টে যে তুলনা @Resource, @Injectএবং @Autowired, এবং একটি চমত্কার ব্যাপক কাজ বলে মনে হচ্ছে।

লিঙ্ক থেকে:

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

টেস্ট 2 এবং 7 যে লেখক উল্লেখ করেছেন যথাক্রমে 'ক্ষেত্রের নাম অনুসারে ইনজেকশন' এবং 'খারাপ কোয়ালিফায়ার ব্যবহার করে শিমের সমাধান করার চেষ্টা'।

উপসংহারে আপনার প্রয়োজনীয় সমস্ত তথ্য দেওয়া উচিত।


4
এই নিবন্ধটি তিনটি টীকাটির দুর্দান্ত ব্যাখ্যা। প্রথম সোয়াইপ করার পরে আমাকে এটি পুনরায় পড়তে হয়েছিল; কিন্তু, একটি দুর্দান্ত নিবন্ধ।
টমাস

1
অনেক ধন্যবাদ! স্প্রিং এবং জাভাএই এর মধ্যে পার্থক্য এবং সাদৃশ্য অনুসন্ধান করার পাশাপাশি আমার আরও কয়েকটি প্রশ্নের উত্তর অনুসন্ধানে আমার নিবন্ধটি আমার একাধিক উত্তর দিয়েছে।
কেভিন ক্রুইজসেন

36

কোনও ওয়্যারিং নেই এমন পরিস্থিতিটি পরিচালনা করতে শিমটি @Autowired requiredএন্টিবিউট সেট সহ উপলব্ধ false

তবে ব্যবহার করার সময় @Inject, সরবরাহকারী ইন্টারফেসটি শিমের সাথে কাজ করে যার অর্থ শিমটি সরাসরি ইনজেকশনের সাথে নয় তবে সরবরাহকারীর সাথে থাকে।


8
এটি এত গুরুত্বপূর্ণ, এবং সর্বাধিক উত্সাহিত উত্তরগুলিতে উপেক্ষা করা হয়েছে।
ইগোর ডনিন

ডিফল্টরূপে প্রয়োজনীয় প্যারামিটারটি অটোওয়ার্ডের জন্য সত্য হয়ে থাকে। রেফ: ডকস.স্প্রিং.আইও
প্রশান্ত

25

স্প্রিং 3.0 এর হিসাবে, স্প্রিং অফার JSR-330 নির্ভরতা ইনজেকশন টীকা জন্য সমর্থন ( @Inject, @Named, @Singleton)।

তাদের সম্পর্কে স্প্রিং ডকুমেন্টেশনের একটি পৃথক বিভাগ রয়েছে, যার মধ্যে তাদের বসন্তের সমতুল্যের তুলনা রয়েছে।


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

কোনও জেইই পাত্রে স্প্রিং চালানোর দরকার নেই, আপনি এটি টমক্যাটের মতো সার্লেট / জেএসপি পাত্রেও ব্যবহার করতে পারেন এবং এখনও জেএসআর -330 সমর্থন রাখতে পারেন। স্প্রিং একটি পৃথক ডিআই কন্টেইনার, এটি হোস্ট জেইই সার্ভারের সাথে সিডিআই মটরশুটি "ইন্টারচেঞ্জ" করে না যদি এটির অর্থ আপনার অর্থ। আপনি হয় কোনও জেইই পাত্রে সিডিআই ব্যবহার করতে পারেন, বা বসন্ত বিন - তবে আপনি উভয়ই ব্যবহার করতে পারবেন না (বাক্সের বাইরে)।
আন্দ্রে স্টিইংরেস

22

মূল পার্থক্য ( স্প্রিং ডক্স পড়ার সময় লক্ষ্য করা যায় ) এর মধ্যে @Autowiredএবং @Injectএটি হ'ল @Autowired'প্রয়োজনীয়' বৈশিষ্ট্য রয়েছে যখন @ ইনজেক্টটির কোনও 'প্রয়োজনীয়' বৈশিষ্ট্য নেই।


আপনি প্রয়োজনীয় দ্বারা কি বোঝাতে চান?
ম্যাটিম্যান

2
@mattymanme ডক্স থেকে, "ডিফল্টরূপে, যখনই শূন্য প্রার্থী মটরশুটি পাওয়া যায় তবে স্বয়ংক্রিয়তা ব্যর্থ হয়; পূর্বনির্ধারিত আচরণটি বর্ণিত পদ্ধতি, নির্মাতা এবং ক্ষেত্রগুলিকে প্রয়োজনীয় নির্ভরতা নির্দেশ করে বলে আচরণ করা হয়। প্রয়োজনীয় বৈশিষ্ট্যটিকে মিথ্যা হিসাবে সেট করে এই আচরণটি পরিবর্তন করা যেতে পারে "। উদাহরণস্বরূপ @Autowired(required=false)। সহজ সরল পদগুলিতে, " requiredবৈশিষ্ট্যটি ইঙ্গিত করে যে সম্পত্তিটি স্বায়ত্তশাসনের উদ্দেশ্যে প্রয়োজন হয় না, সম্পত্তিটিকে স্বতঃপরিচালিত না করা হলে তা উপেক্ষা করা হয়।"
ভাগ্যবান

উত্স কোড পাবলিক ইন্টারফেসে সন্ধান করুন স্বীকৃত {/ ** * টীকাগুলি নির্ভরতা প্রয়োজন কিনা তা ঘোষণা করে। * / বুলিয়ান প্রয়োজনীয় () ডিফল্ট সত্য; } পাবলিক ইন্টারফেস ইনজেক্ট {}
টার্ন

15

সারাক্ষণ @ ইনজেক্ট করা ভাল ব্যবহার করুন। কারণ এটি জাভা কনফিগারেশন পদ্ধতির (সূর্যের দ্বারা সরবরাহিত) যা আমাদের অ্যাপ্লিকেশনটিকে কাঠামোর সাথে অজিনস্টিক করে তোলে। সুতরাং আপনি বসন্ত যদি আপনার ক্লাস কাজ করবে।

আপনি যদি @ অটোভায়ার্ড ব্যবহার করেন তবে এটি কেবল বসন্তের সাথে কাজ করবে কারণ @ অটোভায়ার্ডটি বসন্ত সরবরাহিত টিকা।


13
রোদ মারা গেছে। বেঁচে থাকুন সূর্যকে।
অমরিন্দর অরোরা

6
আপনি কতবার কাঠামো পরিবর্তন করতে যাচ্ছেন? শুধু কৌতূহলী
কে

বেশিরভাগ প্রকল্পে আমি ইনজেক্টের চেয়ে অটোভায়ার্ড দেখেছি। আমি উত্তরের যৌক্তিকতা বুঝতে পেরেছি তবে আমি উজ্জীবিত করতে পারি না।
উইটোল্ড কাকজুরবা

13

@Autowired টীকাটি স্প্রিং ফ্রেমওয়ার্কে সংজ্ঞায়িত করা হয়।

@Injectটীকাগুলি একটি স্ট্যান্ডার্ড টিকা, যা "জাভার জন্য নির্ভরশীল ইনজেকশন" (জেএসআর -330) -তে সংজ্ঞায়িত । স্প্রিং (যেহেতু 3.0.০ সংস্করণ) নির্ভরতা ইনজেকশনটির সাধারণীকরণ করা মডেলকে সমর্থন করে যা মানক জেএসআর -৩৩০ সংজ্ঞায়িত হয়েছে। ( গুগল গুইস ফ্রেমওয়ার্ক এবং পিকোকন্টেনার কাঠামো এই মডেলটিকে সমর্থন করে)।

সাথে ইন্টারফেসের @Injectপ্রয়োগের রেফারেন্সটি ইনজেকশনের সাহায্যে পাওয়া যায় Provider, যা পিছিয়ে দেওয়া রেফারেন্সগুলি ইনজেকশন দেয়।

টিকা @Injectএবং @Autowired- প্রায় সম্পূর্ণ উপমা। @Autowiredটীকা দেওয়ার পাশাপাশি , @Injectটিকাটি স্বয়ংক্রিয়ভাবে বাধ্যতামূলক বৈশিষ্ট্য, পদ্ধতি এবং নির্মাতাদের জন্য ব্যবহার করা যেতে পারে।

@Autowiredটীকা বিপরীতে , @Injectটীকাটির কোনও requiredবৈশিষ্ট্য নেই। অতএব, যদি নির্ভরতাগুলি খুঁজে পাওয়া যায় না - তবে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে।

বাধ্যতামূলক বৈশিষ্ট্যের স্পষ্টকরণেও পার্থক্য রয়েছে। ইনজেকশনের জন্য উপাদানগুলির পছন্দে অস্পষ্টতা থাকলে @Namedকোয়ালিফায়ার যুক্ত করা উচিত। @Autowiredটীকাগুলির জন্য অনুরূপ পরিস্থিতিতে @Qualifierকোয়ালিফায়ার যুক্ত করা হবে (জেএসআর -330 এটি নিজস্ব @Qualifierটীকা সংজ্ঞায়িত করে এবং এই কোয়ালিফায়ার টীকা @Namedসংজ্ঞায়িত করা হয়)।


যদিও '@ ইনজেক্ট' এর জাভা ডক্সের প্রয়োজনীয় বৈশিষ্ট্য নেই: '@ ইনজেক্ট' দিয়ে মন্তব্য করা সদস্যদের ইনজেকশন প্রয়োজন। যা বোঝাচ্ছে যে কোনও সদস্য না পাওয়া গেলে তার ইনজেকশনটি ব্যর্থ হবে। জাভা ডক্স দেখুন: docs.oracle.com/javaee/7/api/javax/inject/Inject.html
অ্যালেক্স থিডম


12

উপরেরটি ছাড়াও:

  1. @Autowiredমটরশুটি জন্য ডিফল্ট সুযোগ হ'ল সিঙ্গেলটন যেখানে জেএসআর 330 @Injectটীকাটি ব্যবহার করা এটি বসন্তের প্রোটোটাইপের মতো
  2. জেএসআর 330 ব্যবহার করে @ আলস্যের সমতুল্য নেই @Inject
  3. জেএসআর 330 ব্যবহার করে @ ভ্যালুর সমতুল্য নেই @Inject

0

@Injectটীকা JSR-330 টীকা সংগ্রহ অন্যতম। এতে ম্যাচ বাই টাইপ, কোয়ালিফায়ার বাই ম্যাচ, ম্যাচ বাই বাই এক্সিকিউশন পাথ রয়েছে। এই ফাঁসি পাথ বৈধ উভয় সেটার এবং মাঠের injection.The আচরণের জন্য @Autowiredটীকা হিসাবে একই @Injectটীকা। পার্থক্য হ'ল @Autowiredটীকাটি বসন্ত কাঠামোর একটি অংশ of @Autowiredটীকাতেও উপরোক্ত কার্যকরকরণের পথ রয়েছে। সুতরাং আমি @Autowiredআপনার উত্তরের জন্য সুপারিশ ।

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