স্প্রিং অ্যাপ্লিকেশন প্রসঙ্গে প্রাপ্তি


216

কোনও বসন্তের অ্যাপ্লিকেশনটিতে অ্যাপ্লিকেশন কনটেক্সটটির অনুলিপিটি স্থিতিশীল / বিশ্বব্যাপী অনুরোধ করার কোনও উপায় আছে কি?

মূল শ্রেণীটি ধরে নিয়ে অ্যাপ্লিকেশন প্রসঙ্গটি শুরু হয় এবং প্রারম্ভিক করে তোলে, কল স্ট্যাকের মাধ্যমে এটি প্রয়োজনীয় কোনও শ্রেণীর কাছে পৌঁছানোর দরকার নেই, বা পূর্বে তৈরি প্রসঙ্গটি জিজ্ঞাসা করার কোনও শ্রেণি আছে কি? (আমি ধরে নিলাম কোনটি সিঙ্গলটন হতে হবে?)

উত্তর:


171

ধারকটিতে অ্যাক্সেসের প্রয়োজন হওয়া কোনও জিনিসটি যদি ধারকটিতে শিম হয় তবে কেবল বিয়ানফ্যাক্টরিওয়্যার বা অ্যাপ্লিকেশনকন্টেক্সটওয়্যার বাস্তবায়ন করুন ইন্টারফেস করুন।

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


15
অ্যাপ্লিকেশনসন্টেক্সটস - অ্যাপ্লিকেশনকন্টেক্সটওয়্যারের জন্য আরও ভাল ইন্টারফেস রয়েছে। বিয়ানফ্যাক্টরিওয়্যারের কাজ করা উচিত তবে আপনার যদি অ্যাপ্লিকেশন প্রসঙ্গে কার্যকারিতা প্রয়োজন হয় তবে আপনাকে এটিকে অ্যাপ্লিকেশন প্রসঙ্গে ফেলে দিতে হবে।
MetroidFan2002

@ ডন কির্কবি সিঙ্গলটন প্যাটার্নটি ব্যবহার করার অর্থ আপনার ধারক শ্রেণীর অভ্যন্তরে স্থির পদ্ধতি থেকে আপনার ধারক শ্রেণিকে প্রবর্তন করা ... আপনি একবার "ম্যানুয়ালি" কোনও জিনিসকে বসন্ত দ্বারা পরিচালিত হয় না: আপনি কীভাবে এই সমস্যাটি মোকাবেলা করলেন?
আন্তোনিন

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

1
ধন্যবাদ ডন কার্কবি, একটি স্প্রিং সিঙ্গলটন নিজেই একটি স্থির রেফারেন্সের মালিক, সম্ভবত নন স্প্রিং অবজেক্টস দ্বারা এটি ব্যবহারযোগ্য।
আন্তোনিন

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

118

আপনি প্রয়োগ ApplicationContextAwareবা কেবল ব্যবহার করতে পারেন @Autowired:

public class SpringBean {
  @Autowired
  private ApplicationContext appContext;
}

SpringBeanApplicationContextইনজেকশন লাগবে , যার মধ্যে এই শিমটি তাত্ক্ষণিকভাবে প্রযোজ্য। উদাহরণস্বরূপ, যদি আপনার কাছে একটি সুন্দর মান প্রাসঙ্গিক শ্রেণিবদ্ধ সহ ওয়েব অ্যাপ্লিকেশন থাকে:

main application context <- (child) MVC context

এবং SpringBeanপ্রধান প্রসঙ্গে ঘোষণা করা হয়েছে, এটিতে মূল প্রসঙ্গটি ইনজেকশন দেওয়া হবে; অন্যথায়, যদি এটি এমভিসি প্রসঙ্গে ঘোষণা করা হয় তবে এটিতে এমভিসি কনটেক্সট ইনজেকশন থাকবে।


2
এটি একগুচ্ছকে সহায়তা করেছে। আমি স্প্রিং ২.০ সহ একটি পুরানো অ্যাপ্লিকেশনটির সাথে কিছু অদ্ভুত সমস্যা পেয়েছি এবং আপনার উত্তরটি একমাত্র উপায় যা আমি খুব সহজেই একক স্প্রিং আইওসি পাত্রে একক অ্যাপ্লিকেশন কনটেক্সট দিয়ে জিনিসগুলি কাজ করতে পারি get
স্টু থম্পসন

1
পাঠকগণ .. এই স্প্রিংবিয়ানটিকে আপনার স্প্রিংকনফিগ.এক্সএমএলকে শিম হিসাবে ঘোষণা করতে ভুলবেন না।
সুপারনোভা

এটি যদি ইতিমধ্যে বিন হয় এবং আমি অ্যাপ্লিকেশন.জেট অ্যাপ্লিকেশন কনটেক্সট () (একক প্যাটার্ন) ব্যবহার করি, যা নতুন XXXX অ্যাপ্লিকেশন কনটেক্সট (XXXX) এর উদাহরণ দেয়, কেন এটি কাজ করছে না? আমাকে কেন এটির ক্ষমতা দেওয়া দরকার?
জেসকি 14

আপনি ব্যবহার করতে পারেন @Injectখুব
আলিরেজা Fattahi

39

এখানে একটি দুর্দান্ত উপায় (আমার নয়, মূল উল্লেখটি এখানে: http://sujitpal.blogspot.com/2007/03/accessing-spring-beans-from-legacy-code.html

আমি এই পদ্ধতির ব্যবহার করেছি এবং এটি দুর্দান্ত কাজ করে। মূলত এটি একটি সাধারণ শিম যা প্রয়োগের প্রসঙ্গে একটি (স্থির) রেফারেন্স ধারণ করে। বসন্তের কনফিগারেশনে এটি সূচনা করে এটি শুরু করা হয়েছে।

আসল রেফটি একবার দেখুন, এটি খুব পরিষ্কার।


4
আপনি যদি getBeanকোনও ইউনিট পরীক্ষার সময় চলমান কোড থেকে কল করেন তবে এই পন্থাটি ব্যর্থ হতে পারে কারণ আপনি জিজ্ঞাসা করার আগে বসন্তের প্রসঙ্গটি সেট করা হবে না। এটির একটি দৌড় শর্তটি আমি এই পদ্ধতির সফলভাবে ব্যবহার করার 2 বছর পরে আজকের মধ্যে স্ল্যামাল করেছি।
এইচডিভ

আমি একই জিনিস চালাচ্ছি .. ইউনিট পরীক্ষা থেকে নয় একটি ডাটাবেস ট্রিগার থেকে .. কোনও পরামর্শ?
জন ডেভেলর

দুর্দান্ত প্রতিক্রিয়া। ধন্যবাদ.
সগনেতা

17

আমি বিশ্বাস করি আপনি সিঙ্গলটনবিয়ানফ্যাক্টরিলোকেটর ব্যবহার করতে পারেন । বিয়ানআরফফ্যাক্টরি.এক্সএমএল ফাইলটি আসল অ্যাপ্লিকেশন কনটেক্সট ধারণ করবে, এটি এরকম কিছু হবে:

<bean id="mainContext" class="org.springframework.context.support.ClassPathXmlApplicationContext">
     <constructor-arg>
        <list>
            <value>../applicationContext.xml</value>
        </list>
     </constructor-arg>
 </bean>

এবং অ্যাপ্লিকেশন কনটেক্সট থেকে যে কোনও জায়গা থেকে শিম পাওয়ার কোডটি এই জাতীয় কিছু হবে:

BeanFactoryLocator bfl = SingletonBeanFactoryLocator.getInstance();
BeanFactoryReference bf = bfl.useBeanFactory("mainContext");
SomeService someService = (SomeService) bf.getFactory().getBean("someService");

স্প্রিং টিম এই ক্লাস এবং ইয়াদায়দা ব্যবহারকে নিরুৎসাহিত করে, তবে আমি যেখানে এটি ব্যবহার করেছি সেখানে এটি আমার পক্ষে বেশ উপযুক্ত।


11

আপনি অন্য কোনও পরামর্শ কার্যকর করার আগে নিজেকে এই প্রশ্নগুলি জিজ্ঞাসা করুন ...

  • আমি কেন অ্যাপ্লিকেশন কনটেক্সট পেতে চেষ্টা করছি?
  • আমি কি কার্যকরভাবে অ্যাপ্লিকেশনটি একটি পরিষেবা লোকেটার হিসাবে ব্যবহার করছি?
  • আমি কি আদৌ অ্যাপ্লিকেশন কনটেক্সট অ্যাক্সেস এড়াতে পারি?

এই প্রশ্নের উত্তরগুলি নির্দিষ্ট ধরণের অ্যাপ্লিকেশনগুলিতে (ওয়েব অ্যাপ্লিকেশন, উদাহরণস্বরূপ) অন্যদের তুলনায় সহজ, তবে যাই হোক না কেন জিজ্ঞাসা করার মতো।

অ্যাপ্লিকেশন কনটেক্সট অ্যাক্সেস করা এক ধরণের পুরো নির্ভরতা ইনজেকশন নীতি লঙ্ঘন করে তবে কখনও কখনও আপনি খুব পছন্দ করেন না।


5
একটি ভাল উদাহরণ জেএসপি ট্যাগগুলি; তাদের তৈরিটি সার্লেট কন্টেইনার দ্বারা চালিত, সুতরাং স্থিতিশীলভাবে প্রসঙ্গটি গ্রহণ করা ছাড়া তাদের আর কোনও উপায় নেই। বসন্ত বেস ট্যাগ ক্লাস সরবরাহ করে এবং তারা প্রয়োজনীয় প্রসঙ্গগুলি পেতে বিয়ানফ্যাক্টরিলোকেটর ব্যবহার করে।
স্কাফম্যান

6

আপনি যদি কোনও ওয়েব-অ্যাপ ব্যবহার করেন তবে সার্লেটলেট ফিল্টার এবং থ্রেডলোকাল ব্যবহার করে সিলেটলেটন ব্যবহার না করে অ্যাপ্লিকেশন প্রসঙ্গে অ্যাক্সেস করার আরও একটি উপায়ও রয়েছে। ফিল্টারটিতে আপনি ওয়েব অ্যাপ্লিকেশনকন্টেক্সটুল ব্যবহার করে অ্যাপ্লিকেশন প্রসঙ্গে অ্যাক্সেস করতে পারেন এবং অ্যাপ্লিকেশন প্রসঙ্গ বা থিয়ডলোকলে প্রয়োজনীয় বিনগুলি সংরক্ষণ করতে পারেন।

সাবধানতা: আপনি যদি থ্রেডলোকলটি আনসেট করতে ভুলে যান তবে অ্যাপ্লিকেশনটি অনুলিপি করার চেষ্টা করার সময় আপনি দুষ্টু সমস্যায় পড়বেন! সুতরাং, আপনার এটি সেট করা উচিত এবং অবিলম্বে একটি চেষ্টা শুরু করা উচিত যা শেষভাগে থ্রেডলোকলকে আনসেট করে।

অবশ্যই, এটি এখনও একটি সিঙ্গলটন ব্যবহার করে: থ্রেডলোকাল। তবে আসল মটরশুটি আর হওয়ার দরকার নেই। এমনকি অনুরোধ-বাছাইও করা যেতে পারে, এবং EAR এর লাইবারিগুলির সাথে অ্যাপ্লিকেশনটিতে আপনার যদি একাধিক WARs থাকে তবে এই সমাধানটিও কার্যকর হয়। তবুও, আপনি থ্রেডলোকালের এই ব্যবহারটিকে প্লেইন সিঙ্গলটনের ব্যবহার হিসাবে খারাপ হিসাবে বিবেচনা করতে পারেন। ;-)

সম্ভবত বসন্ত ইতিমধ্যে একই সমাধান প্রদান করে? আমি একটি পাইনি, তবে আমি নিশ্চিতভাবে জানি না।


6
SpringApplicationContext.java

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 * Wrapper to always return a reference to the Spring Application 
Context from
 * within non-Spring enabled beans. Unlike Spring MVC's 
WebApplicationContextUtils
 * we do not need a reference to the Servlet context for this. All we need is
 * for this bean to be initialized during application startup.
 */
public class SpringApplicationContext implements 
ApplicationContextAware {

  private static ApplicationContext CONTEXT;

  /**
   * This method is called from within the ApplicationContext once it is 
   * done starting up, it will stick a reference to itself into this bean.
  * @param context a reference to the ApplicationContext.
  */
  public void setApplicationContext(ApplicationContext context) throws BeansException {
    CONTEXT = context;
  }

  /**
   * This is about the same as context.getBean("beanName"), except it has its
   * own static handle to the Spring context, so calling this method statically
   * will give access to the beans by name in the Spring application context.
   * As in the context.getBean("beanName") call, the caller must cast to the
   * appropriate target class. If the bean does not exist, then a Runtime error
   * will be thrown.
   * @param beanName the name of the bean to get.
   * @return an Object reference to the named bean.
   */
  public static Object getBean(String beanName) {
    return CONTEXT.getBean(beanName);
  }
}

সূত্র: http://sujitpal.blogspot.de/2007/03/accessing-spring-beans-from-legacy-code.html


5

কনটেক্সটসিংলেটটনবিয়ানফ্যাক্টরিলোকেটরটি একবার দেখুন । এটি স্প্রিং এর প্রসঙ্গগুলি ধরে রাখতে স্থির অ্যাক্সেসর সরবরাহ করে, ধরে নিই তারা নির্দিষ্ট উপায়ে নিবন্ধিত হয়েছে।

এটি সুন্দর নয় এবং সম্ভবত আপনি যা চান তার চেয়ে জটিল, তবে এটি কার্যকর হয়।


4

স্প্রিং অ্যাপ্লিকেশনটিতে আবেদনের প্রসঙ্গটি পাওয়ার অনেকগুলি উপায় রয়েছে। এগুলি বোকা দেওয়া হয়:

  1. অ্যাপ্লিকেশন কনটেক্সট অ্যাওয়ারের মাধ্যমে :

    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    
    public class AppContextProvider implements ApplicationContextAware {
    
    private ApplicationContext applicationContext;
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
    }

এখানে setApplicationContext(ApplicationContext applicationContext)পদ্ধতি আপনি অ্যাপ্লিকেশন কনটেক্সট পাবেন

অ্যাপ্লিকেশনসেক্সটওয়্যার :

ইন্টারফেসটি যে কোনও অবজেক্টের দ্বারা প্রয়োগ করা হবে যা অ্যাপ্লিকেশন কনটেক্সটটি এটিতে চালিত হয় সে সম্পর্কে অবহিত হতে চায় this এই ইন্টারফেসটি প্রয়োগ করা উদাহরণস্বরূপ যখন কোনও বস্তুর সহযোগী বিনের সেটগুলিতে অ্যাক্সেসের প্রয়োজন হয়।

  1. স্বীকৃত মাধ্যমে :

    @Autowired
    private ApplicationContext applicationContext;

এখানে @Autowiredকীওয়ার্ডটি অ্যাপ্লিকেশন কনটেক্সট সরবরাহ করবে। অটোওয়ার্ডে কিছু সমস্যা আছে। এটি ইউনিট-পরীক্ষার সময় সমস্যা তৈরি করবে।


3

নোট করুন যে বর্তমান থেকে কোনও রাজ্য সংরক্ষণ করে ApplicationContext, বা ApplicationContextনিজেই একটি স্ট্যাটিক ভেরিয়েবল - উদাহরণস্বরূপ সিঙ্গলটন প্যাটার্ন ব্যবহার করে - আপনি যদি স্প্রিং-টেস্ট ব্যবহার করেন তবে আপনি আপনার পরীক্ষাগুলি অস্থির এবং অনিশ্চিত করতে পারবেন। এটি কারণ কারণ স্প্রিং-পরীক্ষা একই JVM- এ অ্যাপ্লিকেশন প্রসঙ্গে পুনরায় ব্যবহার করে। উদাহরণ স্বরূপ:

  1. টেস্ট এ রান এবং এটিতে টীকাগুলি রয়েছে @ContextConfiguration({"classpath:foo.xml"})
  2. টেস্ট বি রান এবং এটিতে টীকাগুলি রয়েছে @ContextConfiguration({"classpath:foo.xml", "classpath:bar.xml})
  3. টেস্ট সি রান করুন এবং এটিতে টীকাগুলি রয়েছে @ContextConfiguration({"classpath:foo.xml"})

যখন টেস্ট এ রান হয়, একটি ApplicationContextতৈরি করা হয়, এবং কোনও মটরশুটি প্রয়োগ ApplicationContextAwareবা স্বায়ত্বকরণ ApplicationContextস্ট্যাটিক ভেরিয়েবলটিতে লিখতে পারে।

যখন টেস্ট বি একই জিনিস চালায় তখন ঘটে থাকে এবং স্ট্যাটিক ভেরিয়েবল এখন টেস্ট বি এর দিকে নির্দেশ করে ApplicationContext

যখন টেস্ট সি চালায়, টেস্ট এ থেকে কোনও মটরশুটি তৈরি করা হয় না TestContext(এবং এর মধ্যে ApplicationContext) টেস্ট এ থেকে পুনরায় ব্যবহার করা হয়। বর্তমানে আপনি একটি ApplicationContextপরীক্ষার জন্য মটরশুটি ধারণ করে তার চেয়ে অন্যটির দিকে ইঙ্গিত করে একটি স্থির পরিবর্তনশীল পেয়েছেন ।


1

এটি কতটা কার্যকর হবে তা নিশ্চিত নয় তবে আপনি অ্যাপটি শুরু করার সময় প্রসঙ্গটিও পেতে পারেন। এটি প্রসংগটি পেতে খুব শীঘ্রই, এটির আগেও @Autowire

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    private static ApplicationContext context;

    // I believe this only runs during an embedded Tomcat with `mvn spring-boot:run`. 
    // I don't believe it runs when deploying to Tomcat on AWS.
    public static void main(String[] args) {
        context = SpringApplication.run(Application.class, args);
        DataSource dataSource = context.getBean(javax.sql.DataSource.class);
        Logger.getLogger("Application").info("DATASOURCE = " + dataSource);

0

দয়া করে মনে রাখবেন; নীচের কোডটি ইতিমধ্যে লোড হওয়া ব্যবহারের পরিবর্তে নতুন অ্যাপ্লিকেশন প্রসঙ্গ তৈরি করবে।

private static final ApplicationContext context = 
               new ClassPathXmlApplicationContext("beans.xml");

এছাড়াও লক্ষ করুন যে যুদ্ধের অর্থের beans.xmlঅংশ হওয়া উচিত src/main/resourcesএটির একটি অংশ WEB_INF/classes, যেখানে প্রকৃত প্রয়োগটি applicationContext.xmlউল্লিখিত মাধ্যমে লোড করা হবে Web.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>META-INF/spring/applicationContext.xml</param-value>
</context-param>

কনস্ট্রাক্টরে পথ উল্লেখ করা মুশকিল । ফাইলটি সনাক্ত করতে সক্ষম হবে না।applicationContext.xmlClassPathXmlApplicationContextClassPathXmlApplicationContext("META-INF/spring/applicationContext.xml")

সুতরাং টীকাগুলি ব্যবহার করে বিদ্যমান অ্যাপ্লিকেশন কনটেক্সট ব্যবহার করা ভাল।

@Component
public class OperatorRequestHandlerFactory {

    public static ApplicationContext context;

    @Autowired
    public void setApplicationContext(ApplicationContext applicationContext) {
        context = applicationContext;
    }
}

0

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

আমি বিশেষজ্ঞ নই, তাই আমি সমালোচক, পর্যালোচনা এবং পরামর্শগুলির জন্য উন্মুক্ত:

https://gist.github.com/edpichler/9e22309a86b97dbd4cb1ffe011aa69dd

package com.company.web.spring

import com.company.jpa.spring.MyBusinessAppConfig
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.ApplicationContext
import org.springframework.context.annotation.AnnotationConfigApplicationContext
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Import
import org.springframework.stereotype.Component
import org.springframework.web.context.ContextLoader
import org.springframework.web.context.WebApplicationContext
import org.springframework.web.context.support.WebApplicationContextUtils
import javax.servlet.http.HttpServlet

@Configuration
@Import(value = [MyBusinessAppConfig::class])
@ComponentScan(basePackageClasses  = [SpringUtils::class])
open class WebAppConfig {
}

/**
 *
 * Singleton object to create (only if necessary), return and reuse a Spring Application Context.
 *
 * When you instantiates a class by yourself, spring context does not autowire its properties, but you can wire by yourself.
 * This class helps to find a context or create a new one, so you can wire properties inside objects that are not
 * created by Spring (e.g.: Servlets, usually created by the web server).
 *
 * Sometimes a SpringContext is created inside jUnit tests, or in the application server, or just manually. Independent
 * where it was created, I recommend you to configure your spring configuration to scan this SpringUtils package, so the 'springAppContext'
 * property will be used and autowired at the SpringUtils object the start of your spring context, and you will have just one instance of spring context public available.
 *
 *Ps: Even if your spring configuration doesn't include the SpringUtils @Component, it will works tto, but it will create a second Spring Context o your application.
 */
@Component
object SpringUtils {

        var springAppContext: ApplicationContext? = null
    @Autowired
    set(value) {
        field = value
    }



    /**
     * Tries to find and reuse the Application Spring Context. If none found, creates one and save for reuse.
     * @return returns a Spring Context.
     */
    fun ctx(): ApplicationContext {
        if (springAppContext!= null) {
            println("achou")
            return springAppContext as ApplicationContext;
        }

        //springcontext not autowired. Trying to find on the thread...
        val webContext = ContextLoader.getCurrentWebApplicationContext()
        if (webContext != null) {
            springAppContext = webContext;
            println("achou no servidor")
            return springAppContext as WebApplicationContext;
        }

        println("nao achou, vai criar")
        //None spring context found. Start creating a new one...
        val applicationContext = AnnotationConfigApplicationContext ( WebAppConfig::class.java )

        //saving the context for reusing next time
        springAppContext = applicationContext
        return applicationContext
    }

    /**
     * @return a Spring context of the WebApplication.
     * @param createNewWhenNotFound when true, creates a new Spring Context to return, when no one found in the ServletContext.
     * @param httpServlet the @WebServlet.
     */
    fun ctx(httpServlet: HttpServlet, createNewWhenNotFound: Boolean): ApplicationContext {
        try {
            val webContext = WebApplicationContextUtils.findWebApplicationContext(httpServlet.servletContext)
            if (webContext != null) {
                return webContext
            }
            if (createNewWhenNotFound) {
                //creates a new one
                return ctx()
            } else {
                throw NullPointerException("Cannot found a Spring Application Context.");
            }
        }catch (er: IllegalStateException){
            if (createNewWhenNotFound) {
                //creates a new one
                return ctx()
            }
            throw er;
        }
    }
}

এখন, একটি বসন্তের প্রসঙ্গটি সর্বজনীনভাবে উপলভ্য, জাভা সার্লেলে এই জাতীয় পদ্ধতিটিকে প্রাসঙ্গিক (জুনিট টেস্ট, মটরশুটি, ম্যানুয়ালি ইনস্ট্যান্টিয়েটেড ক্লাস) থেকে আলাদাভাবে কল করতে সক্ষম:

@WebServlet(name = "MyWebHook", value = "/WebHook")
public class MyWebServlet extends HttpServlet {


    private MyBean byBean
            = SpringUtils.INSTANCE.ctx(this, true).getBean(MyBean.class);


    public MyWebServlet() {

    }
}

0

নীচে হিসাবে স্প্রিং শিমে অটোয়ার করুন: @ প্রাইভেট এপ্লিকেশনকন্টেক্সট অ্যাপকন্টেক্সট;

আপনি অ্যাপ্লিকেশন কনটেক্সট বস্তু হবে।


0

পদ্ধতির 1: আপনি অ্যাপ্লিকেশন কনটেক্সটওয়্যার ইন্টারফেস প্রয়োগ করে অ্যাপিকেশনকন্টেক্সট ইনজেক্ট করতে পারেন। রেফারেন্স লিঙ্ক

@Component
public class ApplicationContextProvider implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    public ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

পদ্ধতির 2: বসন্ত পরিচালিত মটরশুটি যে কোনও মধ্যে অ্যাপ্লিকেশন প্রসঙ্গ স্বতঃশব্দ করুন।

@Component
public class SpringBean {
  @Autowired
  private ApplicationContext appContext;
}

রেফারেন্স লিঙ্ক

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