web-dev-qa-db-ja.com

Springは現在のApplicationContextを取得します

私は自分のWebアプリケーションにSpring MVCを使用しています。私の豆は "spring-servlet.xml"ファイルに書かれています

今、私はクラスMyClassを持っていて、私はこのクラスをSpring Beanでアクセスしたい

spring-servlet.xmlでは、私は以下のように書いています

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

今私はApplicationContextを使用してこれにアクセスする必要があります

ApplicationContext context = ??

できるように

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

これを行う方法??

92
LynAs

それを注入するだけです。

@Autowired
private ApplicationContext appContext;

またはこのインタフェースを実装します。 ApplicationContextAware

137
gipinani

これは link が、Bean以外のクラスであっても、どこにでもアプリケーションコンテキストを取得する最良の方法を示していると思います。とても便利です。あなたのために同じことを願っています。以下はその抽象コードです。

新しいクラスを作成するApplicationContextProvider.Java

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;
    }
}

application-context.xmlにエントリを追加します

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

アノテーションの場合(application-context.xmlの代わりに)

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

このような文脈を得る

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

乾杯!!

77
Vivek

Springではインスタンス化されていないHttpServletの中からコンテキストにアクセスする必要がある場合(したがって@AutowireもApplicationContextAwareも機能しません)...

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

または

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

他の回答のいくつかに関しては、これを行う前に2回考えてください

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

...これはあなたに現在のコンテキストを与えるのではなく、むしろそれはあなたのためにそれの別のインスタンスを作成します。つまり、1)大量のメモリと2)Beanがこれら2つのアプリケーションコンテキストで共有されていません。

38

Springでインスタンス化されていないクラスを実装しているなら、JsonDeserializerのようにあなたが使うことができます:

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

これをあなたのコードに追加

@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;

これは単にあなたのアプリケーションにmyClassを注入するだけです。

8
Hitesh Kumar

vivekの答えに基づいていますが、私は以下がより良いだろうと思います:

@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);
    }
}

インスタンスメソッドから静的フィールドへの書き込みは悪い習慣であり、複数のインスタンスが操作されている場合は危険です。

5
Juan

Step 1:クラスに次のコードを挿入する

@Autowired
private ApplicationContext _applicationContext;

ステップ2:ゲッターとセッターを書く

ステップ:beanが定義されているxmlファイルにautowire = "byType"を定義

1

別の方法はサーブレットを通してapplicationContextを注入することです。

これは、Spring Webサービスを使用しているときに依存関係を注入する方法の例です。

<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>

別の方法は、次に示すようにweb.xmlにアプリケーションコンテキストを追加することです。

<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>

基本的には、これらのコンテキストファイルで定義されているBeanを探すようにサーブレットに指示しています。

0
vsingh

Springアプリケーションでアプリケーションコンテキストを取得する方法はたくさんあります。それらは以下の通りです:

  1. ApplicationContextAwareを介して:

    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)メソッドはapplicationContextを取得します

  1. 自動配線経由

    @Autowired
    private ApplicationContext applicationContext;
    

ここで@AutowiredキーワードはapplicationContextを提供します。

詳細な情報については--- このスレッド

ありがとう:)

0