`
zpball
  • 浏览: 914791 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在非web环境中使用spring

阅读更多
     Spring再强大,也要面对降临的问题--因为Spring不是Weblogic、Tomcat般的顶层容器,Servlet和EJB对象不由它创建,所以它必须要降临到Weblogic、Tomcat所在的位面。
     初学者一般不用管那么多,照着Spring+hibernate+Struts之类的Sample就做了,但慢慢的,也许就要开始在jsp+javabean体系,土制框架,singleton类等环境下使用Spring了。
     《Professional Java Development with the Spring Framework》第3章有"Managing the Containe"一节讲这个问题。一般可以分为直接召唤系与IoC fashion两类。
  1.直接召唤系--Singleton的Application Context
      最简单的,就像在UnitTest里那样,直接构造Application Context:
ApplicationContext ctx = new ClasspathXmlApplicationContext("ApplicationContext.xml");


   
      在Web环境里,会使用ContextLoader构造ApplicationContext后,压进Servlet Context。
      由ContextLoaderListener或ContextLoaderServlet,在Web应用启动时完成。
      然后在Jsp/Servelet中,可以通过Servlet Context取得ApplicationContext:
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(application);


    
      但像singleton类或者EJB中,就没有Servlet Context可用了。
      如果全部像UnitTest那样直接构造,速度就会很不堪。自然的,就想到把ApplicationContext做成单例。
      Spring提供了ContextSingletonBeanFactoryLocator这样的物体。
      先搞一个beanRefFactory.xml,里面写上所有的applcationContext-*.xml文件名,并把Context命名为"default-context":
<beans>
  <bean id="default-context"  class="org.springframework.context.support.ClassPathXmlApplicationContext">
    <constructor-arg>
      <list> <value>applicationContext.xml</value></list>
    </constructor-arg>
  </bean>
</beans>


  然后让loactor去找它,但代码有点长:
BeanFactoryReference bfr =  DefaultLocatorFactory.getInstance().useBeanFactory("default-context");
BeanFactory factory = bfr.getFactory();
MyService myService = factory.getBean("myService");
bfr.release();
// now use myService



    上面的代码实在是太灵活,太麻烦了。
还不如自己实现一个简单的Singleton,扩展ContextLoaderListener类,在Web系统启动时压入Singleton。

    新的ContextLoaderListener类重载如下,ContextUtil中包含一个静态的ApplicationContext变量:
  
 public void contextInitialized(ServletContextEvent event)
    {
        super.contextInitialized(event);

        ServletContext context = event.getServletContext();
        ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
        ContextUtil.setContext(ctx);
    }


   用家可直接取用:
 ApplicationContext context = ContextUtil.getContext();



2.IoC fashion
    如果所有地方都使用直接召唤系,那就反而是在打Rod的耳光了。因为他一直都反对代码与框架深耦合的。
    所以,更好的方法是写一些glue code、base class来完成Spring的降临,而不让应用代码察觉Spring Application Context的存在。
    不过,因为各个框架的结构不同,Rod也没办法讲出一个通用的整合方法,所以建议大家尽量学习已整合的各种框架,如Spring MVC、Struts的种种方式,写出自己的简单整合代码来。

    只有不确定的调用某些Singleton类,不适合过早ioc的情况,可以使用直接召唤系。
分享到:
评论

相关推荐

    RestTemplate如何在Spring或非Spring环境下使用.docx

    在非Spring环境下,可以直接引用`spring-web`模块来使用`RestTemplate`,无需整个Spring框架。只需在Maven或Gradle的依赖管理中添加`spring-web`,然后实例化`RestTemplate`对象即可进行HTTP请求。 然而,随着...

    Web项目中获取SpringBean与在非Spring组件中获取SpringBean.pdf

    然而,有时我们需要在非Spring管理的组件或者非Spring环境下获取Spring管理的Bean。这时,我们就需要一种方式来访问Spring的ApplicationContext,它是Spring容器的核心,负责管理所有Bean。 一种常见的做法是创建一...

    spring-web-5.2.4_spring-web_SSM框架_

    SSM框架中的Spring Web扮演着至关重要的角色,它作为整个SSM架构的入口,负责处理来自用户的请求,并通过Spring的依赖注入和AOP特性,与其他组件如Spring Core、Spring JDBC、Spring ORM等协同工作,为开发者提供一...

    在 Spring Web MVC 环境下使用 Dojo

    **在 Spring Web MVC 环境下使用 Dojo** Dojo 是一个强大的 JavaScript 库,提供了丰富的 UI 组件、数据管理、异步通信等功能,广泛应用于构建富客户端应用。Spring Web MVC 是 Java 开发Web应用的主流框架,以其...

    spring webflow 官方中文版权威指南PDF

    1. **Spring WebFlow简介**:介绍Spring WebFlow的基本概念,包括它为何被创建,以及在什么场景下使用最为合适。它主要解决的问题是如何优雅地管理用户会话中的复杂流程。 2. **流程定义**:Spring WebFlow通过XML...

    SSH笔记-web应用下使用Spring

    这通常适用于需要在特定请求处理中使用Spring Bean的情况。例如,你可以创建一个`MySpringServlet`,并在`init`方法中加载Spring配置: ```java public class MySpringServlet extends HttpServlet { private ...

    groovy+spring在web中的应用

    首先,Groovy在Spring中的应用主要体现在以下几个方面: 1. **配置文件简化**:Groovy的脚本特性使得我们可以用更简洁的方式编写Spring的XML配置,甚至完全摒弃XML,转向使用Groovy的@Configuration注解和@Bean方法...

    spring web flow reference 2.4.0

    对于使用Ivy作为构建工具的项目,可以通过在ivy.xml文件中添加以下依赖来使用Spring Web Flow: ```xml &lt;dependency org="org.springframework.webflow" name="spring-webflow" rev="2.4.0"/&gt; ``` ##### 1.7 夜间...

    Spring与Web环境集成1

    在非Web环境下,我们通常通过`new ClasspathXmlApplicationContext(spring配置文件)`来创建应用上下文对象。然而,在Web环境中,这样做可能导致配置文件加载多次,创建多个应用上下文对象,造成资源浪费。为了解决...

    spring-webflow-reference

    通过阅读Spring Web Flow的参考指南,开发者可以掌握如何定义和管理Web应用中的复杂业务流程,以及如何使用EL表达式在流程中操作数据。此外,了解视图渲染机制能够帮助开发者更有效地将流程数据展示给用户。随着...

    spring-web.jar spring-webmvc.jar

    1. **Servlet上下文**:`spring-web.jar`提供了`WebApplicationContext`,这是Spring应用程序在Web环境中的上下文。它允许bean与Servlet上下文进行交互,例如注册监听器、过滤器等。 2. **HTTP处理**:包括`...

    在 Spring Web Flow 项目中应用 Hessian 服务

    4. **在SWF中使用Hessian服务**:将生成的Hessian代理注入到SWF的模型或者控制器中,然后在流程中的适当位置调用这些远程方法,执行业务逻辑。 5. **异常处理和安全考虑**:由于服务调用跨越了网络,我们需要考虑...

    spring web flow入门

    - **统一的技术栈**:无论是在Struts、Spring MVC、Tapestry还是JSP等环境中,SWF都提供了一套通用的解决方案。 - **简化复杂逻辑**:SWF通过预定义的契约和自动化的生命周期管理,简化了复杂页面流程的实现,降低了...

    Spring Webscripts Reference Documentation

    在Spring框架中,Webscripts主要用于构建可复用、可维护的Web应用逻辑。它们将业务逻辑、数据处理和视图渲染整合在一起,形成一个独立的单元,可以方便地进行部署和管理。通过使用Spring Webscripts,开发者能够更...

    Spring 5.0 web 官方文档 转PDF

    这一部分的文档也适用于那些熟悉Spring但想要了解如何在Servlet环境中使用Spring的开发人员。除了Spring Web MVC之外,Spring框架还为反应式编程模型提供了支持,使得开发者可以根据需要选择传统的基于Servlet的Web...

    Spring源代码解析(二):IoC容器在Web容器中的启动.doc

    当我们在Web环境中运行Spring应用时,IoC容器需要在Web容器(如Tomcat、Jetty等)中启动并运行。这个过程涉及到一系列的初始化步骤,确保Spring能够正确地与Web容器集成。 首先,`WebApplicationContext`是`...

    Spring maven web java

    在"Spring Maven Web Java"的场景下,开发者通常会使用Maven作为构建工具,管理Spring框架及其相关依赖。Spring MVC作为Web应用的开发框架,提供了处理HTTP请求、转发到控制器、数据绑定、视图渲染等功能。开发者...

    SpringABC:Spring 应用程序的非 Web 示例

    通过分析这个项目,你可以学习如何在非Web环境中使用Spring,如何定义和管理bean,以及如何利用ApplicationContext来启动和运行应用程序。同时,也可以探索Spring其他高级特性的使用,如AOP、事务管理等。通过实践和...

Global site tag (gtag.js) - Google Analytics