স্প্রিংয়ের জাভা কনফিগারেশন ব্যবহার করে, আমার কনস্ট্রাক্টর আর্গুমেন্টের সাথে একটি প্রোটোটাইপ-স্কোপড শিম অর্জন / ইনস্ট্যান্ট করা দরকার যা কেবল রানটাইম এ পাওয়া যায়। নিম্নলিখিত কোড উদাহরণ বিবেচনা করুন (সংক্ষিপ্তকরণের জন্য সরলীকৃত):
@Autowired
private ApplicationContext appCtx;
public void onRequest(Request request) {
//request is already validated
String name = request.getParameter("name");
Thing thing = appCtx.getBean(Thing.class, name);
//System.out.println(thing.getName()); //prints name
}
থিং ক্লাস যেখানে নীচে সংজ্ঞায়িত হয়েছে:
public class Thing {
private final String name;
@Autowired
private SomeComponent someComponent;
@Autowired
private AnotherComponent anotherComponent;
public Thing(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
নোটিশটি name
হ'ল final
: এটি কেবলমাত্র একজন নির্মাণকারীর মাধ্যমে সরবরাহ করা যেতে পারে এবং এটি অপরিবর্তনীয়তার গ্যারান্টি দেয়। অন্যান্য নির্ভরতাগুলি Thing
শ্রেণীর বাস্তবায়ন-নির্দিষ্ট নির্ভরতা , এবং অনুরোধ হ্যান্ডলার বাস্তবায়নের জন্য (দৃ tight়ভাবে একত্রে) পরিচিত হওয়া উচিত নয়।
এই কোডটি স্প্রিং এক্সএমএল কনফিগারেশনের সাথে পুরোপুরি ভালভাবে কাজ করে, উদাহরণস্বরূপ:
<bean id="thing", class="com.whatever.Thing" scope="prototype">
<!-- other post-instantiation properties omitted -->
</bean>
আমি জাভা কনফিগারেশনের মাধ্যমে কীভাবে একই জিনিস অর্জন করব? নিম্নলিখিত স্প্রিং 3.x ব্যবহার করে কাজ করে না:
@Bean
@Scope("prototype")
public Thing thing(String name) {
return new Thing(name);
}
এখন, আমি একটি কারখানা তৈরি করতে পারি , যেমন:
public interface ThingFactory {
public Thing createThing(String name);
}
তবে এটি সার্ভিস লোকেটার এবং কারখানার নকশা প্যাটার্ন প্রতিস্থাপনের জন্য স্প্রিং ব্যবহারের পুরো পয়েন্টকে পরাস্ত করে , যা এই ব্যবহারের ক্ষেত্রে আদর্শ হবে।
যদি স্প্রিং জাভা কনফিগারেশন এটি করতে পারে তবে আমি এড়াতে সক্ষম হব:
- একটি কারখানা ইন্টারফেস সংজ্ঞায়িত
- একটি কারখানা বাস্তবায়ন সংজ্ঞায়িত
- কারখানা বাস্তবায়নের জন্য লেখার পরীক্ষা
এতটা তুচ্ছ জিনিসের জন্য এটি একটি টন কাজ (তুলনামূলকভাবে কথা বলা) যা এক্সএমএল কনফিগারেশনের মাধ্যমে স্প্রিং ইতিমধ্যে সমর্থন করে।
Thing
বাস্তবায়নটি আসলে আরও জটিল এবং অন্যান্য মটরশুটিগুলির উপর নির্ভরতা রয়েছে (আমি কেবল তাদের বংশবৃদ্ধির জন্য বাদ দিয়েছি)। যেমন, আমি অনুরোধ হ্যান্ডলার বাস্তবায়নটি তাদের সম্পর্কে জানতে চাই না, কারণ এটি হ্যান্ডলারকে API / মটরশুটিগুলির প্রয়োজন হয় না এমনভাবে দৃ couple়ভাবে জোড়া দেয়। আপনার (দুর্দান্ত) প্রশ্নটি প্রতিবিম্বিত করতে আমি প্রশ্নটি আপডেট করব।
@Qualifier
সেটারের সাথে একটি সেটারে পরামিতিগুলি রাখতে পারেন @Autowired
।
@Bean
কাজের সাথে আপনার উদাহরণ । @Bean
পদ্ধতি উপযুক্ত আর্গুমেন্ট আপনি প্রেরণ সাথে ডাকা পরার getBean(..)
।