1、 配置在web.xml中
a) 定义成listene
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
b) 定义成servlet
<servlet>
<servlet-name>SpringContextServlet</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
c) Web 容器会自动加载 /WEB-INF/applicationContext.xml 初始化 ApplicationContex t实例;
也可以通过
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-*.xml</param-value>
</context-param>
contextConfigLocation是Spring好像是默认加载的名称(下次读读Spring的源代码看看)
使 Web 容器加载指定名称路径的 Spring 配置文件。
这里涉及一个选择的问题,参考文献1中认为Listerner要比Servlet更好一些,因为Listerner监听应用的启动和结束,而Servlet得启动要稍微延迟一些,如果在这时要做一些业务的操作,启动的前后顺序是有影响的。
关于Listerner和Servlet的区别我还不了解,还要去找找看到底区别在哪里。在我们项目中是放在Servlet里面设置的。
2、 配置为Struts的plungin
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml,
/WEB-INF/action-servlet.xml"/>
</plug-in>
不过这类的用法比较不常见,而且他和Struts结合太紧,如果要做单元测试起来有点困难。
两者方式都是把Spring的WebApplicationContext放入到web的ServeletContext中,在web项目里面只要能拿到ServeletContext的地方都能使用。这里需要注意的是两者放入web ServeletContext时候的key是不一样的。前者是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,后者是ContextLoaderPlugIn.SERVLET_CONTEXT_PREFIX+ModuleConfig.getPrefix()。不过前者可以用WebApplicationContextUtils在ServeletContext把WebApplicationContext取出来,后者没有使用过,不是很了解。
上面说道要做单元测试,所以把Spring设置成Struts的plugin有点不方便,这个可以看看我们项目里面的使用。
在项目启动的时候我们做了Struts的plugin:ApplicationInitializer,在这里初始化一些全局变量,这个有点类似程序的main函数。在这里面:
ApplicationContext context = WebApplicationContextUtils.
getRequiredWebApplicationContext(this.actionServlet.getServletContext());
// init ServiceLocator
ServiceLocator.init(new SpringBeanHolder(context));
这里可以看到我们取出了ApplicationContext初始化一个ServiceLocator,以后我们的web都只是和ServiceLocator打交道,这里设置ApplicationContext只是在一个地方,如果以后要换IOC容器也比较方便,这里是不是一个代理模式呢?
不过这里很奇怪的有可以看见一个SpringBeanHolder,为什么会是这个样子呢?我们来看看ServiceLocator.init()的定义
public synchronized static void init(BeanHolder beanHolder){
singleton = new ServiceLocator(beanHolder);
}
可以看到参数是BeanHolder,这个是一个接口:
public interface BeanHolder {
public Object getBean(String beanId);
}
Look,这里就是把接口和实现分离了,以后如果不使用Spring了,好,那我们换一个实现,比如叫CrabBeanHolder :)
不过SpringBeanHolder也很简单:
public class SpringBeanHolder implements BeanHolder {
private ApplicationContext context;
public SpringBeanHolder(){}
public SpringBeanHolder(ApplicationContext context){
this.context = context;
}
public Object getBean(String beanId){
return context.getBean(beanId);
}
}
我们再去look一下ServiceLocator:
public class ServiceLocator {
private static Log log = LogFactory.getLog(ServiceLocator.class);
private BeanHolder beanHolder;
private static ServiceLocator singleton = null;
private ServiceLocator(){
}
private ServiceLocator(BeanHolder sh){
this.setServiceHolder(sh);
}
public synchronized static void init(BeanHolder beanHolder){
singleton = new ServiceLocator(beanHolder);
}
public static ServiceLocator getInstance(){
return singleton;
}
private void setServiceHolder(BeanHolder beanHolder){
this.beanHolder = beanHolder;
}
public Object getBean(String beanId){
return this.beanHolder.getBean(beanId);
}
public MasterFacade getMasterFacade(){
return (MasterFacade)getBean("masterFacade");
可以看到他本来是想写一个单例模式,但是最后没有做限制,只要你做init方法,都会new一个,虽然我们只是使用一个,但是这里不作一个正规的if (singleton== null)的判断总是不太好,起码new也是一个开销啊。而且垃圾回收也是一个开销。记下来,下次改正。
不过在我们的web应用中也只是在ApplicationInitializer中做一下init,所以也算是单例啦:)
我们项目中还有一个ComponentManager:
public class ComponentManager {
private ComponentManager() {
}
public static DataAccessStrategy getDataAccessStrategy(){
return (DataAccessStrategy)ServiceLocator.getInstance().getBean("dataAccessStrategy");
}
public static DataSource getDataSource(){
return (DataSource)ServiceLocator.getInstance().getBean("SPSDataSource");
}
public static MetadataManager getMetadataManager(){
return (MetadataManager)ServiceLocator.getInstance().getBean("metadataManager");
}
public static Object getBean(String beanId){
return ServiceLocator.getInstance().getBean(beanId);
}
}
这里他也是调用了ServiceLocator。其实两者的功能是一样的,上次我们的开发经理提过让我们注意两者的区别,我想这里的区别主要是语义上面的,ServiceLocator主要是直接定位各种业务Façade他们都用直接的函数取得。而ComponentManager主要是去一些细颗粒度的bean把。
另外,在单元测试代码中,我们是这么使用ServiceLocator的:
String[] configLocations =
{"/WEB-INF/spring-context-common.xml",
"/WEB-INF/spring-context-master.xml",
"/WEB-INF/spring-context-inventory.xml",
"/WEB-INF/spring-context-product.xml",
"/WEB-INF/spring-context-open.xml","/WEB-INF/spring-context-order.xml","/WEB-INF/spring-context-group.xml"};
ServiceLocator.init(new SpringBeanHolder
(new FileSystemXmlApplicationContext(configLocations)));
openProductFacade = (OpenProductFacade) ServiceLocator.getInstance().getOpenProductFacade();
看看这样是不是很方便,如果配置成为Struts的plungin的话测试的代码还要重新写,这样就不符合DRY(Don’t Repeat Yourself)的原则了。
今天总算是把项目中Struts和Spring结合的这个部分搞清楚了*^_^*,以前不清不楚的也可以做开发,而且也完成了两个项目了,但是这样总是不可以的,到时候碰到问题的时候都不知道怎么去解决呢。而且某某人说过一句:只是用一件东西,不彻底把他搞清楚怎么可以呢。
分享到:
相关推荐
但不论使用哪种方式,理解Spring在Web项目中的集成原理和组件工作方式都是非常重要的。 总之,Spring为Web开发提供了强大而灵活的框架,通过合理集成和配置,可以构建出高效、可维护的Web应用。
在描述中提到的博客链接(由于实际无法访问,这里仅做理论分析),可能会详细探讨如何在实际项目中结合Groovy和Spring进行Web开发,包括Groovy的脚本配置、Bean定义、以及可能的Grails框架应用实例。 标签"源码"和...
1. **引入依赖**:在项目中添加`spring-webmvc`的jar包,如`spring-webmvc-3.1.1.release-sources.jar`,这个版本包含源代码,便于开发者理解内部实现。 2. **配置DispatcherServlet**:在web.xml中配置...
在Spring配置文件中添加BlazeDS的配置,并在Flex项目中设置相应的Remoting Destination。 6. **错误处理和日志记录**:确保在Spring中设置合适的异常处理器和日志记录,以便在出现问题时能够得到反馈。同时,在Flex...
本篇文章将详细探讨在Spring环境下配置几种常用的数据库连接池,并提供配置属性的详尽解析和实例应用。 1. **HikariCP** HikariCP是目前非常流行的一款高性能连接池,以其轻量级、高效而受到广泛赞誉。在Spring中...
通过分析这个项目,初学者可以学习到如何设置Spring环境,编写Controller、Service和DAO层的代码,以及如何配置和使用Spring提供的各种工具。此外,理解项目的结构和组件之间的关系,有助于提高对Spring框架的整体...
在Web应用中通过web.xml利用Spring配置log4j不仅需要理解web.xml的配置方式,还需要对log4j配置文件有一定的了解,并且需要熟悉Spring框架对log4j的支持。这样配置完成后,可以实现日志记录的集中管理和灵活配置,为...
描述中虽然没有具体信息,但通常Spring Web Services的入门会涉及以下几个关键知识点: 1. **Spring Web Services概念**:了解Spring Web Services的基本理念,它是如何帮助开发者创建基于契约驱动的服务,以及它对...
本文将深入探讨如何在Spring环境下配置几种常用的数据库连接池,包括HikariCP、Druid和Apache DBCP2。 一、HikariCP HikariCP被誉为最快的Java数据库连接池,它的设计目标是提供最小的延迟和最大的并发性能。在...
在Spring框架中,Bean是核心概念,它是Java对象在Spring容器中的实例,通过XML或Java配置来定义。本文将深入探讨Spring项目中的...记得实践是检验理论的最好方式,尝试在实际项目中配置Bean,以便更好地掌握这些知识。
在探讨Spring WebFlow的精髓之前,我们首先需要明确,Spring WebFlow是Spring框架中的一个重要模块,专注于处理复杂的应用流程控制。它提供了一种基于状态机的机制来管理应用流程,使得开发者能够以更直观、更结构化...
5. **启动配置**:在`web.xml`(如果你的项目使用的是传统的Servlet容器)或`Spring Boot`的配置文件中,需要配置Spring WebFlow的拦截器和视图解析器,以便正确地处理流程请求。 6. **测试**:为了确保流程正确...
### Spring Cloud在Java微服务项目中的配置管理实践 随着企业级应用向微服务架构转型,配置管理成为了一个不容忽视的关键领域。Spring Cloud以其强大的生态系统,为开发者提供了多种工具和服务,帮助构建灵活、可...
在现代的Spring MVC项目中,通常采用注解方式进行开发,如`@Controller`、`@RequestMapping`、`@Service`、`@Autowired`等,这极大地简化了配置文件的编写。 5. **Spring MVC 流程** 1) 用户发送HTTP请求到服务器...
现实开发中最令人头痛的莫过于 session 范围, Java Servlet 规范指明可在 web.xml 中按如下方式配置 session 的有效时间为100 分钟: 清单 2 web.xml 中 session 的配置 <session-timeout>100 然而,现实中的 ...
在 "springboot+spring data jpa+thymeleaf学习web项目整合demo源码" 中,我们可以学习到以下几个关键知识点: 1. **Spring Boot 整合**:Spring Boot 可以与多个框架集成,如 Spring MVC、Spring Data 和 ...
在本项目中,Spring可能被用于实现控制反转(IoC)和面向切面编程(AOP)。IoC使得组件之间的依赖关系不再硬编码,而是通过配置文件或注解来声明,增强了代码的可测试性和可维护性。AOP则允许我们定义横切关注点,如...
在 Spring 框架中,通过合理地拆分和加载多个配置文件,不仅可以显著提升应用程序的可读性和可维护性,还能更好地适应大型项目的团队协作模式。掌握这些技巧,将帮助开发者构建更加健壮、灵活的企业级应用。
在Java企业级开发中,Spring Web MVC和Portlet框架的应用广泛且深入,它们各自在不同的场景下发挥着重要作用。Spring Web MVC是Spring框架的重要组成部分,用于构建高性能、灵活的Web应用程序,而Portlet则是portlet...
将XFire与Spring结合使用,可以实现以下几种发布Web服务的方式: 1. **基于Spring Bean的配置**:通过在Spring配置文件中定义Bean,可以将Web服务的实现类声明为一个Bean。Spring会自动检测该Bean上的JAX-WS注解...