`
wmj2003
  • 浏览: 99676 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

struts2.0.14何时创建的action实例?

阅读更多

框架版本

struts2.0.14  xwork2.0.7  spring2.0.8

在web应用启动的时候,所有的action都已经通过装载到classloader了。

1、单独使用struts2时action是如何实例化的?

com.opensymphony.xwork2.ObjectFactory 中的方法buildAction()

然后跟踪buildAction方法,不难找到action是如何实例化的

第一步:

    public Object buildAction(String actionName, String namespace, ActionConfig config, Map extraContext) throws Exception {
        return buildBean(config.getClassName(), extraContext);
    }

第二步:

    public Object buildBean(String className, Map extraContext) throws Exception {
        return buildBean(className, extraContext, true);
    }

第三步:

    public Object buildBean(String className, Map extraContext, boolean injectInternal) throws Exception {

        Class clazz = getClassInstance(className);
        Object obj = buildBean(clazz, extraContext);
        if (injectInternal) {
            injectInternalBeans(obj);
        }

        return obj;
    }

第四步:

    public Object buildBean(Class clazz, Map extraContext) throws Exception {
        return clazz.newInstance(); //实例化
    }

2、struts2和spring结合的时候,action是如何实例化的?

com.opensymphony.xwork2.spring.SpringObjectFactory

DefaultActionInvocation

 

protected void createAction(Map contextMap) {

 

ObjectFactory

    public Object buildAction(String actionName, String namespace, ActionConfig config, Map extraContext) throws Exception {

        return buildBean(config.getClassName(), extraContext);

}

 

 

springObjectFactory

   /**

     * @param clazz

     * @param extraContext

     * @throws Exception

     */

    public Object buildBean(Class clazz, Map extraContext) throws Exception {

        Object bean;

        //先调用子类的buildBean然后调用父类的

        try {

            bean = autoWiringFactory.autowire(clazz, AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, false);

        } catch (UnsatisfiedDependencyException e) {

        System.out.println("fall back 实例化"); //Fall back

            bean = super.buildBean(clazz, extraContext);

        }

 

        bean = autoWiringFactory.applyBeanPostProcessorsBeforeInitialization(bean, bean.getClass().getName());

        // We don't need to call the init-method since one won't be registered.

        bean = autoWiringFactory.applyBeanPostProcessorsAfterInitialization(bean, bean.getClass().getName());

        return autoWireBean(bean, autoWiringFactory);

    }

======然后是spring=的源代码 (一开始没有超这个方面想,浪费了很多的时间)===============

    public Object autowire(Class beanClass, int autowireMode, boolean dependencyCheck)

           throws BeansException {

 

       // Use non-singleton bean definition, to avoid registering bean as dependent bean.

       RootBeanDefinition bd = new RootBeanDefinition(beanClass, autowireMode, dependencyCheck);

       bd.setScope(BeanDefinition.SCOPE_PROTOTYPE); //scope=”prototype”

       if (bd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR) { //通过构造方法来构造一个类的实例

           return autowireConstructor(beanClass.getName(), bd, null).getWrappedInstance(); //在这里通过构造方法创建了一个新的实例

       }

       else {

           Object bean = getInstantiationStrategy().instantiate(bd, null, this);

           populateBean(beanClass.getName(), bd, new BeanWrapperImpl(bean));

           return bean;

       }

    }

通过上面的分析,在spring和struts2结合的时候

采用方式一:

在struts2-你的应用.xml中配置action

  <action name="detail" class="com.work.code.codegroup.CodeGroupAction"
   method="load">
   <result>/code/codegroup/detail.jsp</result>
  </action>

spring默认的是default-autowire="byName"  ,spring的配置文件中只配置你的service层和dao层即可,不需要再配置action了

方式二:

  <action name="detail" class="CodeGroupAction"
   method="load">
   <result>/code/codegroup/detail.jsp</result>
  </action>

 <bean id="CodeGroupAction" class="com.work.code.codegroup.CodeGroupAction" scope="prototype" />

 <bean id="codeGroupDao" class="com.work.code.codegroup.CodeGroupDaoJdbcImpl">
  <property name="dataSource" ref="dataSource" />
 </bean>
 <bean id="codeGroupServiceDao"
  class="com.work.code.codegroup.CodeGroupServiceDaoImpl">
  <property name="codeGroupDao" ref="codeGroupDao" />
  <property name="codeClassDao" ref="codeClassDao" />
 </bean>

注意:必须配置 scope="prototype" ,否则spring创建的action将是单例的,线程不安全,会引发数据混乱。

所以建议大家使用方式一,而不是方式二。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wmj2003/archive/2009/12/16/5018927.aspx

分享到:
评论

相关推荐

    helloWorld-struts2.0.14.rar

    本教程“helloWorld-struts2.0.14.rar”旨在为初学者提供一个清晰易懂的入门起点,通过一个简单的实例帮助理解Struts2的核心概念和配置。 首先,Struts2.0.14是该框架的一个早期版本,它在当时的Java社区中广泛使用...

    struts-2.0.14-all.zip

    Struts 2.0.14 是一个较早版本的 Apache Struts 框架,它是一个基于模型-视图-控制器(MVC)设计模式的Java Web应用程序框架。Struts 2 提供了用于构建企业级应用的结构,允许开发者更轻松地处理HTTP请求、业务逻辑...

    struts-2.0.14jar(all)包.rar

    10. **生命周期**:当一个HTTP请求到达服务器时,Struts 2会创建Action实例,执行相应的业务逻辑,然后根据返回的结果类型选择跳转目标,最后销毁Action实例以避免内存泄漏。 总的来说,“struts-2.0.14jar(all)包....

    struts-2.0.14源代码

    8. **生命周期管理**: Struts 2利用Spring等依赖注入框架管理Action实例的生命周期,实现了Action的单例或多例模式。这在`com/opensymphony/xwork2/inject`包下的类中有所体现。 9. **异常处理**: Struts 2提供了...

    struts2-2.0.14

    通过这个插件,Struts2可以识别并直接注入由Spring管理的bean,无需手动配置Action实例,提高了代码的可测试性和解耦性。 标签中的"S2SH"指的是经典的JavaEE开发组合——Struts2 + Spring + Hibernate。Hibernate是...

    struts-2.0.14-all.rar

    - Action实例化:在整合后,Action实例由Spring容器创建和管理,而不是由Struts2创建,这有利于进行依赖注入。 - Spring Action代理:Struts2-Spring插件会创建一个Spring代理,这个代理将调用实际的Spring管理的...

    Struts 2综合应用实例——添加学生信息

    ### Struts 2综合应用实例——添加学生信息 #### 实验背景与目标 在本实验中,我们将通过构建一个简单的Web应用程序——添加学生信息——来深入理解并掌握Struts 2框架的应用。此实验旨在帮助学习者熟悉Struts 2的...

    struts2 hibernate spring整合入门(附实例源码及jarbao--用户名字段的操作)

    在整合Spring时,Struts2可以利用Spring的依赖注入(DI)特性,将Service层对象注入到Action中,使得Action无需手动创建Service实例。 接下来,Hibernate是一个对象关系映射(ORM)框架,它简化了数据库操作。在本...

    Struts 2.0

    4. 创建Action的实例,并将请求参数绑定到Action的属性。 5. 调用Action的`execute()`方法,执行业务逻辑。 6. 根据`execute()`方法的返回值,决定跳转到哪个结果页面或进行其他处理。 此外,可以通过`struts....

    struts2 实例

    在实际项目中,你需要根据需求配置web.xml、struts.xml文件,编写Action类,创建视图页面,并进行必要的安全设置。 总的来说,Struts2作为一个成熟的Java web框架,为开发者提供了丰富的功能和灵活的扩展性,是构建...

    struts2案例 struts2 struts2源码

    "struts2-mailreader-2.0.14.war"和"struts2-blank-2.0.14.war"是两个示例项目。MailReader示例展示了如何使用Struts2处理邮件阅读的业务,包括登录验证、邮件列表展示等功能,而Blank项目则是一个基础模板,提供了...

    Struts 2、Hibernate、Spring的整合应用实例

    ### Struts 2、Hibernate、Spring的整合应用实例 #### 一、概述 在Java EE领域,Struts 2、Hibernate以及Spring这三个框架被广泛应用于构建高性能的企业级应用。Struts 2负责处理用户交互及页面展示;Hibernate...

    Struts2最全jar包(绝对真实)

    3. **ValueStack**:管理Action实例和值栈对象的地方,是OGNL表达式查找和设置值的对象容器。 在实际开发中,我们还需要关注Struts2的配置,例如: - **struts-default.xml**:定义了一些默认的拦截器栈和结果类型...

    s2sh整合实例 Struts2.0 Spring2.6 Hibernate3.2

    ### S2SH整合实例:Struts2.0、Spring2.6、Hibernate3.2 在本篇文章中,我们将深入探讨如何将Struts2.0、Spring2.6与Hibernate3.2进行整合,构建一个典型的三层架构应用系统。本文旨在为初学者提供一个完整的示例,...

    配置 struct2 需要用到的 jar包

    这将告诉Struts2使用Spring对象工厂来创建Action实例。 4. **Action配置**:在Struts2配置中,不再需要指定Action类的完全限定名,而是使用Spring的bean ID。例如: ```xml &lt;action name="myAction" class=...

    xwork-2.0.7源码

    每个Action类对应一个业务逻辑操作,当用户发起请求时,Struts 2会根据配置文件找到对应的Action实例来处理请求。ActionContext则是存储请求上下文信息的对象,它包含了当前线程的所有运行时信息,如值栈、session、...

    struts2开发必备的jar包

    - **ValueStack**:负责管理并提供对Action实例和模型对象的访问。 2. **struts2-core-2.0.14.jar**: 这是Struts2的核心库,它整合了XWork并添加了更多的特性,如MVC设计模式、配置管理、插件支持等。主要包含...

    struts2基础

    随后,`ActionProxy`创建一个`ActionInvocation`实例,并通过代理模式调用Action。 5. **拦截器(Interceptor)介入**:在调用Action前,`ActionInvocation`会根据配置加载与Action相关的所有拦截器,这些拦截器可以...

    struts2类库

    - `ValueStack`:存储Action实例和Ognl表达式,方便在视图层访问模型数据。 2. **freemarker-2.3.8.jar**:FreeMarker是一个模板引擎,用于生成动态HTML或其他格式的输出。在Struts2中,FreeMarker通常作为视图层...

Global site tag (gtag.js) - Google Analytics