我一直在玩春天,并且有一个关于在我的一个班级上获得单身人士行为的问题。更具体地说,我有一个名为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生活在相同的上下文中。我曾尝试过玩后一种想法但没有成功(因为我认为缺乏知识......)。