বসন্তে বর্তমান অ্যাপ্লিকেশন কনটেক্সট পান


105

আমি আমার ওয়েব অ্যাপ্লিকেশনটির জন্য স্প্রিং এমভিসি ব্যবহার করছি। আমার মটরশুটি spring-servlet.xmlফাইল " " লেখা আছে

এখন আমার একটি ক্লাস রয়েছে MyClassএবং আমি স্প্রিং শিম ব্যবহার করে এই শ্রেণিতে অ্যাক্সেস করতে চাই

ইন spring-servlet.xmlআমি লিখেছি নিম্নলিখিত

<bean id="myClass" class="com.lynas.MyClass" />

এখন আমার এটি ব্যবহার করে অ্যাক্সেস করা দরকার ApplicationContext

ApplicationContext context = ??

যাতে আমি করতে পারি

MyClass myClass = (MyClass) context.getBean("myClass");

কিভাবে এই কাজ করতে??


3
@ অনুমোদিত মাইক্লাস মাই ক্লাসটি কাজটি করা উচিত!
মানেকেনপিক্স

উত্তর:


160

কেবল এটি ইনজেক্ট করুন ..

@Autowired
private ApplicationContext appContext;

বা এই ইন্টারফেসটি প্রয়োগ করুন: অ্যাপ্লিকেশনকন্টেক্সটওয়্যার


হয়তো এই কাজ করতে পারেন: stackoverflow.com/questions/11682858/...
gipinani

নিম্নলিখিত ApplicationContextProvider.javaউত্তর এটির জন্য সবচেয়ে নির্ভরযোগ্য সমাধান বলে মনে হচ্ছে।
আয়নুত

1
এটি প্রতিবারই নাল ফেরায় returning এখানে উল্লেখ করার জন্য যে আমি এটি একটি সাধারণ ক্লাসের মধ্যে করছি যা "@RestController" বা "@ কম্পোনেন্ট" নয়
শাহ

1
স্প্রিং ডকুমেন্টেশন অনুসারে, কিছু সমস্যার কারণে @ অটোভায়ার্ড এড়ানো ভাল। স্প্রিং.আইও / বোঝাপড়া / অ্যাপ্লিকেশন- কনটেক্সট লিঙ্কটি এখানে । অ্যাপ্লিকেশনসন্টেক্সটওয়্যার ইন্টারফেস প্রয়োগের সাথে সেরা বিকল্পটি রয়েছে।
দুর্জা আড়াই

89

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

একটি নতুন শ্রেণি অ্যাপ্লিকেশনকন্টেক্সটপ্রভাইডার.জাভা তৈরি করুন

package com.java2novice.spring;

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

public class ApplicationContextProvider implements ApplicationContextAware{

    private static ApplicationContext context;

    public static ApplicationContext getApplicationContext() {
        return context;
    }

    @Override
    public void setApplicationContext(ApplicationContext ac)
            throws BeansException {
        context = ac;
    }
}

প্রয়োগ-প্রসঙ্গ.এক্সএমএলে একটি এন্ট্রি যুক্ত করুন

<bean id="applicationContextProvider"
                        class="com.java2novice.spring.ApplicationContextProvider"/>

টীকাগুলির ক্ষেত্রে (অ্যাপ্লিকেশন-কনটেক্সট.এক্সএমএল পরিবর্তে)

@Component
public class ApplicationContextProvider implements ApplicationContextAware{
...
}

প্রসঙ্গটি এভাবে পান

TestBean tb = ApplicationContextProvider.getApplicationContext().getBean("testBean", TestBean.class);

চিয়ার্স !!


1
আমি বিবেকের মতোই কোড করেছিলাম। তবে আমি যখনই প্রসঙ্গ থেকে আমাকে getBean () কল করতে হবে তখনই আমি নতুন অ্যাপ্লিকেশন কনটেক্সটপ্রাইডার () তৈরি করা এড়াতে চাই। আমি যা করেছি তা স্থির ApplicationContextProvider.getApplicationContext() পদ্ধতি ছিল। তারপরে, যখন বর্তমান অ্যাপ্লিকেশন প্রসঙ্গে প্রয়োজন হবে তখন আমি অনুরোধ করছি:ApplicationContextProvider appContext = ApplicationContextProvider.getApplicationContext()
পানিনি লুঞ্চার ২

1
হ্যাঁ পানিনি লুঞ্চার, এটি এখনও ভাল হবে। আপনার পরামর্শ অনুসারে আমি সেভাবে এটি পরিবর্তন করব। :)
বিবেক

4
অ্যাড যোগ @Componentকরুন ApplicationContextProviderকনফিগারেশন এড়াতে পারবেনaplication-context.xml
নীলায়রো

1
দ্রষ্টব্য: প্রসঙ্গে গেটর এবং সেটার সিঙ্ক্রোনাইজ করা উচিত। ইউনিট / ইন্টিগ্রেশন-পরীক্ষার জন্য আপনি প্রচুর মাথাব্যথা এড়াতে পারবেন will আমার ক্ষেত্রে অনুরূপ অ্যাপ্লিকেশন কনটেক্সটপ্রভাইডার পুরানো প্রসঙ্গ (পূর্ববর্তী ইন্টিগ্রেশন টেস্ট থেকে) ধরেছিল যা অনেকগুলি জটিল বাগের কারণ হয়েছিল।
ওলেকসান্ডার_ডিজে

43

যদি আপনাকে এইচটিটিপি সার্লেটের মধ্যে থেকে প্রসঙ্গটি অ্যাক্সেস করার দরকার হয় যা নিজেই স্প্রিং দ্বারা ইনস্ট্যান্ট করা হয় না (এবং তাই @ অটোয়ার বা অ্যাপ্লিকেশনসন্টেক্সয়ার কোনওটিই কাজ করবে না) ...

WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());

অথবা

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

অন্যান্য জবাবগুলির কিছু হিসাবে, এটি করার আগে দু'বার ভাবেন:

new ClassPathXmlApplicationContext("..."); // are you sure?

... এটি আপনাকে বর্তমান প্রসঙ্গটি দেয় না, বরং এটি আপনার জন্য এটির আরও একটি উদাহরণ তৈরি করে। যার অর্থ ১) মেমরির উল্লেখযোগ্য অংশ এবং ২) মটরশুটি এই দুটি অ্যাপ্লিকেশন প্রসঙ্গের মধ্যে ভাগ করা হয়নি।


স্প্রিংবিয়ানআউটওয়্যারিংস্পুর্ট.প্রসেসআইনিজেশনব্যাসডঅনকন্টারকন্টেক্সট (এটি) - লাইফ্রে পোর্টলেট অ্যাকশন ফিল্টারটির ইনি () পদ্ধতিতে আমার জন্য কাজ করেছে।
ইগোর বাইবোরডাইন

আশ্চর্যজনক, প্রক্রিয়াআইজানবায়জডঅনক্র্যান্টকন্টেক্সট আমার প্রয়োজনীয় সমস্ত কাজ করেছে। অনেক ধন্যবাদ @ জারোস্লাভ
জ্যাড বি

অ্যাপিকেশনসটেক্সটওয়্যারটি আমার পক্ষে কাজ করে, যখন এটি বিবেকের সমাধান হিসাবে @ কম্পোমেন্টের সাথে টীকাযুক্ত করা হয় (আমি ম্যানুয়ালি অ্যাবস্ট্রাক কনটেক্সটলডার আইনিটিয়ালাইজার / ক্রিয়েটআরটপ্লিকেশন কনটেক্সট প্রসারিতের মাধ্যমে বসন্তের প্রসঙ্গটি শুরু করছি)
হ্যালো_আরথ

সতর্কতা অবলম্বন করুন ... স্প্রিংবিয়ানআউটওয়্যারিংসপোর্ট.প্রসেসইঞ্জেকশনবেসডঅনক্রেনারকন্টেক্সট (এটি); তাত্ক্ষণিকভাবে ঘটবে না, তাই আপনি উদাহরণস্বরূপ এটি আপনার নির্মাণকারীর প্রথম লাইন হিসাবে ব্যবহার করতে পারবেন না।
স্লেজহ্যামার

31

আপনি যদি কোনও ক্লাস বাস্তবায়িত করেন যা ঝর্ণার দ্বারা তাত্ক্ষণিকভাবে নয়, জসন ডিজিজারাইজারের মতো আপনি ব্যবহার করতে পারেন:

WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
MyClass myBean = context.getBean(MyClass.class);

8
এটা আমার কাজ করে না। আমার ক্লাসটি বসন্তের প্রসঙ্গে। আমি আপনার কোডটি ব্যবহার করার চেষ্টা করেছি তবে এটি প্রতিক্রিয়া হিসাবে আমাকে বাতিল করে দেয় । আমি কথা বলছিContextLoader.getCurrentWebApplicationContext()
আর কার্লস

9

এটি আপনার কোডে যুক্ত করুন

@Autowired
private ApplicationContext _applicationContext;

//Add below line in your calling method
MyClass class = (MyClass) _applicationContext.getBean("myClass");

// Or you can simply use this, put the below code in your controller data member declaration part.
@Autowired
private MyClass myClass;

এটি সহজেই আপনার অ্যাপ্লিকেশনটিতে মাইক্লাস ইনজেক্ট করবে


6

বিবেকের উত্তরের ভিত্তিতে, তবে আমি মনে করি নিম্নলিখিতগুলি আরও ভাল হবে:

@Component("applicationContextProvider")
public class ApplicationContextProvider implements ApplicationContextAware {

    private static class AplicationContextHolder{

        private static final InnerContextResource CONTEXT_PROV = new InnerContextResource();

        private AplicationContextHolder() {
            super();
        }
    }

    private static final class InnerContextResource {

        private ApplicationContext context;

        private InnerContextResource(){
            super();
        }

        private void setContext(ApplicationContext context){
            this.context = context;
        }
    }

    public static ApplicationContext getApplicationContext() {
        return AplicationContextHolder.CONTEXT_PROV.context;
    }

    @Override
    public void setApplicationContext(ApplicationContext ac) {
        AplicationContextHolder.CONTEXT_PROV.setContext(ac);
    }
}

স্ট্যান্টিক ফিল্ডে উদাহরণস্বরূপ পদ্ধতি থেকে লেখাই একটি খারাপ অভ্যাস এবং বিপজ্জনক যদি একাধিক উদাহরণ হস্তক্ষেপ করা হয়।


নেই org.springframework.core.io.ContextResourceইন্টারফেস। আমি ContextResourceকেবল জগাখিচুড়ি এড়াতে অভ্যন্তর শ্রেণীর জন্য আলাদা নাম চয়ন করার পরামর্শ দেব ।
আলেকজান্ডার রাডচেনকো

@AlexanderRadchenko ঠিক আছে, আমি এটা InnerContextResource পরিবর্তিত
জুয়ান

1

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

  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)পদ্ধতি আপনি অ্যাপ্লিকেশন কনটেক্সট পাবেন

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

    @Autowired
    private ApplicationContext applicationContext;

এখানে @Autowiredকীওয়ার্ডটি অ্যাপ্লিকেশন কনটেক্সট সরবরাহ করবে।

আরও তথ্যের জন্য এই থ্রেড দেখুন

ধন্যবাদ :)


0

আর একটি উপায় হ'ল সার্ভলেটের মাধ্যমে অ্যাপ্লিকেশন কনটেক্সট ইনজেক্ট করা।

এটি স্প্রিং ওয়েব পরিষেবাদি ব্যবহার করার সময় নির্ভরতাগুলি কীভাবে ইনজেক্ট করতে হয় তার একটি উদাহরণ।

<servlet>
        <servlet-name>my-soap-ws</servlet-name>
        <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
        <init-param>
            <param-name>transformWsdlLocations</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:my-applicationContext.xml</param-value>
        </init-param>
        <load-on-startup>5</load-on-startup>

</servlet>

বিকল্প উপায়টি নীচে দেখানো অনুসারে আপনার ওয়েব.এক্সএমএলে অ্যাপ্লিকেশন কনটেক্সট যুক্ত করা

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/classes/my-another-applicationContext.xml
        classpath:my-second-context.xml
    </param-value>
</context-param>

মূলত আপনি সার্লেটকে বলার চেষ্টা করছেন যে এটি এই কনটেক্সট ফাইলে সংজ্ঞায়িত মটরশুটি দেখতে হবে।


0

পদক্ষেপ 1 : ক্লাসে নিম্নলিখিত কোড ইনজেকশন করুন

@Autowired
private ApplicationContext _applicationContext;

পদক্ষেপ 2 : লেখক এবং সেটর লিখুন

পদক্ষেপ 3 : এক্সএমএল ফাইলে শিম সংজ্ঞায়িত অটোওয়ায়ার = "বাই টাইপ" সংজ্ঞায়িত করুন


0

আপনার ক্লাসটি যদি রেস্ট কন্ট্রোলার বা কনফিগারেশন ক্লাস না হয় তবে @ অটোয়ার যুক্ত করার পরেও, অ্যাপ্লিকেশন কনটেক্সট অবজেক্টটি শূন্য হয়ে আসছে। নীচে দিয়ে নতুন ক্লাস তৈরি করার চেষ্টা করা হয়েছে এবং এটি ভাল কাজ করছে:

@Component
public class SpringContext implements ApplicationContextAware{

   private static ApplicationContext applicationContext;

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

তারপরে আপনি ইমপ্লিমেন্টেড ক্লাসের রেফারেন্স পাওয়ার মতো আপনার প্রয়োজন অনুসারে একই শ্রেণিতে একটি গেটর পদ্ধতি প্রয়োগ করতে পারেন:

    applicationContext.getBean(String serviceName,Interface.Class)

-11
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-servlet.xml");

তারপরে আপনি শিমটি পুনরুদ্ধার করতে পারেন:

MyClass myClass = (MyClass) context.getBean("myClass");

তথ্যসূত্র: স্প্রিংবায়েক্সামেল.অর্গ


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