@PostConstruct
টীকাটি ব্যবহার করে init-method
এবং স্প্রিং এক্সএমএল কনফিগারেশনের মতো একই পদ্ধতি ঘোষণার মধ্যে কোনও পার্থক্য রয়েছে কি ?
উত্তর:
কোন ব্যবহারিকভাবে আমি মনে করি না যে কোনও পার্থক্য আছে তবে তারা যেভাবে কাজ করে তাতে অগ্রাধিকার রয়েছে। @PostConstruct
, init-method
বিয়ানপোস্টপ্রসেসরগুলি ors
@PostConstruct
একটি জেএসআর-250 টীকাটি যখন init-method
স্প্রিংয়ের সূচনা পদ্ধতির পদ্ধতি।@PostConstruct
পদ্ধতি থাকে তবে প্রাথমিক পদ্ধতিগুলি বলার আগে এটি প্রথমে বলা হবে।afterPropertiesSet
, প্রথমে @PostConstruct
তাকে বলা হয়, তারপরে afterPropertiesSet
এবং তারপরে init-method
।আরও তথ্যের জন্য আপনি বসন্তের রেফারেন্স ডকুমেন্টেশন চেক করতে পারেন ।
জেএসআর 250 স্পাকের আগে, এক্সএমএলে আর্ট-পদ্ধতির ব্যবহারকে অগ্রাধিকার দেওয়া ছিল, যেহেতু এটি কোনও বসন্ত নির্দিষ্ট শ্রেণি / টীকা থেকে জাভা ক্লাসগুলি (মটরশুটি )কে ডিকুয়াল করে o তারপরে আরম্ভ-পদ্ধতির ব্যবহারকে অগ্রাধিকার দেওয়া হয়েছিল D সময় চলাকালীন পদ্ধতি আপনি সেই পদ্ধতিটি নির্দিষ্ট করতে পারেন যা প্রাথমিককরণ পদ্ধতি হিসাবে পরিচিত।
এখন জাভা ইইতে জেএসআর 250 টি চশমা এবং এই টীকাগুলির বসন্ত সমর্থন প্রবর্তনের সাথে, বসন্ত কাঠামোর উপর নির্ভরতা একটি নির্দিষ্ট পরিমাণে হ্রাস পেয়েছে।
তবে আমাকে স্বীকার করতে হবে যে এই বিষয়গুলির সংযোজনটি কোডের পঠনযোগ্যতা বৃদ্ধি করে pros
কোন বাস্তব পার্থক্য নেই। আপনি কীভাবে আপনার সিস্টেমটি কনফিগার করতে পছন্দ করেন এটি নীচে এবং এটি ব্যক্তিগত পছন্দের বিষয়। নিজেই, আমি @PostConstruct
আমার নিজের কোডের জন্য টীকাগুলি ব্যবহার করতে পছন্দ করি (শিমটি পদ্ধতিটি বলার পরে কেবল সঠিকভাবে কনফিগার করা হয়েছে) এবং init-method
নন-স্প্রিং-সচেতন লাইব্রেরি থেকে শিম ইনস্ট্যান্ট করার সময় আমি ব্যবহার করি (অবশ্যই সেখানে টীকা প্রয়োগ করতে পারবেন না!) তবে আমি পুরোপুরি বুঝতে পারি লোকেরা এটি সমস্তভাবে বা অন্যভাবে করতে চায়।
@ পোস্টকনস্ট্রাক্ট বসন্তের অংশ নয়। এটি জাভ্যাক্স প্যাকেজের অংশ। দুটোই এক। আরম্ভ-পদ্ধতিটি ব্যবহার করে আমাদের এক্সএমএল ফাইলে যুক্ত করা দরকার you আপনি যদি @ পোষ্টকন্সট্রাক্ট এক্সএমএল যোগ করার প্রয়োজন হয় না। নীচের নিবন্ধটি দেখুন।
যেমন আপনি সিম ক্রিয়েশন লাইফ-সাইকেল কলব্যাকের নীচের চিত্রটিতে দেখতে পাচ্ছেন ।
এই 3 পদক্ষেপটি বিন ক্রিয়েশন লাইফ-সাইকেল কলব্যাকে ঘটে:
@PostConstruct
বলা হবে।InitializingBean
বাস্তবায়ন করা হয়, তবে afterPropertiesSet()
ডাকা হবে।init-method
বা @Bean(initmethod="..")
তারপরে এটি init পদ্ধতি কল করে।এই চিত্রটি স্প্রিং 5 থেকে: স্প্রিং ফ্রেমওয়ার্ক এবং এর সরঞ্জামগুলির জন্য একটি অন্তঃস্থলীয় গাইড
এর মধ্যে পার্থক্য থাকতে পারে@PostConstruct
এবং init-method
কারণ শিম আদিকরণের পদ্ধতি ( পদ্ধতি) দ্বারা @PostConstruct
পরিচালিত হয় , যখন পদ্ধতিটি ফেজ শেষ হওয়ার পরে বলা হয় (এবং, এই বিষয়টির জন্য, পর্ব শুরুর আগে )। সম্পাদনা : সুতরাং, ক্রমটি হল: 1) ফেজ, 2) পদ্ধতিটি বলা হয়, 3) পর্ব, যা পদ্ধতি কল করেpostProcessAfterInitialization
AbstractAutowireCapableBeanFactory.initializeBean()
CommonAnnotationBeanPostProcessor
init
postProcessBeforeInitialization
postProcessAfterInitialization
postProcessBeforeInitialization
init
postProcessAfterInitialization
@PostConstruct
(পার্শ্ব নোট হিসাবে, গৃহীত উত্তর থেকে একটি বিবৃতি
@ পোস্টকনস্ট্রাক্ট, আরআর-পদ্ধতি হ'ল বিয়ানপোস্টপ্রসেসর
পুরোপুরি সঠিক নয়: @PostConstruct
একটি দ্বারা পরিচালিত হয় BeanPostProcessor
, init
পদ্ধতিটি নয়))
সেখানে থাকবে পার্থক্য যদি কিছু (সম্ভাব্য কাস্টম) BeanPostProcessor
, যা এর মাধ্যমে কনফিগার করা হয় ( Ordered.getOrder()
) এর পর নিষ্পন্ন করা হবে CommonAnnotationBeanPostProcessor
, কিছু তার গুরুতর করছে postProcessBeforeInitialization
পদ্ধতি।
সেখানে নেই ডিফল্ট স্প্রিং কনফিগারেশন সঙ্গে কোনো পার্থক্য BeanPostProcessors
কারণ সব BeanPostProcessors
পরে যা নিষ্পন্ন করা হবে কনফিগার করা হয় CommonAnnotationBeanPostProcessor
, এ কিছু করবেন না postProcessBeforeInitialization
পদ্ধতি।
উপসংহারে, গৃহীত উত্তর এবং অনুরূপগুলি সঠিক ... 99% ক্ষেত্রে, এবং এই পোস্টটি কেবল "শয়তানের বিবরণে আছে" একটি ধারণার প্রতি শ্রদ্ধা জানাতেই
এখানে সম্পূর্ণ কোড: https://github.com/wkaczurba/so8519187 ( বসন্ত-বুট )
টিকা ব্যবহার করে:
@Slf4j
@Component
public class MyComponent implements InitializingBean {
@Value("${mycomponent.value:Magic}")
public String value;
public MyComponent() {
log.info("MyComponent in constructor: [{}]", value); // (0) displays: Null
}
@PostConstruct
public void postConstruct() {
log.info("MyComponent in postConstruct: [{}]", value); // (1) displays: Magic
}
@Override // init-method; overrides InitializingBean.afterPropertiesSet()
public void afterPropertiesSet() {
log.info("MyComponent in afterPropertiesSet: [{}]", value); // (2) displays: Magic
}
@PreDestroy
public void preDestroy() {
log.info("MyComponent in preDestroy: [{}]", value); // (3) displays: Magic
}
}
আমাদের পায়:
Org.springframework.context রিফ্রেশ করা হচ্ছে ...
কনস্ট্রাক্টরে মাই কম্পোম্পোনেন্ট: [নাল]
পোস্টকন্সট্রাক্টে মাই কম্পোম্পোনেন্ট: [ম্যাজিক]
মাই কমম্পোনেন্ট অফ আফটার প্রোপার্টিসেট: [ম্যাজিক]
...
স্টার্টআপে জেএমএক্স এক্সপোজারের জন্য শিমের রেজিস্ট্রেশন
0.561 সেকেন্ডে ডেমো অ্যাপ্লিকেশন শুরু হয়েছে (জেভিএম 1.011-এ চলছে)
বন্ধ হচ্ছে org.springframework.conte .. । শাটডাউনে জেএমএক্স-এক্সপোজড মটরশুটিগুলি নিবন্ধভুক্ত করা হচ্ছে
...
প্রিডস্ট্রয়ে মাই কম্পোম্পোন্ট: [যাদু]