java - স্প্রিং ডিফল্ট স্কোপ সিঙ্গলটন না?




spring dependency-injection (6)

আপনি কি দয়া করে ব্যাখ্যা করতে পারেন যে কেন স্প্রিং নীচে প্রদর্শিত মটরশুটিগুলির কনফিগারেশনের জন্য দুটি বস্তু তৈরি করছে, কারণ পূর্বনির্ধারিতভাবে বসন্তের ডিফল্ট স্কোপ সিঙ্গলটন হয়?

বসন্ত কনফিগারেশন এখানে:

<bean id="customer" class="jp.ne.goo.beans.Customer"> 
    <property name="custno" value="100"></property>
    <property name="custName" value="rajasekhar"> </property>
</bean>
<bean id="customer2" class="jp.ne.goo.beans.Customer"> 
    <property name="custno" value="200"></property> 
    <property name="custName" value="siva"></property> 
</bean>

নিম্নলিখিত উদাহরণটি দেখায় যে @ বিয়ান টীকাগুলি পদ্ধতিটি দুটিবার ডাকা হচ্ছে:

@Configuration
public class AppConfig {

    @Bean
    public ClientService clientService1() {
        ClientServiceImpl clientService = new ClientServiceImpl();
        clientService.setClientDao(clientDao());
        return clientService;
    }

    @Bean
    public ClientService clientService2() {
        ClientServiceImpl clientService = new ClientServiceImpl();
        clientService.setClientDao(clientDao());
        return clientService;
    }

    @Bean
    public ClientDao clientDao() {
        return new ClientDaoImpl();
    }

}

ক্লায়েন্টডাও () কে একবার ক্লায়েন্টসেবা 1 () এবং একবার ক্লায়েন্টসোর্সেস 2 () এ ডাকা হয়েছে। যেহেতু এই পদ্ধতিটি ক্লায়েন্টডাও ইমপ্লের একটি নতুন উদাহরণ তৈরি করে এবং এটিকে ফেরত দেয়, আপনি সাধারণত 2 টি দৃষ্টান্ত (প্রতিটি পরিষেবার জন্য একটি) থাকার আশা করবেন। এটি অবশ্যই সমস্যাযুক্ত হবে: বসন্তে, তাত্ক্ষত শিমের ডিফল্টরূপে একক সুযোগ থাকে। এইখানেই যাদুটি আসে: সমস্ত @ কনফিগারেশন ক্লাসগুলি সিজিএলআইবির সাথে শুরু করার সময় সাবক্লাস করা হয়। সাবক্লাসে, শিশু পদ্ধতিটি প্যারেন্ট পদ্ধতিতে কল করার আগে এবং কোনও নতুন উদাহরণ তৈরি করার আগে প্রথমে কোনও ক্যাশেড (স্কোপড) মটরশুটির জন্য ধারকটি পরীক্ষা করে। নোট করুন যে স্প্রিং ৩.২ অনুসারে, আপনার ক্লাসপথে সিজিএলআইবি যুক্ত করার দরকার নেই কারণ সিজিএলআইবি ক্লাসগুলি org.springframework.cglib এর অধীনে পুনরায় বিতরণ করা হয়েছে এবং সরাসরি বসন্ত-কোর জারের মধ্যে অন্তর্ভুক্ত করা হয়েছে।


অন্যরা যেমন উল্লেখ করেছেন, আপনার পোস্ট করা কোড থেকে দুটি মটরশুটি তৈরি করা উচিত। সিঙ্গলেটগুলি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়েছে (স্প্রিং ডকুমেন্টেশন থেকে: সিঙ্গলটন স্কোপ )

একটি সিঙ্গলটন শিমের কেবল একটি ভাগ করা দৃষ্টান্তটি পরিচালনা করা হয় এবং শিমের সংজ্ঞাটি মিলে এমন একটি আইডি বা আইডির সাথে মটরশুটির জন্য সমস্ত অনুরোধগুলি ফলাফল দেয় যে স্প্রিং কনটেইনার দ্বারা একটি নির্দিষ্ট শিমের ঘটনা ফিরে আসে।

এর মধ্যে স্পষ্টতা যুক্ত করতে, "ভাগ করা দৃষ্টান্ত" এর পিছনের অর্থটি অনুচ্ছেদে ব্যাখ্যা করা হয়েছে যা উপরেরটি অনুসরণ করে:

নামযুক্ত শিমের পরবর্তী সমস্ত অনুরোধ এবং রেফারেন্সগুলি ক্যাশেড অবজেক্টটি ফিরিয়ে দেয়

যখন একটি সিঙ্গলটন শিম তৈরি করা হয়, কেবলমাত্র একটি বিন শিমটি তাত্ক্ষণিকভাবে এবং ক্যাশে হয়। এটি কেবল শিমকে বোঝায়, শিম যে শ্রেণীর উদাহরণ হতে পারে তা নয়। উদাহরণ স্বরূপ,

<bean id="myBean" class="myPackage.myClass" />

<bean id="myOtherBean1 class="myPackage.myOtherClass1">
    <property name="beanReference1" ref="myBean" />
</bean>
<bean id="myOtherBean2 class="myPackage.myOtherClass2">
    <property name="beanReference2" ref="myBean" />
</bean>

এটি তৈরির কনফিগারেশনে, "মায়োথারবিয়ান 1" এবং "মায়োথারবিয়ান 2" এর একই "মাইবিয়ান" বিনের উল্লেখ রয়েছে তাই একই "মাইপ্যাকেজ.মাই ক্লাস" উদাহরণটি রয়েছে। আপনি যদি দ্বিতীয় "মাইপ্যাকেজ.মাই ক্লাস" শিম যুক্ত করার জন্য কোডটি পরিবর্তন করেন তবে এটি "মাইবিয়ান" থেকে আলাদা।

এটি পুরোপুরি বুঝতে, অন্যান্য বসন্তের স্কোপগুলিও দেখুন: প্রোটোটাইপ। প্রোটোটাইপ স্কোপের জন্য বসন্তের ডকুমেন্টেশন থেকে:

বিন-সিঙ্গলটন, শিম মোতায়েনের প্রোটোটাইপ স্কোপের ফলে প্রতিবার নির্দিষ্ট সিমের জন্য অনুরোধ করা হলে একটি নতুন শিমের ঘটনা তৈরি হয়।

এর অর্থ হ'ল আমরা যদি উপরের মত একই স্প্রিং এক্সএমএল ব্যবহার করি তবে "মাইঅথারবিয়ান 1" এবং "মাইঅথারবিয়ান 2" প্রত্যেকে "মাইবিয়ান" এর নিজস্ব স্বতন্ত্র অনুলিপিগুলি পেল যা এখনও "মাইপ্যাকেজ.মাই ক্লাস" এর একটি উদাহরণ মাত্র।


আপনি দুটি ভিন্ন ধারণাকে বিভ্রান্ত করছেন।

বসন্তে সিঙ্গেলটন শব্দটি শিমের স্কোপের জন্য ব্যবহৃত হয়, এর অর্থ হ'ল পুরো আবেদনের জন্য শিমটি একবারেই তৈরি করা হবে।

সিঙ্গলটনের স্বাভাবিক অর্থ জিওএফ প্যাটার্নকে বোঝায়। এটি এমন একটি অবজেক্ট ওরিয়েন্টেড প্যাটার্ন গ্যারান্টিং যা কোনও শ্রেণীর কেবলমাত্র একটি উদাহরণ উপস্থিত থাকবে (কমপক্ষে শ্রেণি-লোডারদের স্কোপে)।


স্প্রিং সিঙ্গেলটন বিন জাভা সিঙ্গেলনের মতো কাজ করে না।

যদি আমরা লিখি

ApplicationContext ctx = new ClassPathXmlApplicationContext("MyConfig.xml");
        Customer obj1= (Customer) ctx.getBean("customer");
        Customer obj2 = (Customer) ctx.getBean("customer2");
        System.out.println(obj1 == obj2);
        System.out.println(obj1+ "::" + obj2);

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

কী মান জোড় পরিচালনা করার জন্য স্প্রিং পাত্রে, আইডি / নাম হিসাবে কী এবং শিমটি মান।


স্প্রিংয়ের ডিফল্ট স্কোপ সিঙ্গলটন এবং এটি সমস্ত ক্ষেত্রে একটি অবজেক্ট তৈরি করবে আপনি যদি স্পষ্টভাবে প্রোটোটাইপ হওয়ার সুযোগটি নির্দিষ্ট না করেন। আপনি বসন্তের কনফিগারেশন পোস্ট করেন নি। এটি পোস্ট করুন, এটি একটি ভাল ধারণা দিতে হবে।


স্প্রিংয়ের ডিফল্ট স্কোপ সিঙ্গলটন। এটি ঠিক যে সিঙ্গলটন হওয়ার অর্থ কী তা সম্পর্কে আপনার ধারণাটি কীভাবে স্প্রিং সিঙ্গলেটগুলি সংজ্ঞায়িত করে তার সাথে মেলে না।

যদি আপনি স্প্রিংকে বিভিন্ন আইডিস এবং একই শ্রেণীর সাথে দুটি পৃথক মটরশুটি তৈরি করতে বলেন, তবে আপনি দুটি আলাদা মটরশুটি পাবেন, যার প্রতিটিই একক সুযোগ রয়েছে। সমস্ত সিঙ্গলটনের সুযোগটি হ'ল আপনি যখন একই আইডি দিয়ে কোনও কিছু উল্লেখ করেন, আপনি একই বিনের উদাহরণটি ফিরে পাবেন get

এখানে স্প্রিং ডকুমেন্টেশন সিঙ্গলটন স্কোপটিকে কীভাবে সংজ্ঞায়িত করে :

একটি সিঙ্গলটন শিমের কেবল একটি ভাগ করা দৃষ্টান্তটি পরিচালনা করা হয় এবং শিমের সংজ্ঞাটি মিলে এমন একটি আইডি বা আইডির সাথে মটরশুটির জন্য সমস্ত অনুরোধগুলি ফলাফল দেয় যে স্প্রিং কনটেইনার দ্বারা একটি নির্দিষ্ট শিমের ঘটনা ফিরে আসে।

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

একই শিমের জন্য দুটি নাম সংজ্ঞায়নের উপায় হ'ল একটি alias ব্যবহার করা:

শিমের সংজ্ঞা নিজেই, আপনি আইডির গুণাবলী অনুসারে নির্দিষ্ট এক নাম পর্যন্ত সংখ্যার সাথে শিমের জন্য একাধিক নাম সরবরাহ করতে পারেন, এবং নামের বৈশিষ্ট্যে অন্য যে কোনও নাম ব্যবহার করতে পারেন। এই নামগুলি একই শিমের সমতুল্য উপাধি হতে পারে এবং কিছু পরিস্থিতিতে যেমন দরকারী হয় যেমন কোনও অ্যাপ্লিকেশনটিতে প্রতিটি উপাদানকে সেই উপাদানটির সাথে নির্দিষ্ট সিমের নাম ব্যবহার করে একটি সাধারণ নির্ভরতা বোঝাতে দেওয়া হয় refer

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

সুতরাং আপনি যদি বিন বিন্যাসে কোনও নাম যুক্ত করেন:

<bean id="customer" name="customer2" 
    class="jp.ne.goo.beans.Customer">
</bean>

বা অন্য কোথাও সংজ্ঞায়িত শিমের জন্য একটি উপনাম তৈরি করুন:

<alias name="customer" alias="customer2"/>

তারপরে "গ্রাহক" এবং "গ্রাহক 2" একই শিমের উদাহরণটি উল্লেখ করবে।





spring-ioc