获得单身行为。春天背景问题

时间:2012-11-28 10:32:17

标签: spring

我一直在玩春天,并且有一个关于在我的一个班级上获得单身人士行为的问题。更具体地说,我有一个名为Cache的类,我希望有单例行为。我将首先发布我的实际代码的重要部分(一个mdb,一个servlet和一些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>

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

在我的servlet中,我使用以下

注入一个Cache实例
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
cache = (Cache) ctx.getBean("cache");

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

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

1 个答案:

答案 0 :(得分:0)

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

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