বসন্ত @ পোষ্টকনস্ট্রাক্ট বনাম সূচনা-পদ্ধতি বৈশিষ্ট্য


107

@PostConstructটীকাটি ব্যবহার করে init-methodএবং স্প্রিং এক্সএমএল কনফিগারেশনের মতো একই পদ্ধতি ঘোষণার মধ্যে কোনও পার্থক্য রয়েছে কি ?

উত্তর:


158

কোন ব্যবহারিকভাবে আমি মনে করি না যে কোনও পার্থক্য আছে তবে তারা যেভাবে কাজ করে তাতে অগ্রাধিকার রয়েছে। @PostConstruct, init-methodবিয়ানপোস্টপ্রসেসরগুলি ors

  1. @PostConstructএকটি জেএসআর-250 টীকাটি যখন init-methodস্প্রিংয়ের সূচনা পদ্ধতির পদ্ধতি।
  2. আপনার যদি কোনও @PostConstructপদ্ধতি থাকে তবে প্রাথমিক পদ্ধতিগুলি বলার আগে এটি প্রথমে বলা হবে।
  3. যদি আপনার শিম ইনিশিয়ালিং বিয়ান এবং ওভাররাইডগুলি প্রয়োগ করে afterPropertiesSet, প্রথমে @PostConstructতাকে বলা হয়, তারপরে afterPropertiesSetএবং তারপরে init-method

আরও তথ্যের জন্য আপনি বসন্তের রেফারেন্স ডকুমেন্টেশন চেক করতে পারেন ।

জেএসআর 250 স্পাকের আগে, এক্সএমএলে আর্ট-পদ্ধতির ব্যবহারকে অগ্রাধিকার দেওয়া ছিল, যেহেতু এটি কোনও বসন্ত নির্দিষ্ট শ্রেণি / টীকা থেকে জাভা ক্লাসগুলি (মটরশুটি )কে ডিকুয়াল করে o তারপরে আরম্ভ-পদ্ধতির ব্যবহারকে অগ্রাধিকার দেওয়া হয়েছিল D সময় চলাকালীন পদ্ধতি আপনি সেই পদ্ধতিটি নির্দিষ্ট করতে পারেন যা প্রাথমিককরণ পদ্ধতি হিসাবে পরিচিত।

এখন জাভা ইইতে জেএসআর 250 টি চশমা এবং এই টীকাগুলির বসন্ত সমর্থন প্রবর্তনের সাথে, বসন্ত কাঠামোর উপর নির্ভরতা একটি নির্দিষ্ট পরিমাণে হ্রাস পেয়েছে।

তবে আমাকে স্বীকার করতে হবে যে এই বিষয়গুলির সংযোজনটি কোডের পঠনযোগ্যতা বৃদ্ধি করে pros


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

4
@ ডোনাল বেশ সত্য। এটি কীভাবে কাজ করে সে সম্পর্কে কেবল তথ্য সরবরাহ করছিল।
অরবিন্দ এ

4
আছে: একটি গুরুত্বপূর্ণ পার্থক্য আছে: আপনি প্রক্রিয়া টীকা বিশেষভাবে কনফিগার স্প্রিং প্রয়োজন @PostConstruct কাজ করতে stackoverflow.com/q/3434377/134898
জুয়ান Calero

@ ডোনালফেলোস, তবে আপনি যদি শংসাপত্রের পরীক্ষা দেওয়ার পরিকল্পনা করেন তবে আপনার এটি জানতে হবে;)
এস ক্লেচকভস্কি

@ ডোনালফেলো - আপনার উত্তরটি বিস্তারিতভাবে বর্ণনা করতে পারেন? আমি বলতে চাইছি যদি শিমটি শুরু করার আদেশের উপর নির্ভর করে তবে difficulties আসলে আমি কোনটি আরও ভাল তা জানতে চাই। কোনও অনুরোধ পরিবেশন করার আগে শিম থেকে কিছু শুরু করার জন্য পোস্ট কনস্ট্রাক্ট বা শিম (initMethod = "init")?
আয়াসকান্ত

19

কোন বাস্তব পার্থক্য নেই। আপনি কীভাবে আপনার সিস্টেমটি কনফিগার করতে পছন্দ করেন এটি নীচে এবং এটি ব্যক্তিগত পছন্দের বিষয়। নিজেই, আমি @PostConstructআমার নিজের কোডের জন্য টীকাগুলি ব্যবহার করতে পছন্দ করি (শিমটি পদ্ধতিটি বলার পরে কেবল সঠিকভাবে কনফিগার করা হয়েছে) এবং init-methodনন-স্প্রিং-সচেতন লাইব্রেরি থেকে শিম ইনস্ট্যান্ট করার সময় আমি ব্যবহার করি (অবশ্যই সেখানে টীকা প্রয়োগ করতে পারবেন না!) তবে আমি পুরোপুরি বুঝতে পারি লোকেরা এটি সমস্তভাবে বা অন্যভাবে করতে চায়।


4

@ পোস্টকনস্ট্রাক্ট বসন্তের অংশ নয়। এটি জাভ্যাক্স প্যাকেজের অংশ। দুটোই এক। আরম্ভ-পদ্ধতিটি ব্যবহার করে আমাদের এক্সএমএল ফাইলে যুক্ত করা দরকার you আপনি যদি @ পোষ্টকন্সট্রাক্ট এক্সএমএল যোগ করার প্রয়োজন হয় না। নীচের নিবন্ধটি দেখুন।

http://answersz.com/spring-postconstruct-and-predestroy/


4

যেমন আপনি সিম ক্রিয়েশন লাইফ-সাইকেল কলব্যাকের নীচের চিত্রটিতে দেখতে পাচ্ছেন ।

বিন ক্রিয়েশন লাইফ-সাইকেল কলব্যাক

এই 3 পদক্ষেপটি বিন ক্রিয়েশন লাইফ-সাইকেল কলব্যাকে ঘটে:

  1. বলা আছে যে, @PostConstructবলা হবে।
  2. যদি InitializingBeanবাস্তবায়ন করা হয়, তবে afterPropertiesSet()ডাকা হবে।
  3. যদি বিনের সংজ্ঞা থাকে init-methodবা @Bean(initmethod="..")তারপরে এটি init পদ্ধতি কল করে।

এই চিত্রটি স্প্রিং 5 থেকে: স্প্রিং ফ্রেমওয়ার্ক এবং এর সরঞ্জামগুলির জন্য একটি অন্তঃস্থলীয় গাইড


3

এর মধ্যে পার্থক্য থাকতে পারে@PostConstruct এবং init-methodকারণ শিম আদিকরণের পদ্ধতি ( পদ্ধতি) দ্বারা @PostConstructপরিচালিত হয় , যখন পদ্ধতিটি ফেজ শেষ হওয়ার পরে বলা হয় (এবং, এই বিষয়টির জন্য, পর্ব শুরুর আগে )। সম্পাদনা : সুতরাং, ক্রমটি হল: 1) ফেজ, 2) পদ্ধতিটি বলা হয়, 3) পর্ব, যা পদ্ধতি কল করেpostProcessAfterInitializationAbstractAutowireCapableBeanFactory.initializeBean()CommonAnnotationBeanPostProcessorinitpostProcessBeforeInitializationpostProcessAfterInitialization
postProcessBeforeInitializationinitpostProcessAfterInitialization@PostConstruct

(পার্শ্ব নোট হিসাবে, গৃহীত উত্তর থেকে একটি বিবৃতি

@ পোস্টকনস্ট্রাক্ট, আরআর-পদ্ধতি হ'ল বিয়ানপোস্টপ্রসেসর

পুরোপুরি সঠিক নয়: @PostConstructএকটি দ্বারা পরিচালিত হয় BeanPostProcessor, initপদ্ধতিটি নয়))

সেখানে থাকবে পার্থক্য যদি কিছু (সম্ভাব্য কাস্টম) BeanPostProcessor, যা এর মাধ্যমে কনফিগার করা হয় ( Ordered.getOrder()) এর পর নিষ্পন্ন করা হবে CommonAnnotationBeanPostProcessor, কিছু তার গুরুতর করছে postProcessBeforeInitializationপদ্ধতি।
সেখানে নেই ডিফল্ট স্প্রিং কনফিগারেশন সঙ্গে কোনো পার্থক্য BeanPostProcessorsকারণ সব BeanPostProcessorsপরে যা নিষ্পন্ন করা হবে কনফিগার করা হয় CommonAnnotationBeanPostProcessor, এ কিছু করবেন না postProcessBeforeInitializationপদ্ধতি।

উপসংহারে, গৃহীত উত্তর এবং অনুরূপগুলি সঠিক ... 99% ক্ষেত্রে, এবং এই পোস্টটি কেবল "শয়তানের বিবরণে আছে" একটি ধারণার প্রতি শ্রদ্ধা জানাতেই


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

@ ম্যাক্সরন্নার, বিভ্রান্তির জন্য দুঃখিত এবং জানার জন্য অনেক ধন্যবাদ! আসলে, আমি কখনও বলতে চাইনি যে পোস্টকন্সট্রাক্ট আর-ইন-পদ্ধতির আগে চলে। যাইহোক, আমি কিছু স্পষ্টতা দিয়ে আমার উত্তর আপডেট করেছি
igor.zh

2

এখানে সম্পূর্ণ কোড: 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 .. । শাটডাউনে জেএমএক্স-এক্সপোজড মটরশুটিগুলি নিবন্ধভুক্ত করা হচ্ছে

...
প্রিডস্ট্রয়ে মাই কম্পোম্পোন্ট: [যাদু]

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