স্প্রিং @ কনফিগারেশন ক্লাস বোঝা


108

প্রশ্নটির পরে স্প্রিং @ অটোয়ারওয়্যারড ব্যবহার বুঝে আমি বসন্ত তারের অন্যান্য বিকল্প, @Configurationক্লাসের জন্য একটি সম্পূর্ণ জ্ঞানের ভিত্তি তৈরি করতে চেয়েছিলাম ।

ধরে নেওয়া যাক আমার কাছে একটি বসন্তের এক্সএমএল ফাইল রয়েছে যা দেখতে এটির মতো দেখাচ্ছে:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

  <import resource="another-application-context.xml"/>

  <bean id="someBean" class="stack.overflow.spring.configuration.SomeClassImpl">
    <constructor-arg value="${some.interesting.property}" />
  </bean>

  <bean id="anotherBean" class="stack.overflow.spring.configuration.AnotherClassImpl">
    <constructor-arg ref="someBean"/>
    <constructor-arg ref="beanFromSomewhereElse"/>
  </bean>
</beans>

@Configurationপরিবর্তে আমি কীভাবে ব্যবহার করতে পারি ? কোডে নিজেও এর কোনও প্রভাব আছে?

উত্তর:


151

এক্সএমএলে স্থানান্তরিত হচ্ছে @Configuration

@Configurationকয়েক ধাপে এক্সএমএলটি একটিতে স্থানান্তরিত করা সম্ভব :

  1. একটি @Configurationএনোটোটেড শ্রেণি তৈরি করুন :

    @Configuration
    public class MyApplicationContext {
    
    }
  2. প্রতিটির জন্য <bean> ট্যাগের জন্য এ্যানোটেটেড একটি পদ্ধতি তৈরি করুন @Bean:

    @Configuration
    public class MyApplicationContext {
    
      @Bean(name = "someBean")
      public SomeClass getSomeClass() {
        return new SomeClassImpl(someInterestingProperty); // We still need to inject someInterestingProperty
      }
    
      @Bean(name = "anotherBean")
      public AnotherClass getAnotherClass() {
        return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse); // We still need to inject beanFromSomewhereElse
      }
    }
  3. আমদানি করার জন্য beanFromSomewhereElseআমাদের এর সংজ্ঞাটি আমদানি করতে হবে। এটি একটি এক্সএমএলে সংজ্ঞায়িত করা যেতে পারে এবং আমরা ব্যবহার করব @ImportResource:

    @ImportResource("another-application-context.xml")
    @Configuration
    public class MyApplicationContext {
      ...  
    }

    শিম যদি অন্য একটিতে সংজ্ঞায়িত করা হয় @Configuration শ্রেণিতে আমরা @Importটীকাটি ব্যবহার করতে পারি :

    @Import(OtherConfiguration.class)
    @Configuration
    public class MyApplicationContext {
      ...
    }
  4. আমরা অন্যান্য এক্সএমএল আমদানি করার পরে বা @Configuration ক্লাস , @Configurationক্লাসে কোনও প্রাইভেট সদস্য ঘোষণা করে তারা আমাদের প্রসঙ্গে ঘোষণা করা মটরশুটি ব্যবহার করতে পারি :

    @Autowired
    @Qualifier(value = "beanFromSomewhereElse")
    private final StrangeBean beanFromSomewhereElse;

    অথবা এটিকে নির্ভর করে যে পদ্ধতিটি মটরশুটিটিকে সংজ্ঞায়িত করে সেই পদ্ধতিতে এটি সরাসরি প্যারামিটার হিসাবে ব্যবহার করুন beanFromSomewhereElse ব্যবহার করে@Qualifier :

    @Bean(name = "anotherBean")
    public AnotherClass getAnotherClass(@Qualifier (value = "beanFromSomewhereElse") final StrangeBean beanFromSomewhereElse) {
      return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse);
    }
  5. বৈশিষ্ট্যগুলি আমদানি করা অন্য একটি এক্সএমএল বা শিম থেকে আমদানি করার মতো similar @Configuration শ্রেণি । ব্যবহারের পরিবর্তে @Qualifierআমরা নীচে @Valueহিসাবে বৈশিষ্ট্যগুলি ব্যবহার করব :

    @Autowired
    @Value("${some.interesting.property}")
    private final String someInterestingProperty;

    এটি দিয়ে ব্যবহার করা যেতে পারে স্পেল এক্সপ্রেশনগুলির পাশাপাশি ।

  6. বসন্তকে যেমন ব্রেস কনটেইনার হিসাবে এই শ্রেণীর আচরণ করার অনুমতি দেওয়ার জন্য আমাদের এই প্রসঙ্গে এই ট্যাগটি রেখে আমাদের মূল এক্সএমএলতে চিহ্নিত করতে হবে:

    <context:annotation-config/>

    আপনি এখন আমদানি করতে পারেন @Configuration সাধারণ সিম তৈরি করার মতোই ক্লাস :

    <bean class="some.package.MyApplicationContext"/>

    সম্পূর্ণরূপে বসন্তের এক্সএমএল এড়ানোর উপায় রয়েছে তবে তারা এই উত্তরের সুযোগে নেই। আপনি আমার ব্লগ পোস্টে এই বিকল্পগুলির একটি আবিষ্কার করতে পারেন যার উপরে আমি আমার উত্তরটি ভিত্তি করছি।


এই পদ্ধতিটি ব্যবহারের সুবিধাগুলি এবং অসুবিধাগুলি

মূলত আমি কয়েকটি সুবিধার কারণে দেখতে পেয়েছি এক্সএমএল ব্যবহারের চেয়ে মটরশুটি ঘোষণার এই পদ্ধতিটি অনেক বেশি স্বাচ্ছন্দ্যবোধ করি:

  1. টাইপস -@Configuration ক্লাসগুলি সংকলিত হয় এবং টাইপগুলি কেবল সংকলনের অনুমতি দেয় না
  2. দ্রুত ব্যর্থ (সময় সংকলন) - আপনি যদি কোনও শিম ইনজেকশন করতে ভুলে যান তবে আপনি XMLs এর মতো রান-টাইমে নয়, সংকলনের সময় ব্যর্থ হবেন
  3. আইডিইতে নেভিগেট করা সহজনির্ভরতা গাছ বোঝার জন্য শিমের মধ্যে - ।
  4. কনফিগারেশন স্টার্টআপটি সহজেই ডিবাগ করা সম্ভব

অসুবিধাগুলি আমি যেমন দেখি তেমনটি হয় না তবে কয়েকটি রয়েছে যা আমি ভাবতে পারি:

  1. অপব্যবহার - কোড এক্সএমএলগুলির চেয়ে অপব্যবহার করা সহজ
  2. এক্সএমএল সহ আপনি ক্লাসের উপর নির্ভরশীলতা নির্ধারণ করতে পারেন যা সংকলনের সময় পাওয়া যায় না তবে রান-সময় চলাকালীন সরবরাহ করা হয়। সঙ্গে @Configurationশ্রেণীর আপনি ক্লাস কম্পাইল সময়ে পাওয়া যায় থাকতে হবে। সাধারণত এটি কোনও সমস্যা নয়, তবে এটি হতে পারে এমন ঘটনাও রয়েছে।

বটম লাইন: এটা XML গুলি গ্রহণ, একত্রিত করতে পুরোপুরি জরিমানা @Configurationএবং টীকা আপনার আবেদন প্রেক্ষাপটে। সিম ঘোষিত পদ্ধতিটির সাথে বসন্তটি চিন্তা করে না about


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

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

6
@ প্রোফাইলে টিকা, এবং "$ {env.value}" বাক্য গঠন এর জন্য। @ প্রোফাইলে ("কিছু নাম") দিয়ে আপনি প্রোফাইল সক্রিয় থাকাকালীন শুধুমাত্র ব্যবহারের জন্য একটি সম্পূর্ণ কনফিগারেশন ট্যাগ করতে পারেন। আপনার অ্যাপ্লিকেশন.প্রোপার্টি (বা। জিমল) ফাইলে আপনি স্প্রিং.প্রোফাইলস.একটিভ = কিছু নাম, ডিফল্ট সেট করতে পারেন ... পরিবেশের ভেরিয়েবলের ভিত্তিতে এটিকে গতিশীলভাবে সেট করতে, বসন্তের মান হিসাবে $ OM SOME_ENV_VAR} বাক্য গঠনটি ব্যবহার করুন। সক্রিয়। প্রোফাইল এবং পরিবেশ পরিবর্তনশীল সেট। বসন্ত এখন জাভা কনফিগারেশন ব্যবহার করার পরামর্শ দেয় - ডকসস.স্প্রিং.ইও
জ্যাক ভাইয়ার্স

কনফিগ ফাইলে প্রতিটি শিমকে পদ্ধতি হিসাবে সংজ্ঞায়িত করার বিকল্প কী?
আসিফ মোশতাক

@ আসিফ মুশতাক - আপনি স্বতঃ স্ক্যান বৈশিষ্ট্যটি ব্যবহার করতে পারেন এবং প্রতিটি শ্রেণি যা এই @Component @Serviceজাতীয় টিকা আছে তা স্বয়ংক্রিয়ভাবে শিমের মধ্যে পরিণত হবে (তবে এটি এই প্রশ্নের কেন্দ্রীভূত ছিল না)
আভি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.