শিমের সূচনা সম্পন্ন হওয়ার পরে কোনও পদ্ধতিটি কল করতে কীভাবে?


237

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

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

এটি কীভাবে সুন্দরভাবে করা যায়?

উত্তর:


196

আপনি এর মতো কিছু ব্যবহার করতে পারেন:

<beans>
    <bean id="myBean" class="..." init-method="init"/>
</beans>

শিমটি তাত্ক্ষণিকভাবে চালু করা হলে এটি "init" পদ্ধতি কল করবে।


15
পোস্টকন্সট্রাক্ট বেশিরভাগ ক্ষেত্রেই আরও ভাল হওয়া উচিত, যদিও আমরা বসন্ত শিমের আদিকরণের সাথে গণ্ডগোল করতে চাই না।
lwpro2

4
@ lwpro2 এখানে "বসন্ত শিম ইনিশিয়ালাইজেশন নিয়ে গণ্ডগোল করতে চান না" বলতে আপনার অর্থ কী?
ইয়াংভে স্নিন লিন্ডাল

@ মেরার ট্রেইস্ট এখানে ক্লাস অ্যাট্রিবিউটটির জন্য আমার কী দেওয়া উচিত? আমি কি এখানে নিয়ামক শ্রেণি দিতে পারি?
কেজেএজভা 48

314

অন্যান্য উত্তরগুলিতে @ পোষ্টকনস্ট্রাক্ট পরামর্শটি প্রসারিত করতে, আমার মতে এটিই সর্বোত্তম সমাধান।

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

9
ধন্যবাদ, এটি কাজ করে। দ্রষ্টব্য আপনি যদি বসন্তের সাথে ব্যবহার করতে চান তবে অবশ্যই অবশ্যই কমনঅনোটেশনবিয়ানপোস্টপ্রসেসর শিমটি (উপরে উল্লিখিত) নিবন্ধিত করতে "<প্রসঙ্গ: টিকা-কনফিগারেশন />" অন্তর্ভুক্ত করতে হবে
খাইলো

2
একটি উপযুক্ত <context:component-scan>এছাড়াও কাজ করে, এবং আপনার ক্লাসপাঠে বড় অ-স্প্রিং লাইব্রেরি থাকলে শুরু করার সময় হ্রাস করার জন্য কার্যকর হতে পারে।
ডোনাল ফেলো

5
পোস্টকন্সট্রাক্টের জন্য জাভাডোক বলেছে যে এটির সাথে ক্লাসে শুধুমাত্র একটি পদ্ধতিতে টীকা দেওয়া যেতে পারে: ডকস.অরাকল.com
অ্যান্ড্রু সোয়ান ২

@PostConstruct একটি লেনদেনজনিত ম্যানেজার সাথে কাজ করে না, দেখুন: forum.spring.io/forum/spring-projects/data/...
MMM

2
@ পোষ্টকন্সট্রাক্ট আপনার খুব বেশি কাজে আসবে না যখন আপনি যে শিমটি ইনস্ট্যান্ট করছেন তা আপনার নিজের শ্রেণি নয় তবে কিছু তৃতীয় পক্ষের শ্রেণি
জন রিক্স

102

রেফারেন্সে বর্ণিত হিসাবে বিবেচনা করার জন্য তিনটি পৃথক পদ্ধতি রয়েছে

Init-পদ্ধতি বৈশিষ্ট্যটি ব্যবহার করুন

পেশাদাররা:

  • একটি ইন্টারফেস বাস্তবায়নের জন্য শিমের প্রয়োজন হয় না।

কনস:

  • শিমটি সঠিকভাবে কনফিগার করা হয়েছে তা নিশ্চিত করার জন্য নির্মাণের পরে এই পদ্ধতির কোনও তাত্ক্ষণিক নির্দেশের প্রয়োজন নেই।

ইনিশিয়ালিংবিয়ান বাস্তবায়ন করুন

পেশাদাররা:

  • আর ডি-পদ্ধতি নির্দিষ্ট করার দরকার নেই, বা উপাদান স্ক্যানিং / টিকা প্রক্রিয়াকরণ চালু করার দরকার নেই।
  • একটি লাইব্রেরির সাথে সরবরাহ করা মটরশুটিগুলির জন্য উপযুক্ত, যেখানে আমরা এই লাইব্রেরিটি সিমের জীবনচক্রের সাথে নিজেকে উদ্বেগিত করতে চাই না।

কনস:

  • আর-পদ্ধতি পদ্ধতির চেয়ে আক্রমণাত্মক।

JSR-250 ব্যবহার করুন @PostConstruct lifecyle টীকা

পেশাদাররা:

  • মটরশুটিগুলি অটোডেটেক্ট করার জন্য উপাদান স্ক্যানিং ব্যবহার করার সময় দরকারী।
  • এটি পরিষ্কার করে দেয় যে সূচনা করার জন্য একটি নির্দিষ্ট পদ্ধতি ব্যবহার করা উচিত। উদ্দেশ্য কোড কাছাকাছি।

কনস:

  • সূচনাটি আর কনফিগারেশনে কেন্দ্রীয়ভাবে নির্দিষ্ট করা হয়নি।
  • আপনাকে অবশ্যই টিকা প্রক্রিয়াকরণ চালু করতে হবে (যা কখনও কখনও ভুলে যেতে পারে)

4
আমি মনে করি @PostConstructসঠিকভাবে ব্যবহার করা এটি আসলে একটি ভাল জিনিস কারণ এটি ক্লাসের একটি অংশ যা এর সূচনা প্রক্রিয়া শেষে শেষে কল করার পদ্ধতিটি প্রয়োজন।
ডোনাল ফেলো

যদি সেই শ্রেণীর সত্যই এটির প্রয়োজন হয় এবং আপনি কোড গন্ধ হিসাবে বিবেচনা না করে আপনি এটি নির্মাতায় না করতে পারেন।
ব্যবহারকারী 482745

39

আপনি বাস্তবায়নের চেষ্টা করেছেন InitializingBean? মনে হচ্ছে আপনি ঠিক কী পরে আছেন।

ক্ষতিটি হ'ল আপনার শিমটি স্প্রিং-সচেতন হয়ে ওঠে, তবে বেশিরভাগ অ্যাপ্লিকেশনগুলিতে এটি এতটা খারাপ নয়।


2
এক্সএমএল-তে একটি ইনিম-পদ্ধতি নির্দিষ্ট করার চেয়ে আপনি ইন্টারফেসটি প্রয়োগ করতে চান এমন কোনও কারণ আছে কি?
চিহ্নিত করুন

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

7
অলিভার আমাকে কিছু দুর্দান্ত অজুহাত দেয়, তবে সত্যই আমি কেবল আর-ডি-পদ্ধতিটি ভুলে গিয়েছিলাম :) অন্য একটি কারণ হ'ল টাইপটি নিজেই জানে যে সমস্ত বৈশিষ্ট্য নির্ধারিত হওয়ার পরে এটি "সমাপ্ত" হওয়া দরকার - এটি নয় মূলত এমন কিছু যা কনফিগারেশনে থাকা উচিত
জন স্কিটি

8

আপনি এটি করতে আপনার অ্যাপ্লিকেশন প্রসঙ্গে একটি কাস্টম বিয়ানপোস্টপ্রসেসর স্থাপন করতে পারেন। বা যদি আপনার শিমের মধ্যে একটি স্প্রিং ইন্টারফেস প্রয়োগ করতে আপনার আপত্তি না থাকে তবে আপনি আরিনালাইজিংবিয়ান ইন্টারফেস বা "init-পদ্ধতি" নির্দেশিকা (একই লিঙ্ক) ব্যবহার করতে পারেন ।


কীভাবে বিয়ানপোস্টপ্রসেসর লিখতে হয় তার বিশদ কি কারও কাছে রয়েছে। এটি আমার যা প্রয়োজন ঠিক তা মনে হচ্ছে। চিয়ার্স :)
শিখর

অনেক উদাহরণ সহ বসন্ত জাহাজ। বিয়ানপোস্টপ্রসেসরের জাভাডোক এপিআই দেখুন এবং আপনি অনেকগুলি প্রয়োগকারী ক্লাসের লিঙ্কগুলি খুঁজে পাবেন। তারপরে তাদের জন্য উত্স কোডটি দেখুন।
রব এইচ

-7

দুটি পদ্ধতির অর্থাত্ ব্যবহার সম্পর্কে কোনও বিভ্রান্তি আরও পরিস্কার করতে

  1. @PostConstruct এবং
  2. init-method="init"

ব্যক্তিগত অভিজ্ঞতা থেকে, আমি বুঝতে পারি যে (1) ব্যবহার করা কেবল একটি সার্লেট পাত্রে কাজ করে, যখন (2) কোনও পরিবেশে এমনকি ডেস্কটপ অ্যাপ্লিকেশনগুলিতেও কাজ করে। সুতরাং, আপনি যদি স্ট্যান্ডেলোন অ্যাপ্লিকেশনটিতে স্প্রিং ব্যবহার করে থাকেন তবে আপনাকে "2" ব্যবহার করতে হবে যে "আরম্ভের পরে এই পদ্ধতিটি কল করুন।


4
প্রযুক্তিগতভাবে, @PostConstruct(যখন একটি স্প্রিং-ভিত্তিক অ্যাপ্লিকেশন ব্যবহৃত হয়) নিজস্ব বসন্ত প্রসঙ্গে জীবনকাল বাঁধা হয়। এই জাতীয় প্রসঙ্গটি সমস্ত ধরণের অ্যাপ্লিকেশনগুলিতে ব্যবহার করা যেতে পারে।
ডোনাল ফেলো

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