私は自分の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");
これを行う方法??
それを注入するだけです。
@Autowired
private ApplicationContext appContext;
またはこのインタフェースを実装します。 ApplicationContextAware
これは 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);
乾杯!!
Springではインスタンス化されていないHttpServletの中からコンテキストにアクセスする必要がある場合(したがって@AutowireもApplicationContextAwareも機能しません)...
WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
または
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
他の回答のいくつかに関しては、これを行う前に2回考えてください
new ClassPathXmlApplicationContext("..."); // are you sure?
...これはあなたに現在のコンテキストを与えるのではなく、むしろそれはあなたのためにそれの別のインスタンスを作成します。つまり、1)大量のメモリと2)Beanがこれら2つのアプリケーションコンテキストで共有されていません。
Springでインスタンス化されていないクラスを実装しているなら、JsonDeserializerのようにあなたが使うことができます:
WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
MyClass myBean = context.getBean(MyClass.class);
これをあなたのコードに追加
@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を注入するだけです。
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);
}
}
インスタンスメソッドから静的フィールドへの書き込みは悪い習慣であり、複数のインスタンスが操作されている場合は危険です。
Step 1:クラスに次のコードを挿入する
@Autowired
private ApplicationContext _applicationContext;
ステップ2:ゲッターとセッターを書く
ステップ:beanが定義されているxmlファイルにautowire = "byType"を定義
別の方法はサーブレットを通して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を探すようにサーブレットに指示しています。
Springアプリケーションでアプリケーションコンテキストを取得する方法はたくさんあります。それらは以下の通りです:
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を取得します
自動配線経由:
@Autowired
private ApplicationContext applicationContext;
ここで@Autowired
キーワードはapplicationContextを提供します。
詳細な情報については--- このスレッド
ありがとう:)