স্প্রিং কন্ট্রোলারে ইনস পদ্ধতি (টিকা সংস্করণ)


105

আমি একটি নিয়ামককে আরও নতুন টীকা সংস্করণে রূপান্তর করছি। পুরানো সংস্করণে আমি স্প্রিংমভিসি-সার্লেট.এক্সএমএলতে init পদ্ধতিটি নির্দিষ্ট করে ব্যবহার করেছি:

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

টিকা রচনা সংস্করণ ব্যবহার করে আমি কীভাবে init পদ্ধতিটি নির্দিষ্ট করতে পারি?


আরও দেখুন stackoverflow.com/questions/1088550
skaffman

উত্তর:


238

তুমি ব্যবহার করতে পার

@PostConstruct
public void init() {
   // ...
}

1
আপনি ঠিক বলেছেন, এটির "কমন টিকা 1.0", জাভা 1.7 কাজ করবে .7
গ্রিম

আপনার যদি সিকিউরিটি কনটেক্সটহোল্ডার থেকে ব্যবহারকারী ব্যবহারের প্রয়োজন হয় তবে পোস্টকন্সট্রাক্ট মুহুর্তে এটি আরম্ভ করা হয়নি। এটি স্টেটহীন পদ্ধতির মতো ব্যবহার করা দরকার। (getUser () ... Security সুরক্ষা ফিরিয়ে দিন ... ব্যবহারকারী ();}
জোয়াও পোলো

সরকারী বা বেসরকারী
আনশুলকত্ত

20

বিকল্পভাবে আপনি আপনার বর্গটি InitializingBeanকলব্যাক ফাংশন ( afterPropertiesSet()) সরবরাহ করতে ইন্টারফেসটি প্রয়োগ করতে পারেন যা শিমটি তৈরি হওয়ার পরে অ্যাপ্লিকেশন কনটেক্সট আবেদন করবে।


4

বসন্তে প্রারম্ভিককরণ প্রক্রিয়াটি বন্ধ করার বিভিন্ন উপায় রয়েছে। যদি আপনাকে সমস্ত মটরশুটি শুরু করতে হয় এবং সেগুলি স্বতঃশক্তি / ইনজেকশন দিতে হয় তবে কমপক্ষে দুটি উপায় আছে যা আমি জানি এটি এটি নিশ্চিত করবে। আমি কেবল দ্বিতীয়টি পরীক্ষা করেছি তবে আমি উভয়কেই একইভাবে কাজ করতে পারি।

আপনি যদি @ বিয়ান ব্যবহার করছেন তবে আপনি initMethod এর মাধ্যমে রেফারেন্স করতে পারেন।

@Configuration
public class BeanConfiguration {

  @Bean(initMethod="init")
  public BeanA beanA() {
    return new BeanA();
  }
}

public class BeanA {

  // method to be initialized after context is ready
  public void init() {
  }

} 

আপনি যদি @ সংযোগকারী ব্যবহার করে থাকেন তবে আপনি এই জাতীয় @ ইভেন্টলাইস্টেনারের মাধ্যমে মন্তব্য করতে পারেন।

@Component
public class BeanB {

  @EventListener
  public void onApplicationEvent(ContextRefreshedEvent event) {
  }
}

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

একে অপরের উপর নির্ভরশীলতার সাথে আমার দুটি ক্লাস (@ কম্পোনেন্ট) রয়েছে। এই উদাহরণগুলির উদ্দেশ্যগুলির মধ্যে কেবলমাত্র তাদের মধ্যে একটি প্রদর্শন করার জন্য ক্লাসগুলি একই দেখায়।

@Component
public class BeanA implements InitializingBean {
  private BeanB beanB;

  public BeanA() {
    log.debug("Created...");
  }

  @PostConstruct
  private void postConstruct() {
    log.debug("@PostConstruct");
  }

  @Autowired
  public void setBeanB(BeanB beanB) {
    log.debug("@Autowired beanB");
    this.beanB = beanB;
  }

  @Override
  public void afterPropertiesSet() throws Exception {
    log.debug("afterPropertiesSet()");
  }

  @EventListener
  public void onApplicationEvent(ContextRefreshedEvent event) {
    log.debug("@EventListener");
  } 
}

কনটেইনারটি শুরু হওয়ার পরে এটি কলগুলির ক্রমানুসারে লগ আউটপুট।

2018-11-30 18:29:30.504 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : Created...
2018-11-30 18:29:30.509 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : Created...
2018-11-30 18:29:30.517 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : @Autowired beanA
2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : @PostConstruct
2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : afterPropertiesSet()
2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : @Autowired beanB
2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : @PostConstruct
2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : afterPropertiesSet()
2018-11-30 18:29:30.607 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : @EventListener
2018-11-30 18:29:30.607 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : @EventListener

আপনি দেখতে পাবেন যে সমস্ত কিছু প্রস্তুত এবং কনফিগার করার পরে @EventListener সর্বশেষে চালিত হয়।


-2
public class InitHelloWorld implements BeanPostProcessor {

   public Object postProcessBeforeInitialization(Object bean,
             String beanName) throws BeansException {
       System.out.println("BeforeInitialization : " + beanName);
       return bean;  // you can return any other object as well
   }

   public Object postProcessAfterInitialization(Object bean,
             String beanName) throws BeansException {
       System.out.println("AfterInitialization : " + beanName);
       return bean;  // you can return any other object as well
   }

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