一、说明
如果开发了一个J2SE的应用程序,然后想用Web来完成一些的用户界面,但是在启动 Jetty 之前就已经创建和使用了 Spring 的 ApplicationContext,但这些Web的业务中也要依赖于 Spring 的 ApplicationContext,这样就会遇到一个问题:原有应用程序和新加Web不在同一个上下文,在Web中如何获取Spring中管理的Bean呢?
二、创建jetty-context.xml,并在原有的spring中引入
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="handler" class="org.eclipse.jetty.webapp.WebAppContext">
<property name="contextPath" value="/admin" />
<property name="resourceBase" value="./webapps/admin" />
<property name="logUrlOnStart" value="true" />
<property name="configurationDiscovered" value="true" />
</bean>
<bean id="server" class="org.eclipse.jetty.server.Server" init-method="start" destroy-method="stop">
<property name="connectors">
<list>
<bean id="Connector" class="org.eclipse.jetty.server.nio.SelectChannelConnector">
<property name="port" value="8080" />
</bean>
</list>
</property>
<property name="handler">
<ref bean="handler" />
</property>
</bean>
</beans>
二、项目中添加web目录,并在该目录下完善这个web的jsp或servlet
|--webapps
|--admin
|--WEB-INF
|--web.xml
|--index.jsp
三、创建一个获取spring管理的bean的工具类(完成上两步之后,问题来了,在这个web中管理的servlet和原有的Spring中管理的Bean是不同的上下文,不能直接注入)
package com.xilen.util.spring;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
* 通过实现ApplicationContextAware以获得这个Spring配置所在的上下文
*/
public class ApplicationContextHelper implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
/**
* 获得Bean对象
*/
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
/**
* 获得Bean对象
*/
public static Object getBean(String className) {
return applicationContext.getBean(className);
}
/**
* 获得应用所在上下文环境
*/
public static ApplicationContext getContext() {
return applicationContext;
}
/**
* 以让 spring 把 application context 设置进来
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextHelper.applicationContext = applicationContext;
}
}
四、把ApplicationContextHelper配置到应用程序的Spring环境中去
<bean id="applicationContextHelper" class="com.xilen.util.spring.ApplicationContextHelper" />
五、最后,在web的servlet中获取并使用应用程序中Spring管理的Bean
UserInfoService userInfoService = (UserInfoService) ApplicationContextHelper.getBean("userInfoService");
六、参考
http://virusfu.iteye.com/blog/1220407