যখন একাধিক মেলানো শিম পাওয়া যায় তখন কীভাবে স্প্রিং নাম অনুসারে অটোয়ার হয়?


106

ধরুন আমার এর মতো ইন্টারফেস রয়েছে:

interface Country {}
class USA implements Country {}
class UK implements Country ()

এবং কনফিগারেশনের এই স্নিপেট এক্সএমএল:

<bean class="USA"/>
<bean id="country" class="UK"/>
<bean id="main" class="Main"/>

নীচে কোন নির্ভরতা স্বীকৃত তা আমি কীভাবে নিয়ন্ত্রণ করতে পারি? আমি ইউকে চাই।

class Main {
    private Country country;
    @Autowired
    public void setCountry(Country country) {
        this.country = country;
    }
}

আমি স্প্রিং 3.0.০.৩ ব্যবহার করছি RE


আমি ভেবেছিলাম যে আমি যুক্ত করব যে আমি একটি (পরীক্ষা) পরিবেশে "টাইপের কোনও অনন্য বিন ..." পাচ্ছি এবং এটি আমার বিকাশের পরিবেশে ভাল কাজ করেছে। আমি নিশ্চিত যে এটি কোনও ধরণের ক্লাসপাথ জিনিস ছিল, তবে প্রমাণিত হয়েছে যে আপনি যদি @ কোয়ালিফায়ার যুক্ত করেন তবে এটি দুর্দান্ত কাজ করেছে।
মার্কথেগ্রিয়া

উত্তর:


113

এটি স্প্রিং 3.0 ম্যানুয়াল এর 3.9.3 বিভাগে নথিভুক্ত করা হয়েছে :

ফলব্যাক ম্যাচের জন্য, শিমের নামটি একটি ডিফল্ট মান বাছাইয়ের মান হিসাবে বিবেচিত হয়।

অন্য কথায়, ডিফল্ট আচরণটি এমন হয় যেন আপনি @Qualifier("country")সেটার পদ্ধতিতে যুক্ত হন।


আপনি যখন "শিমের নাম" বলছেন, আপনি কি সেই ক্ষেত্রটির নাম বোঝাতে চান যাতে শিমটি থাকবে? (অর্থাত্ এই ক্ষেত্রে country)
ফান্ডা মনিকার লসুইট

67

আপনি @ কোয়ালিফায়ার টীকাটি ব্যবহার করতে পারেন

থেকে এখানে

বাছাইপর্বের সাথে ফাইন-টিউনিং টিকা-ভিত্তিক অটোয়ারিং iring

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

class Main {
    private Country country;
    @Autowired
    @Qualifier("country")
    public void setCountry(Country country) {
        this.country = country;
    }
}

এটি যুক্তরাষ্ট্রে ইউএসএ শিমের সাথে একটি আইডি যুক্ত করবে এবং আপনি মার্কিন যুক্তরাষ্ট্র চাইলে এটি ব্যবহার করবে।


12

একই ফলাফলটি অর্জনের আর একটি উপায় হ'ল @ ভ্যালু টিকা:

public class Main {
     private Country country;

     @Autowired
     public void setCountry(@Value("#{country}") Country country) {
          this.country = country;
     }
}

এই ক্ষেত্রে, "#{country}স্ট্রিংটি একটি স্প্রিং এক্সপ্রেশন ল্যাঙ্গুয়েজ (স্পেল) এক্সপ্রেশন যা নামের শিমের মূল্যায়ন করে country


সম্পত্তি উপর ভিত্তি করে যে ইনজেকশন করা যেতে পারে? ইউএসএল থেকে ইউএসএ বা ইউকে যদি কোনও ধরণের প্যারামিটার আসে এবং আমি প্যারামটি কী তার ভিত্তিতে 2 টি ভিন্ন জিনিস ইনজেকশন করতে চাইছি?
কল্পনা সনি

6

নাম দ্বারা সমাধানের সাথে আরও একটি সমাধান:

@Resource(name="country")

এটি জাভ্যাক্স.অনোটেশন প্যাকেজ ব্যবহার করে , সুতরাং এটি স্প্রিং নির্দিষ্ট নয়, তবে বসন্ত এটি সমর্থন করে।


1
তবে @Resourceজিগা মডিউলগুলির কারণে জাভা ১১-এর সাথে বক্সের বাইরে থাকবেন না
ডার্ক হফম্যান

5

কিছু ক্ষেত্রে আপনি টিকা @ প্রাথমিক ব্যবহার করতে পারেন।

@Primary
class USA implements Country {}

এইভাবে এটি ডিফল্ট অটোয়ার ক্যান্ডিডেটেট হিসাবে নির্বাচিত হবে, অন্য শিমের স্বতন্ত্র-প্রার্থীর কোনও প্রয়োজন নেই।

মো ডিআটিলগুলি একই ইন্টারফেস প্রয়োগকারী দুটি মটরশুটি স্বাক্ষরকরণের দিকে তাকান - কীভাবে ডিফল্ট বিনকে অটোওয়াইরে সেট করবেন?

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