পটভূমি:
আমার একটি স্প্রিং 2.5 / জাভা / টমক্যাট অ্যাপ্লিকেশন রয়েছে। নিম্নলিখিত শিমটি রয়েছে, যা অ্যাপ্লিকেশন জুড়ে অনেক জায়গায় ব্যবহৃত হয়
public class HibernateDeviceDao implements DeviceDao
এবং নিম্নলিখিত শিমটি নতুন:
public class JdbcDeviceDao implements DeviceDao
প্রথম শিমটি তাই কনফিগার করা হয়েছে (প্যাকেজের সমস্ত মটরশুটি অন্তর্ভুক্ত করা হয়েছে)
<context:component-scan base-package="com.initech.service.dao.hibernate" />
দ্বিতীয় (নতুন) শিম আলাদাভাবে কনফিগার করা হয়েছে
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao">
<property name="dataSource" ref="jdbcDataSource">
</bean>
এই ফলাফলটি (অবশ্যই) সার্ভারটি শুরু করার সময় একটি ব্যতিক্রমে:
নেস্টেড ব্যতিক্রমটি org.springframework.beans.factory.NoSuchBeanDefinitionException: প্রকারের কোনও অনন্য বিন [com.sevenp.mobile.samplemgmt.service.dao.DeviceDao] সংজ্ঞায়িত করা হয়নি: প্রত্যাশিত একক মেলা শিম কিন্তু পাওয়া গেছে 2: [ডিভাইস ডেও, জেডিবিসিডিভ
একটি শ্রেণীর কাছ থেকে শিমটি এভাবে চালিত হওয়ার চেষ্টা করছে
@Autowired
private DeviceDao hibernateDevicDao;
কারণ একই ইন্টারফেস প্রয়োগকারী দুটি মটরশুটি রয়েছে।
প্রশ্নটি:
মটরশুটিটি কনফিগার করা কি সম্ভব
১. বিদ্যমান ক্লাসগুলিতে আমাকে কোনও পরিবর্তন করতে হবে না, যা ইতিমধ্যে HibernateDeviceDao
স্বশিক্ষিত রয়েছে
২. এখনও দ্বিতীয় (নতুন) শিমটি এভাবে ব্যবহার করতে সক্ষম হচ্ছে:
@Autowired
@Qualifier("jdbcDeviceDao")
HibernateDeviceDao
যেমন, আমি শিমটি ডিফল্ট শিমটি স্বাবরক্ষিত হওয়ার জন্য কনফিগার করার একটি উপায়ের প্রয়োজন হবে, একই সাথে টীকাটির JdbcDeviceDao
সাথে নির্দিষ্ট করে নির্দিষ্ট করার সময় এর ব্যবহারের অনুমতি দেয় @Qualifier
।
আমি ইতিমধ্যে যা চেষ্টা করেছি:
আমি সম্পত্তি সেট করার চেষ্টা করেছি
autowire-candidate="false"
জেডিবিসি ডিভাইসডাওর জন্য বিন বিন্যাসে:
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao" autowire-candidate="false">
<property name="dataSource" ref="jdbcDataSource"/>
</bean>
কারণ স্প্রিং ডকুমেন্টেশন বলে যে
অন্য শিমের অটোয়ারিংয়ের প্রয়োজনীয়তা মেটাতে প্রার্থীদের সাথে ম্যাচ করার সময় এই শিমটি বিবেচনা করা উচিত কিনা তা নির্দেশ করে। দ্রষ্টব্য যে এটি নামের দ্বারা সুস্পষ্ট রেফারেন্সগুলিকে প্রভাবিত করে না, যা নির্দিষ্ট শিমটি স্বতঃসংশ্লিষ্ট প্রার্থী হিসাবে চিহ্নিত না করা হলেও সমাধান হয়ে যাবে *
যার অর্থ আমি ব্যাখ্যা করেছি যে আমি এখনও টীকাটি JdbcDeviceDao
ব্যবহার করে স্বায়ত্তশাসন করতে পেরেছিলাম @Qualifier
এবং HibernateDeviceDao
ডিফল্ট বিন হিসাবে থাকতে পারি । স্পষ্টতই আমার ব্যাখ্যাটি সঠিক ছিল না, যদিও সার্ভারটি শুরু করার সময় নিম্নলিখিত ত্রুটি বার্তায় এর ফলস্বরূপ:
প্রকারের অসন্তুষ্ট নির্ভরতা [শ্রেণি com.sevenp.mobile.samplemgmt.service.dao.jdbc.JdbcDeviceDao]: প্রত্যাশিত কমপক্ষে 1 টি মেলা শিম
আমি যে ক্লিনিকে কোয়ালিফায়ার দিয়ে সিমকে চালিত করার চেষ্টা করেছি সেখান থেকে আসছি:
@Autowired
@Qualifier("jdbcDeviceDao")
সমাধান:
@ রিসোর্স টীকাটি ব্যবহারের চেষ্টা করার জন্য স্কাফম্যানের পরামর্শ । সুতরাং কনফিগারেশনে অটোয়ার-প্রার্থী jdbcDeviceDao এর জন্য মিথ্যা হিসাবে সেট হয়ে গেছে এবং jdbcDeviceDao ব্যবহার করার সময় আমি @ রিসোর্স টিকা (@ কোয়ালিফায়ারের পরিবর্তে) ব্যবহার করে এটি উল্লেখ করি:
@Resource(name = "jdbcDeviceDao")
private JdbcDeviceListItemDao jdbcDeviceDao;