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


102

আমি জানতে আগ্রহী যে স্প্রিং ইনজেকশনটি @Beanটীকা সহ কল ​​করার পদ্ধতিগুলি কীভাবে পরিচালনা করে । যদি আমি @Beanকোনও পদ্ধতিতে টীকাগুলি রেখেছি এবং একটি উদাহরণ ফিরে পাই তবে আমি বুঝতে পারি যে পদ্ধতিটি কল করে এবং ফিরে আসা উদাহরণটি পেয়ে সিম তৈরি করতে বসন্তকে বলে। যাইহোক, কখনও কখনও সেই শিমটি অন্য মটরশুটিগুলি তারের জন্য ব্যবহার করতে হয় বা অন্য কোড সেটআপ করতে হয়। এটি করার স্বাভাবিক @Beanউপায়টি হ'ল উদাহরণ পাওয়ার জন্য টীকাগুলি কল করা । আমার প্রশ্ন হল, কেন এটি শিমের চারপাশে ভাসমান একাধিক ঘটনা ঘটায় না?

উদাহরণস্বরূপ, নীচের কোডটি দেখুন (অন্য প্রশ্ন থেকে নেওয়া)। entryPoint()পদ্ধতি সঙ্গে সটীক হয় @Bean, তাই আমি কল্পনা বসন্ত একটি নতুন দৃষ্টান্ত তৈরি করবে হবে BasicAuthenticationEntryPointএকটি শিম হিসাবে। তারপরে, আমরা entryPoint()আবার কনফিগার ব্লকে কল করি , তবে এটি entryPoint()শিমের উদাহরণটি ফেরত দেওয়ার মতো বলে মনে হয় এবং একাধিকবার বলা হয় না (আমি লগিংয়ের চেষ্টা করেছি এবং কেবল একটি লগ এন্ট্রি পেয়েছি)। সম্ভাব্যভাবে আমরা entryPoint()কনফিগারেশনের অন্যান্য অংশগুলিতে একাধিকবার কল করতে পারি এবং আমরা সর্বদা একই উদাহরণ পাই। আমার বোঝার বিষয়টি কি সঠিক? বসন্ত কি কিছু যাদুবিদ্যার সাথে টীকাবিহীন রচনা লিখন করে @Bean?

@Bean
public BasicAuthenticationEntryPoint entryPoint() {
    BasicAuthenticationEntryPoint basicAuthEntryPoint = new BasicAuthenticationEntryPoint();
    basicAuthEntryPoint.setRealmName("My Realm");
    return basicAuthEntryPoint;
}

@Override
protected void configure(HttpSecurity http) throws Exception {

    http
        .exceptionHandling()
            .authenticationEntryPoint(entryPoint())
            .and()
        .authorizeUrls()
            .anyRequest().authenticated()
            .and()
        .httpBasic();       
}

উত্তর:


134

হ্যাঁ, বসন্ত কিছু জাদু করেস্প্রিং ডক্স পরীক্ষা করুন :

এখানেই যাদুটি আসে: সিজিএলআইবি@Configuration -র সাথে স্টার্টআপ-সময়ে সমস্ত ক্লাস সাবক্ল্যাসড হয় । সাবক্লাসে, শিশু পদ্ধতিটি যে কোনও ক্যাশেড (স্কোপড) শিমের জন্য প্যারেন্ট পদ্ধতিটি কল করার আগে এবং একটি নতুন উদাহরণ তৈরি করার আগে প্রথমে ধারকটি পরীক্ষা করে।

এর অর্থ হ'ল @Beanপদ্ধতিগুলিতে কলগুলি সিজিএলআইবি এর মাধ্যমে প্রক্সি করা হয় এবং সেই কারণে শিমের ক্যাশেড সংস্করণটি ফিরে আসে (একটি নতুন তৈরি হয় না)।

এর ডিফল্ট স্কোপটি @Beanহ'ল SINGLETON, যদি আপনি কোনও আলাদা স্কোপ নির্দিষ্ট করে থাকেন যেমন PROTOTYPEকলটি আসল পদ্ধতিতে চলে যাবে।

দয়া করে মনে রাখবেন যে এটি স্থির পদ্ধতিগুলির জন্য বৈধ নয় । বসন্তের ডক্স অনুসারে:

প্রযুক্তিগত সীমাবদ্ধতার কারণে স্থির @Beanপদ্ধতিতে কলগুলি কখনই ধারক দ্বারা বাধা পায় না, এমনকি @Configurationক্লাসের মধ্যেও নয় (এই বিভাগে পূর্বে বর্ণিত): সিজিআইএলআইবি সাবক্লাসিং কেবল অ স্থির পদ্ধতিগুলিকে ওভাররাইড করতে পারে। ফলস্বরূপ, অন্য @Beanপদ্ধতির সরাসরি কলটিতে স্ট্যান্ডার্ড জাভা শব্দার্থক শব্দ রয়েছে, যার ফলস্বরূপ কারখানার পদ্ধতি থেকে সরাসরি একটি স্বতন্ত্র উদাহরণ ফিরে আসে।


শিমগুলি এভাবে তৈরি করা কী ওভাররাইড করা সম্ভব? উদাহরণস্বরূপ, আমার কাছে একটি স্প্রিং সংজ্ঞায়িত শ্রেণি রয়েছে যা সরাসরি শিম তৈরির পদ্ধতিতে কল করে। আমি যা চাই তা হল যে পদ্ধতিটি দ্বারা তৈরি শিমটি ব্যবহৃত হয় না, তবে একটি আমি নিজের সংজ্ঞায়িত করে (এটি দিয়ে @Beanএবং এর মাধ্যমে মন্তব্য করে @Primary)।
Fons

4
তবে আমি আরও স্মরণ করি যে প্রক্সি (jdk বা CGLIB, যে কোনও) স্ব-অনুরোধে কাজ করতে পারে না, সুতরাং @ কনফিগারেশন কীভাবে আন্ত-শিম নির্ভরতা নির্ধারণ করে? এটি হুবহু স্ব-অনুরোধ ব্যবহার করে
21:25

4
@ নওহ CGLib allows us to create proxy classes at runtime by creating sub class of specified class using Byte code generation. CGLib proxies are used in the case where Proxy is to be created for those class which does not have any interfaces or have methods which are not declared in the implementing interface. এই ক্ষেত্রে, সিজিএলআইবি @ কনফিগারেশন ক্লাসের সাবক্লাস তৈরি করে এবং এর পদ্ধতিগুলিকে ওভাররাইড করে (@ বিয়ান পদ্ধতি সহ)। সুতরাং, আমরা যখন অন্য পদ্ধতি থেকে @ বিয়ান পদ্ধতিতে কল করি তখন আমরা প্রকৃতপক্ষে এর ওভারডিডেন সংস্করণটিকে কল করি (জাভা গতিশীল বাঁধাইয়ের জন্য ধন্যবাদ)।
ফ্লেম 239

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