টি এল; ডিআর
@ অটোভায়ার্ড টীকাগুলি আপনাকে এক্সএমএল ফাইল (বা অন্য কোনও উপায়ে) থেকে নিজের দ্বারা ওয়্যারিংয়ের প্রয়োজনীয়তা বাঁচায় এবং কোথায় আপনাকে ইঞ্জেকশন দেওয়ার দরকার তা খুঁজে পেয়েছে এবং এটি আপনার জন্য কী করে।
সম্পূর্ণ ব্যাখ্যা
@Autowiredটীকা কি আপনি উদ্বুদ্ধ করতে এর অন্যত্র কনফিগারেশনের এড়িয়ে যেতে দেয় এবং শুধুমাত্র আপনার জন্য এটা আছে। আপনার প্যাকেজটি ধরে নিচ্ছেন যে com.mycompany.moviesআপনি এই ট্যাগটি আপনার এক্সএমএল (অ্যাপ্লিকেশন প্রসঙ্গে ফাইল) রাখতে হবে:
<context:component-scan base-package="com.mycompany.movies" />
এই ট্যাগটি একটি অটো-স্ক্যানিং করবে। ধরে নেওয়া যায় যে প্রতিটি শ্রেণি যা শিম হয়ে উঠতে হবে একটি সঠিক টীকা যেমন @Component(সাধারণ শিমের জন্য) বা @Controller(একটি সার্লেট নিয়ন্ত্রণের জন্য) বা @Repository( DAOক্লাসগুলির জন্য ) এবং এই ক্লাসগুলি প্যাকেজের অধীনে কোথাও রয়েছে com.mycompany.movies, স্প্রিং এই সমস্তটি সন্ধান করবে এবং তৈরি করবে প্রতিটি জন্য একটি শিম। এটি 2 টি ক্লাসের স্ক্যানে করা হয় - প্রথমবার এটি কেবল ক্লাসগুলির সন্ধান করে যা সিম হতে হবে এবং এটি করার জন্য যে ইঞ্জেকশনগুলি লাগানোর দরকার তা ম্যাপ করে এবং দ্বিতীয় স্ক্যানে এটি মটরশুটিগুলিকে ইনজেকশন দেয়। অবশ্যই, আপনি আপনার মটরশুটিটিকে আরও বেশি traditional তিহ্যবাহী এক্সএমএল ফাইলে বা একটি @ কনফিগারেশন ক্লাস (বা তিনটির কোনও সমন্বয়) দিয়ে সংজ্ঞায়িত করতে পারেন ।
@Autowiredটীকা স্প্রিং বলে যেখানে একটি ইনজেকশন ঘটতে হবে। যদি আপনি এটি এমন কোনও পদ্ধতিতে রাখেন তবে setMovieFinderএটি বুঝতে পারে (উপসর্গ set+ @Autowiredটিকা দ্বারা) যে শিমটি ইনজেকশন দেওয়া দরকার। দ্বিতীয় স্ক্যানে, স্প্রিং প্রজাতির MovieFinderশিমের সন্ধান করে এবং যদি এটি এর মতো শিমটি খুঁজে পায় তবে এটি এটিকে এই পদ্ধতিতে সংক্রামিত করে। যদি এটি দুটি এর মতো মটরশুটি খুঁজে পায় আপনি একটি পাবেন Exception। এড়াতে Exception, আপনি @Qualifierটীকাটি ব্যবহার করতে পারেন এবং দুটি শিমের মধ্যে কোনটি নিম্নলিখিত পদ্ধতিতে ইনজেক্ট করতে হবে তা বলতে পারেন:
@Qualifier("redBean")
class Red implements Color {
// Class code here
}
@Qualifier("blueBean")
class Blue implements Color {
// Class code here
}
অথবা আপনি যদি আপনার এক্সএমএলে মটরশুটি ঘোষনা করতে পছন্দ করেন তবে এটি দেখতে এমন কিছু দেখাচ্ছে:
<bean id="redBean" class="com.mycompany.movies.Red"/>
<bean id="blueBean" class="com.mycompany.movies.Blue"/>
ইন @Autowiredঘোষণা, এছাড়াও আপনি যোগ করতে হবে @Qualifierযা দুই রঙ মটরশুটি উদ্বুদ্ধ করতে বোলো না;
@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
this.color = color;
}
আপনি যদি দুটি টিকা ব্যবহার করতে না চান ( @Autowiredএবং @Qualifier) আপনি @Resourceএই দুটি একত্রিত করতে ব্যবহার করতে পারেন :
@Resource(name="redBean")
public void setColor(Color color) {
this.color = color;
}
@Resource(আপনি যদি এই উত্তরে প্রথম মন্তব্য তা সম্পর্কে কিছু অতিরিক্ত ডেটা পড়তে পারে) আপনি দুই টীকা ব্যবহার spares এবং এর পরিবর্তে আপনি যদি শুধুমাত্র একটি ব্যবহার করুন।
আমি আরও দুটি মন্তব্য যুক্ত করব:
- এর
@Injectপরিবর্তে ভাল অনুশীলনটি ব্যবহার করা হবে @Autowiredকারণ এটি স্প্রিং-নির্দিষ্ট নয় এবং এটি JSR-330স্ট্যান্ডার্ডের অংশ ।
- আরেকটি ভাল অনুশীলন হ'ল পদ্ধতির পরিবর্তে কনস্ট্রাক্টরের উপর
@Inject/ রাখা @Autowired। আপনি যদি এটি কোনও কনস্ট্রাক্টরের উপর রাখেন তবে আপনি যাচাই করতে পারেন যে ইনজেকশন করা মটরশুটিগুলি শালীন নয় এবং দ্রুত ব্যর্থ হয় যখন আপনি অ্যাপ্লিকেশনটি শুরু করার চেষ্টা করেন এবং NullPointerExceptionযখন আপনাকে আসলে শিমটি ব্যবহার করার দরকার হয় তখন এড়ানো উচিত।
আপডেট : ছবিটি সম্পূর্ণ করতে, আমি ক্লাস সম্পর্কে একটি নতুন প্রশ্ন তৈরি করেছি @Configuration।