私は春に少し遊んでいて、クラスの 1 つでシングルトンの動作を取得することについて質問があります。より具体的には、シングルトンの動作をさせたい Cache というクラスがあります。まず、実際のコードの重要な部分 (mdb、サーブレット、およびいくつかの xml ファイル) を投稿してから、質問についてもう少し詳しく説明します。
MessageReceiver.java
@Interceptors(SpringBeanAutowiringInterceptor.class)
public class MessageReceiver implements MessageListener {
@Autowired
private Cache cache;
@Override
public void onMessage(Message msg) {
... do stuff with cache
}
beanRefContext.xml
<bean id="jar.context"
class="org.springframework.context.support.ClassPathXmlApplicationContext" >
<constructor-arg>
<list>
<value>spring-context.xml</value>
</list>
</constructor-arg>
</bean>
spring-context.xml
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>
<bean id="cache" class="com.company.myapp.cache.impl.CacheImpl"/>
web.xml
<context-param>
<param-name>parentContextKey</param-name>
<param-value>jar.context</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.company.myapp.servlet.Servlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
そして、私のサーブレットでは、キャッシュインスタンスに次のものを挿入します
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
cache = (Cache) ctx.getBean("cache");
Cache インスタンスの注入はサーブレットと mdb の両方で機能していますが、両方のケースで同じインスタンスを取得していません。一般に、Bean はさまざまなコンテキストでシングルトンではないことを知っています。最初の質問は、それが親子コンテキスト設定にも適用されるかどうか (または必然的に適用される必要があるかどうか) です。
私の 2 番目の質問 (上記のコードを変更して目的の動作を実現するのが簡単でない場合) は、複数のコンテキストでシングルトンの動作を取得する標準的な方法があるかどうか、または何らかの方法で mdb とサーブレットをライブにすることができるかどうかです。同じ文脈。私は後者のアイデアを少し試してみましたが、成功しませんでした (知識が不足しているためだと思います...)。