0

我一直在玩 spring 并且有一个关于在我的一个课程中获得单身行为的问题。更具体地说,我有一个名为 Cache 的类,我希望它具有单例行为。我将首先发布我的实际代码的重要部分(一个 mdb、一个 servlet 和一些 xml 文件),然后再详细说明我的问题。

消息接收器.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>

弹簧上下文.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>

在我的 servlet 中,我注入了一个 Cache 实例,其中包含以下内容

ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
cache = (Cache) ctx.getBean("cache");

尽管 Cache 实例的注入在 servlet 和 mdb 中都有效,但在这两种情况下我都没有得到相同的实例。我知道通常 bean 不是跨不同上下文的单例,我的第一个问题是这是否也(或必须)也适用于父子上下文设置。

我的第二个问题(如果上面的代码不容易修改以获得我想要的行为)是是否有一种标准方法可以在多个上下文中获取单例行为,或者我是否可以以某种方式使我的 mdb 和 servlet 存在相同的上下文。我曾尝试过使用后一种想法,但没有成功(我猜是因为缺乏知识......)。

4

1 回答 1

0

在父上下文中设置缓存可以解决这个问题。

如果您不想那样做,您还可以实现InitializingBean来实例化缓存并将单例实例保存到静态字段。

于 2012-11-28T14:05:41.923 回答