বিন ফ্যাক্টরী বনাম অ্যাপ্লিকেশন কনটেক্সট


235

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

একটি অনুশীলন হিসাবে, আমি আমার নমুনা / পরীক্ষা প্রকল্পগুলির একটির জন্য একটি প্রধান পদ্ধতি লিখছি। একটি বিষয় সম্পর্কে আমি অস্পষ্ট যা হ'ল BeanFactoryএবং ApplicationContext- এর মধ্যে সঠিক পার্থক্য কোনটি পরিস্থিতিতে উপযুক্ত?

আমি বুঝতে পারি যে ApplicationContextপ্রসারিত হয়েছে BeanFactory, তবে আমি যদি কেবল একটি সাধারণ প্রধান পদ্ধতি লিখি তবে আমার কি অতিরিক্ত ক্রিয়াকলাপ সরবরাহ করে যা ApplicationContextসরবরাহ করে? এবং ঠিক ঠিক কী ধরনের অতিরিক্ত কার্যকারিতা সরবরাহ করে ApplicationContext?

"কোনটি প্রধান () পদ্ধতিতে আমার ব্যবহার করা উচিত" এর উত্তর দেওয়ার পাশাপাশি, এমন দৃশ্যে আমার কোন বাস্তবায়ন ব্যবহার করা উচিত, এর কোনও মানদণ্ড বা নির্দেশিকা রয়েছে কি? আমার মূল () পদ্ধতিটি XML ফর্ম্যাটে থাকা শিম / অ্যাপ্লিকেশন কনফিগারেশনের উপর নির্ভর করতে লেখা উচিত - এটি কি নিরাপদ অনুমান, বা আমি ব্যবহারকারীকে নির্দিষ্ট কিছুতে লক করছি?

এবং এই উত্তরটি কি একটি ওয়েব পরিবেশে পরিবর্তিত হয় - যদি আমার ক্লাসগুলির কোনওটি স্প্রিং সম্পর্কে সচেতন হওয়ার প্রয়োজন হয়, তাদের কি আরও বেশি প্রয়োজন ApplicationContext?

কোন সাহায্যের জন্য ধন্যবাদ। আমি জানি এই প্রশ্নগুলির অনেকগুলি সম্ভবত রেফারেন্স ম্যানুয়ালটিতে উত্তর দেওয়া হয়েছে, তবে আমি এই দুটি ইন্টারফেসের একটি স্পষ্ট বিচ্ছেদ এবং একটি সূক্ষ্ম দাঁত চিরুনি দিয়ে ম্যানুয়ালটি না পড়ে প্রতিটিটির উপকারিতা / বিধিগুলি খুঁজে পেতে খুব কঠিন সময় পাচ্ছি।

উত্তর:


209

বসন্তের ডক্সগুলি এতে দুর্দান্ত: 3.8.1। বিন ফ্যাক্টরি বা অ্যাপ্লিকেশন কনটেক্সট? । তাদের তুলনা সহ একটি টেবিল রয়েছে, আমি একটি স্নিপেট পোস্ট করব:

শিম কারখানা

  • শিম তাত্পর্য / তারের

অ্যাপ্লিকেশন প্রসঙ্গ

  • শিম তাত্পর্য / তারের
  • স্বয়ংক্রিয় বিনপোস্টপ্রসেসর নিবন্ধকরণ
  • স্বয়ংক্রিয় বিন ফ্যাক্টরিপোস্টপ্রসেসর নিবন্ধকরণ
  • সুবিধাজনক মেসেজ সোর্স অ্যাক্সেস (আই 18 এন এর জন্য)
  • অ্যাপ্লিকেশন ইভেন্ট প্রকাশনা

সুতরাং আপনার যদি অ্যাপ্লিকেশন প্রসঙ্গে উপস্থাপিত কোনও পয়েন্টের প্রয়োজন হয়, আপনার অ্যাপ্লিকেশন কনটেক্সট ব্যবহার করা উচিত।


3
বিয়ানফ্যাক্টরিটি হালকা ওজনের, তবে আপনি যদি "স্প্রিলের জন্য" স্প্রিং ব্যবহার করতে যাচ্ছেন তবে আপনি অ্যাপ্লিকেশন কনটেক্সটও যেতে পারেন: যদি আপনি এর অভিনব বৈশিষ্ট্যগুলি ব্যবহার না করেন তবে খুব কম ওভারহেড জড়িত রয়েছে, তবে তারা এখনও উপলব্ধ যদি আপনি / যখন তাদের ব্যবহার করেন।
MetroidFan2002

2
আপনি যখন "স্বয়ংক্রিয় বিনপোস্টপোরসেসর রেজিগ্রেশন" বলবেন তখন এর অর্থ কী? এর অর্থ কি ক্লাসের সেই ইন্টারফেসটি প্রয়োগ করতে হবে না?
আবিদি

2
অ্যাপ্লিকেশন কনটেক্সট বিয়ান ফ্যাক্টরীর বিরুদ্ধে এওপি সমর্থন করে।
ininprsr

1
সঙ্গে BeanFactoryআমরা কন্সট্রাকটর প্যারামিটার পরিবর্তনশীল কিন্তু পাস করতে পারেন ApplicationContextআমরা তা করতে পারবে না।
হাফ ব্লাড প্রিন্স

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

52

স্প্রিং দুই ধরণের আইওসি পাত্রে সরবরাহ করে, একটি হ'ল XMLBeanFactoryঅন্যটি ApplicationContext

+---------------------------------------+-----------------+--------------------------------+
|                                       | BeanFactory     |       ApplicationContext       |
+---------------------------------------+-----------------+--------------------------------+
| Annotation support                    | No              | Yes                            |
| BeanPostProcessor Registration        | Manual          | Automatic                      |
| implementation                        | XMLBeanFactory  | ClassPath/FileSystem/WebXmlApplicationContext|
| internationalization                  | No              | Yes                            |
| Enterprise services                   | No              | Yes                            |
| ApplicationEvent publication          | No              | Yes                            |
+---------------------------------------+-----------------+--------------------------------+

এখানে চিত্র বর্ণনা লিখুন

  • FileSystemXmlApplicationContext মটরশুটি পুরো পথ দিয়ে বোঝাই।
  • ClassPathXmlApplicationContext মটরশুটি CLASSPATH এর মাধ্যমে লোড করা হয়েছে
  • XMLWebApplicationContextএবং AnnotationConfigWebApplicationContextমটরশুটি ওয়েব অ্যাপ্লিকেশন প্রসঙ্গে লোড করা।
  • AnnotationConfigApplicationContext টিকা ভিত্তিক কনফিগারেশন থেকে স্প্রিং মটরশুটি লোড হচ্ছে

উদাহরণ:

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeansConfiguration.class);
  • ApplicationContextএকটি ধারক হ'ল একটি দ্বারা আরম্ভ ContextLoaderListenerবা ContextLoaderServletএকটি সংজ্ঞায়িত web.xmlএবং ContextLoaderPluginসংজ্ঞায়িত struts-config.xml

নোট : XmlBeanFactoryহয় অবচিত পক্ষে স্প্রিং 3.1 হিসাবে DefaultListableBeanFactoryএবং XmlBeanDefinitionReader


2
চিত্রটির ক্লাসপ্যাথএক্সএমএল অ্যাপ্লিকেশন কনটেক্সট এর নীচে
আখিল জৈন

48

আমার কাছে, BeanFactoryওভারটি বেছে নেওয়ার প্রাথমিক পার্থক্যটি ApplicationContextমনে ApplicationContextহচ্ছে এটি শিমের সমস্ত প্রাক-ইনস্ট্যান্ট করবে। থেকে বসন্ত ডক্স :

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

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

আমি যতটুকু বলতে পারি, ওভাররাইডিং ডিফল্ট ইনস্ট্যান্টিয়েশন আচরণ সম্পর্কিত ডকুমেন্টেশনের নোটটি কনফিগারেশনে স্থান নেয়, এবং এটি প্রতি বীন, সুতরাং আমি কেবল এক্সএমএল ফাইলটিতে "অলস-আরআইআই" বৈশিষ্ট্যটি সেট করতে পারি না বা আমি পরীক্ষার জন্য এটির একটি সংস্করণ এবং স্থাপনার জন্য একটি আটকে আটকে রাখা।

আমি যেটা শেষ করেছি তা হ'ল ClassPathXmlApplicationContextটেস্টে ব্যবহারের জন্য অলসভাবে শিমের বোঝা বাড়িয়ে দেওয়া:

public class LazyLoadingXmlApplicationContext extends ClassPathXmlApplicationContext {

    public LazyLoadingXmlApplicationContext(String[] configLocations) {
        super(configLocations);
    }

    /**
     * Upon loading bean definitions, force beans to be lazy-initialized.
     * @see org.springframework.context.support.AbstractXmlApplicationContext#loadBeanDefinitions(org.springframework.beans.factory.xml.XmlBeanDefinitionReader)
     */

    @Override
    protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws IOException {
        super.loadBeanDefinitions(reader);
        for (String name: reader.getBeanFactory().getBeanDefinitionNames()) {
            AbstractBeanDefinition beanDefinition = (AbstractBeanDefinition) reader.getBeanFactory().getBeanDefinition(name);
            beanDefinition.setLazyInit(true);
        }
    }

}

2
আমি যুক্তি দিয়ে বলব যে যদি আপনার ইউনিট পরীক্ষাগুলি আপনার সম্পূর্ণ বসন্ত প্রসঙ্গে লোড করে তবে সেগুলি "ইউনিট পরীক্ষা" নয়, তবে ইন্টিগ্রেশন টেস্ট।
ম্যাট বি

1
ভাল যুক্তি. আমার ক্ষেত্রে আমাকে পারফরম্যান্স এবং ইন্টিগ্রেশন পরীক্ষার জন্য প্রসঙ্গ থেকে মটরশুটি লোড করা দরকার ছিল এবং অভ্যাসের বাইরে "ইউনিট টেস্ট" লিখেছিলাম। আমি আমার উত্তর অনুসারে সম্পাদনা করেছি।
লাইল

2
BeanFactory doesn't support classpath XML configuration.আমি মনে করি এটি এটি করে: stackoverflow.com/questions/5231371/…
এক্সট্রিম বাইকার

29

মিগুয়েল পিং যা উত্তর দিয়েছিল তা যুক্ত করতে এখানে ডকুমেন্টেশন থেকে অন্য একটি বিভাগ দেওয়া হয়েছে যা এর উত্তরও দেয়:

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

(এই প্রশ্নটি পড়তে পারে এমন কোনও ভবিষ্যতের বসন্তের নবীনদের জন্য এটি পোস্ট করা)


19
  1. ApplicationContext এর চেয়ে বেশি পছন্দসই উপায় BeanFactory

  2. নতুন বসন্ত সংস্করণ BeanFactoryসঙ্গে প্রতিস্থাপন করা হয় ApplicationContextBeanFactoryপিছনে সামঞ্জস্যের জন্য এখনও বিদ্যমান exists

  3. ApplicationContext extends BeanFactory এবং নিম্নলিখিত বেনিফিট রয়েছে
    • এটি পাঠ্য বার্তাগুলির জন্য আন্তর্জাতিককরণ সমর্থন করে
    • এটি নিবন্ধিত শ্রোতাদের ইভেন্ট প্রকাশনাকে সমর্থন করে
    • URL এবং ফাইলগুলির মতো সংস্থানগুলিতে অ্যাক্সেস

13

ApplicationContext: এটা বসন্ত কনফিগারেশন ফাইল কনফিগার বসন্ত মটরশুটি লোড করে, এবং বসন্ত শিম এর জীবনচক্র এবং যখন পর্যন্ত CONTAINER STARTS.It অপেক্ষা করবে না পরিচালনা getBean ( "springbeanref") বলা হয়।

বিয়ানফ্যাক্টরি এটি বসন্ত বিন্যাস ফাইলটিতে কনফিগার করা বসন্তের মটরশুটি লোড করে, যখন আমরা getBean ("স্প্রেডিয়েনেরেফ") কল করি তখন আমরা যখন গ্রীষ্মকালীন শিমের জীবনচক্র শুরু হয় তখন উইটবিয়ান ("স্প্রেডিয়েনরেফ") কল করি o


12

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

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

আপনি যদি স্বতন্ত্র অ্যাপ্লিকেশন লিখছেন তবে একটি ক্লাসপ্যাথএক্সএমএল অ্যাপ্লিকেশন কনটেক্সট ব্যবহার করে আপনার মূল পদ্ধতিতে অ্যাপ্লিকেশন কনটেক্সটটি লোড করুন এবং মূল সিমটি পান এবং আপনার অ্যাপ্লিকেশন শুরু করতে এর রান () (বা যাই হোক না কেন পদ্ধতি) প্রার্থনা করুন। আপনি যদি কোনও ওয়েব অ্যাপ লিখছেন তবে ওয়েব.এক্সএমএলে কনটেক্সটলয়েডারলিস্টনার ব্যবহার করুন যাতে এটি অ্যাপিকেশন কনটেক্সট তৈরি করে এবং আপনি পরে এটি জেএসপি, জেএসএফ, জেএসটিএল, স্ট্রুটস, টেপস্ট্রি ইত্যাদি ব্যবহার না করেই সার্ভলেট কনটেক্সট থেকে পেতে পারেন it ।

এছাড়াও, মনে রাখবেন আপনি একাধিক স্প্রিং কনফিগারেশন ফাইল ব্যবহার করতে পারেন এবং আপনি হয় কনস্ট্রাক্টরের সমস্ত ফাইল তালিকাভুক্ত করে অ্যাপ্লিকেশন কনটেক্সট তৈরি করতে পারেন (বা কনটেক্সটলোডারলিস্টারের জন্য প্রসঙ্গ-প্যারামে সেগুলি তালিকাভুক্ত), অথবা আপনি কেবল একটি মূল কনফিগারেশন ফাইল লোড করতে পারেন আমদানি বিবৃতি। আপনি << Importance = "otherfile.xML" /> ব্যবহার করে অন্য একটি স্প্রিং কনফিগারেশন ফাইলটিতে একটি স্প্রিং কনফিগারেশন ফাইলটি আমদানি করতে পারেন যা আপনি যখন মূল পদ্ধতিতে অ্যাপ্লিকেশন কনটেক্সটটি প্রোগ্রামালিমে তৈরি করেন এবং কেবল একটি স্প্রিং কনফিগারেশন ফাইল লোড করেন তখন এটি খুব কার্যকর।


6

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

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

যদি আপনার কোনও ওয়েব অ্যাপ্লিকেশন বিকাশ করা হয় তবে এটি নিরাপদে আপনার XMLWebApplicationContext ব্যবহার করা উচিত তা বলা নিরাপদ।

যদি আপনি চান যে আপনার মটরশুটি স্প্রিং সম্পর্কে সচেতন হন, আপনি সেগুলি এর জন্য বিয়ানফ্যাক্টরিওয়্যার এবং / বা অ্যাপ্লিকেশনসন্টেক্সওয়্যার প্রয়োগ করতে পারেন, যাতে আপনি বিয়ানফ্যাক্টরি বা অ্যাপ্লিকেশন কনটেক্সট ব্যবহার করতে পারেন এবং কোন ইন্টারফেসটি প্রয়োগ করতে হবে তা চয়ন করতে পারেন।


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

6

বিয়ানফ্যাক্টরি এবং অ্যাপ্লিকেশন কনটেক্সটের মধ্যে পার্থক্যটি নিম্নলিখিত:

  1. বিয়ানফ্যাক্টরি অলস সূচনা ব্যবহার করে তবে অ্যাপ্লিকেশনসন্টেক্সট আগ্রহী সূচনা ব্যবহার করে। বিন ফ্যাক্টরির ক্ষেত্রে, শিমটি তৈরি করা হয় যখন আপনি getBeans () পদ্ধতিটি কল করেন তবে অ্যাপ্লিকেশনকন্টেক্সট অবজেক্ট তৈরি হওয়ার পরে অ্যাপ্লিকেশনকন্টেক্সটের ক্ষেত্রে শিমটি সামনে তৈরি করা হয়।
  2. বিয়ানফ্যাক্টরি স্পষ্টভাবে সিনট্যাক্স ব্যবহার করে একটি রিসোর্স অবজেক্ট সরবরাহ করে তবে অ্যাপিকেশন কনটেক্সট নিজে থেকেই রিসোর্স অবজেক্ট তৈরি করে এবং পরিচালনা করে।
  3. বিয়ানফ্যাক্টরি ইন্টারন্যাটিওলাইজেশন সমর্থন করে না তবে অ্যাপ্লিকেশন কনটেক্সট আন্তর্জাতিকীকরণকে সমর্থন করে।
  4. বিন ফ্যাক্টরি টীকা ভিত্তিক নির্ভরতা ইনজেকশন সমর্থিত নয় তবে অ্যাপ্লিকেশন কনটেস্টে টিকা-ভিত্তিক নির্ভরতা ইনজেকশন সমর্থিত।

বিন ফ্যাক্টরি ব্যবহার:

BeanFactory beanfactory = new XMLBeanFactory(new FileSystemResource("spring.xml"));
 Triangle triangle =(Triangle)beanFactory.getBean("triangle");

অ্যাপ্লিকেশন কনটেক্সট ব্যবহার:

ApplicationContext context = new ClassPathXMLApplicationContext("spring.xml")
Triangle triangle =(Triangle)context.getBean("triangle");

5

বিন ফ্যাক্টরি এবং অ্যাপ্লিকেশন কনটেক্সট উভয়ই আপনার বসন্তের আইওসি ধারক থেকে শিম পাওয়ার উপায় তবে এখনও কিছু পার্থক্য রয়েছে।

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

বিয়ানফ্যাক্টরি এবং অ্যাপ্লিকেশন কনটেক্সট উভয়ই জাভা ইন্টারফেস এবং অ্যাপ্লিকেশন কনটেক্সট বিয়ানফ্যাক্টরির প্রসারিত। উভয়ই এক্সএমএল কনফিগারেশন ফাইলগুলি ব্যবহার করে কনফিগারেশন। সংক্ষেপে বিয়ানফ্যাক্টরি বেসিক্যাল ইনভার্সন অফ কন্ট্রোল ( আইওসি ) এবং ডিপেন্ডেন্সি ইনজেকশন ( ডিআই ) বৈশিষ্ট্য সরবরাহ করে যখন অ্যাপিকেশনকন্টেক্স উন্নত বৈশিষ্ট্যগুলি সরবরাহ করে।

একটি বিয়ানফ্যাক্টরি ইন্টারফেস " org.springframework.beans.factory " দ্বারা প্রদর্শিত হয় যেখানে বিন ফ্যাক্টরি, যার জন্য একাধিক বাস্তবায়ন রয়েছে।

ClassPathResource resource = new ClassPathResource("appConfig.xml");
XmlBeanFactory factory = new XmlBeanFactory(resource);

পার্থক্য

  1. বিন ফ্যাক্টরি ইনস্ট্যান্টিয়েট শিম আপনি যখন getBean () পদ্ধতি কল করেন তখন অ্যাপ্লিকেশন কনটেক্সট ইনস্ট্যান্টিয়েট সিঙ্গলটন বিন যখন কনটেইনার শুরু হয়, এটি getBean () কল করার অপেক্ষা রাখে না।

  2. বিয়ান ফ্যাক্টরী আন্তর্জাতিকীকরণের জন্য সমর্থন সরবরাহ করে না তবে অ্যাপ্লিকেশন কনটেক্সট এটির জন্য সহায়তা সরবরাহ করে।

  3. বিয়ানফ্যাক্টরি বনাম অ্যাপ্লিকেশনসন্টেক্সটের মধ্যে অন্য একটি পার্থক্য হ'ল শিমগুলিতে ইভেন্ট প্রকাশের দক্ষতা যা শ্রোতা হিসাবে নিবন্ধিত।

  4. বিন ফ্যাক্টরি ইন্টারফেসের জনপ্রিয় বাস্তবায়নগুলির মধ্যে একটি হ'ল এক্সএমএলবিয়ানফ্যাক্টরি এবং অ্যাপ্লিকেশনকন্টেক্সট ইন্টারফেসের জনপ্রিয় প্রয়োগগুলির মধ্যে একটি হল ক্লাসপ্যাথএক্সএমএল অ্যাপ্লিকেশনকন্টেক্সট

  5. আপনি যদি অটো ওয়্যারিং ব্যবহার করছেন এবং বিন ফ্যাক্টরি ব্যবহার করছেন তবে আপনার অটোওয়্যারডবিয়ানপোস্টপ্রসেসরটি এপিআই ব্যবহার করে নিবন্ধভুক্ত করতে হবে যা আপনি অ্যাপ্লিকেশন কনটেক্সট ব্যবহার করছেন যদি আপনি এক্সএমএলে কনফিগার করতে পারেন । সংক্ষেপে বিয়ানফ্যাক্টরি টেস্টিং এবং অ উত্পাদনের ব্যবহারের জন্য ঠিক আছে তবে অ্যাপ্লিকেশন কনটেক্সট আরও সমৃদ্ধ ধারক প্রয়োগের বৈশিষ্ট্য এবং বিন ফ্যাক্টরির পক্ষপাতী হওয়া উচিত

  6. বিয়ানফ্যাক্টরি ডিফল্টরূপে এর সমর্থন অলস লোডিং এবং অ্যাপ্লিকেশন কনটেক্সট ডিফল্ট সমর্থন করে আগ্রাসী লোডিং।


আপনি কি দয়া করে আপনার # 1 টি আরও স্পষ্টভাবে ব্যাখ্যা করতে পারেন, যদি আমি আমার বসন্তের কনফিগারেশনের ফাইলে একটি সিঙ্গলটন বিনকে সংজ্ঞায়িত করেছি তবে বসন্তের ধারক এটির একটি একটি সিঙ্গলটন তৈরি করবে, কীভাবে এটি বিয়ানফ্যাক্টরী বা অ্যাপ্লিকেশন কনটেক্সট রয়েছে কিনা তা বিবেচনা করে।
pjj


3

ক। শিমের কারখানা এবং অ্যাপ্লিকেশন প্রসঙ্গে একটি পার্থক্য হ'ল প্রাক্তন কেবল ইনস্ট্যানিয়েট শিম আপনি যখন getBean () পদ্ধতি কল করেন তখন অ্যাপ্লিকেশন কনটেক্সট কনটেনারটি শুরু হওয়ার পরে সিঙ্গেলটন বিনকে ইনস্ট্যান্ট করে দেয়, এটি getBean কল হওয়ার অপেক্ষা রাখে না।

খ।

ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

অথবা

ApplicationContext context = new ClassPathXmlApplicationContext{"spring_dao.xml","spring_service.xml};

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

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

ঘ। বিয়ান ফ্যাক্টরী আন্তর্জাতিকীকরণের জন্য আই আই 18 এন সমর্থন সরবরাহ করে না তবে অ্যাপ্লিকেশন কনটেক্সট এটির জন্য সহায়তা সরবরাহ করে।

ঙ। বিয়ানফ্যাক্টরি কনটেইনার অটোস্ক্যানিং এর বৈশিষ্ট্য সমর্থন করে না (সমর্থন এনোটেশন ভিত্তিক নির্ভরতা ইনজেকশন ইনজেকশন), তবে অ্যাপিকেশনকন্টেক্স কনটেইনার সমর্থন করে।

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

ছ। বিনফ্যাক্টারি কনটেইনারগুলি বিনগুলির দুটি মাত্র স্কোপ (সিঙ্গলটন এবং প্রোটোটাইপ) সমর্থন করে। তবে অ্যাপ্লিকেশন কনটেক্সট পাত্রে সমস্ত মটরশুটি সুযোগকে সমর্থন করে।


পয়েন্ট a এবং f সমান। একত্রিত হতে পারে।
ধনা 1310

3

মূলত আমরা দুটি উপায়ে বসন্ত ধারক বস্তু তৈরি করতে পারি

  1. বিয়ানফ্যাক্টরি ব্যবহার করছি।
  2. অ্যাপ্লিকেশন কনটেক্সট ব্যবহার করে।

উভয়ই ইন্টারফেস,

বাস্তবায়ন ক্লাস ব্যবহার করে আমরা বসন্ত ধারক জন্য বস্তু তৈরি করতে পারেন

পার্থক্য আসছে

বিন ফ্যাক্টরি:

  1. এনোটেশন ভিত্তিক নির্ভরতা ইনজেকশন সমর্থন করে না।

  2. I18N সমর্থন করে না।

  3. ডিফল্টরূপে এর সমর্থন অলস লোডিং।

  4. এটি একাধিক কনফিগারেশন ফাইলগুলিতে কনফিগার করতে দেয় না।

উদা: বিন ফ্যাক্টরি প্রসঙ্গ = নতুন এক্সএমএলবিয়ানফ্যাক্টরি (নতুন রিসোর্স ("অ্যাপ্লিকেশনকন্টেক্সট.এক্সএমএল"));

ApplicationContext

  1. সমর্থন এনোটেশন ভিত্তিক নির্ভরতা ইনজেকশন

  2. সমর্থন I18N

  3. এটি ডিফল্টরূপে আগ্রাসী লোডিং সমর্থন করে।

  4. এটি একাধিক কনফিগারেশন ফাইল কনফিগার করতে দেয়।


উদাহরণস্বরূপ : অ্যাপ্লিকেশন কনটেক্সট প্রসঙ্গ = নতুন ক্লাসপাথএক্সএমএল অ্যাপ্লিকেশনকন্টেক্সট ("অ্যাপ্লিকেশনকন্টেক্সট.এক্সএমএল");


1

স্প্রিং ডক্স থেকে এই দস্তাবেজটি দেখুন:

http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/beans.html#context-introduction-ctx-vs-beanfactory

5.15.1 বিন ফ্যাক্টরি বা অ্যাপ্লিকেশন কনটেক্সট?

অ্যাপ্লিকেশন কনটেক্সট ব্যবহার করুন যদি না এটি না করার উপযুক্ত কারণ থাকে।

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


1

অ্যাপ্লিকেশন কনটেক্সট হ'ল বিয়ান ফ্যাক্টরির একটি বড় ভাই এবং এটিই বিয়ানফ্যাক্টরির সাথে আরও অনেকগুলি জিনিস সরবরাহ করে।

স্ট্যান্ডার্ড org.springframework.beans.f਼ਕਾਰੀ.বিয়ানফ্যাক্টরি লাইফসাইকেল ক্ষমতা ছাড়াও, অ্যাপ্লিকেশন কনটেক্সট বাস্তবায়ন অ্যাপ্লিকেশনসন্টেক্সওয়্যার মটরশুটি পাশাপাশি রিসোর্সলয়েডারআওয়্যার, অ্যাপ্লিকেশনএন্টপুব্লিশারআওয়ার এবং মেসেজসোর্সসওয়্যার মটরশুটি সনাক্ত করে এবং অনুরোধ করে।


1

রিয়েল-টাইম দৃশ্যে, স্প্রিং আইওসি কোর ধারক (বিয়ানফ্যাক্টরি) এবং অ্যাডভান্সড জে 2 ই ই ধারক (অ্যাপ্লিকেশন কনটেক্সট) এর মধ্যে পার্থক্য নিম্নরূপ।

  1. বিন ফ্যাক্টরিটি বসন্ত.এক্সএমএল ফাইলটিতে উল্লিখিত মটরশুটির জন্য (যেমন, পওজো ক্লাসের জন্য) বস্তু তৈরি করবে (<bean></bean> আপনি যখন .getBean () পদ্ধতি কল করেন তবে অ্যাপ্লিকেশন কনটেক্সট সমস্ত সিমের জন্য বস্তু তৈরি করে ( <bean></bean>যদি এর ব্যাপ্তিটি না থাকে তবে) স্পষ্টভাবে উল্লেখ করা হয়েছে "প্রোটোটাইপ" হিসাবে) স্প্রিং.এক্সএমএল ফাইলটি স্বয়ং লোড করার সময় স্প্রিং.এক্সএমএলে কনফিগার করা হয়েছে।

  2. বিয়ানফ্যাক্টরি: (অলস ধারক কারণ আপনি কেবল স্পষ্টভাবে ব্যবহারকারী / প্রধান শ্রেণীর পক্ষ থেকে কল করলেই মটরশুটিগুলির জন্য বস্তু তৈরি করে)

    /*
     * Using core Container - Lazy container - Because it creates the bean objects On-Demand
     */
    //creating a resource
    Resource r = (Resource) new ClassPathResource("com.spring.resources/spring.xml");
    //creating BeanFactory 
    BeanFactory factory=new XmlBeanFactory(r);
    
    //Getting the bean for the POJO class "HelloWorld.java"
    HelloWorld worldObj1 = (HelloWorld) factory.getBean("test");

    অ্যাপ্লিকেশন কনটেক্সট: (স্প্রিং.এক্সএমএল ফাইল নিজেই লোড করার সময় সমস্ত সিঙ্গলটন মটরশুটি তৈরি করার কারণে উত্সাহী ধারক)

    ApplicationContext context = new ClassPathXmlApplicationContext("com/ioc/constructorDI/resources/spring.xml");
  3. প্রযুক্তিগতভাবে, অ্যাপ্লিকেশনসন্টেক্সট ব্যবহারের জন্য সুপারিশ করা হয়েছে কারণ রিয়েল-টাইম অ্যাপ্লিকেশনগুলিতে, শিমের অবজেক্ট তৈরি করা হবে যখন অ্যাপ্লিকেশনটি সার্ভারে থেকেই শুরু করা হবে। এটি ব্যবহারকারীর অনুরোধের জন্য প্রতিক্রিয়া সময়কে হ্রাস করে কারণ প্রতিক্রিয়া জানার জন্য অবজেক্টগুলি ইতিমধ্যে উপলব্ধ।


স্ট্যাক ওভারফ্লো কোনও ফোরাম নয়, সুতরাং আমি আপনার উত্তরটি সম্পাদনা করে আরও প্রশ্নের সরাসরি প্রত্যুত্তর করতে এবং আলোচনাকে আমন্ত্রণ জানাতে এড়াতে পারি।
জেফ্রি বসবুম

0

আমি মনে করি এটি উল্লেখযোগ্য যে স্প্রিং 3 থেকে আপনি যদি কোনও কারখানা তৈরি করতে চান তবে আপনি @configurationউপযুক্তটির সাথে সংযুক্ত টীকাটিও ব্যবহার করতে পারেন@scope

@Configuration
public class MyFactory {

    @Bean
    @Scope("prototype")
    public MyClass create() {
        return new MyClass();
    }
}

@ComponentScanটেক্সট বা এক্সএমএল কনফিগারেশন ব্যবহার করে আপনার কারখানাটি স্প্রিং পাত্রে দৃশ্যমান হওয়া উচিত

বেলডং সাইট থেকে স্প্রিং শিম স্কোপ নিবন্ধ


0

অ-ওয়েব অ্যাপ্লিকেশনগুলির জন্য বিন ফ্যাক্টরি ব্যবহার করুন কারণ এটি কেবলমাত্র সিঙ্গলটন এবং প্রোটোটাইপ শিম-স্কোপগুলিকে সমর্থন করে।

অ্যাপ্লিকেশনসন্টেক্সট পাত্রে সমস্ত বিন-স্কোপ সমর্থন করে যাতে আপনার এটি ওয়েব অ্যাপ্লিকেশনগুলির জন্য ব্যবহার করা উচিত।


0

সংক্ষেপে:

ApplicationContext BeanFactory সকল ক্রিয়াকলাপ অন্তর্ভুক্ত করা হয়েছে। এটি সাধারণত ব্যবহার করার পরামর্শ দেওয়া হয়।

মোবাইল অ্যাপ্লিকেশনে কিছু সীমাবদ্ধ পরিস্থিতি রয়েছে, যেখানে মেমরির ব্যবহার ব্যর্থ হতে পারে।

এই পরিস্থিতিতে, আরও বেশি হালকা বিয়ানফ্যাক্টরি ব্যবহার করা ন্যায়সঙ্গত হতে পারে । তবে, অধিকাংশ এন্টারপ্রাইজ অ্যাপ্লিকেশন, ApplicationContext কি আপনি ব্যবহার করতে চান না।

আরও জন্য, আমার ব্লগ পোস্ট দেখুন:

স্পিনে বিয়ানফ্যাক্টরি এবং অ্যাপ্লিকেশন কনটেক্সটের মধ্যে পার্থক্য - বুনিয়াদি থেকে জাভা স্প্রিং ব্লগ


0

আমার বিয়ানফ্যাক্টরি এবং অ্যাপ্লিকেশন কনটেক্সটটি ব্যাখ্যা করা দরকার।

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

বিয়ানফ্যাক্টরি হ'ল ডিপেন্ডেন্সি ইঞ্জেকশনের জন্য প্রাথমিক সমর্থন সরবরাহকারী একটি সহজ কন্টেইনার

অ্যাপ্লিকেশন প্রসঙ্গে অ্যাপ্লিকেশন প্রসঙ্গটি বসন্ত অ্যাপ্লিকেশন সহ একটি কেন্দ্রীয় ইন্টারফেস যা অ্যাপ্লিকেশনটিকে কনফিগারেশন সম্পর্কিত তথ্য সরবরাহ করে। এটি বিন ফ্যাক্টরি ইন্টারফেস প্রয়োগ করে।

অ্যাপ্লিকেশন প্রসঙ্গটি একটি অগ্রিম ধারক এটির এন্টারপ্রাইজ নির্দিষ্ট কার্যকারিতার যেমন অ্যাডভান্স লেভেল যেমন সম্পত্তি ফাইল থেকে পাঠ্য বার্তা সমাধানের ক্ষমতা .... ইত্যাদি add

একটি অ্যাপ্লিকেশন কনটেক্সট সরবরাহ করে:

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

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