我一直在玩 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 存在相同的上下文。我曾尝试过使用后一种想法,但没有成功(我猜是因为缺乏知识......)。