框架版本
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”旨在为初学者提供一个清晰易懂的入门起点,通过一个简单的实例帮助理解Struts2的核心概念和配置。 首先,Struts2.0.14是该框架的一个早期版本,它在当时的Java社区中广泛使用...
Struts 2.0.14 是一个较早版本的 Apache Struts 框架,它是一个基于模型-视图-控制器(MVC)设计模式的Java Web应用程序框架。Struts 2 提供了用于构建企业级应用的结构,允许开发者更轻松地处理HTTP请求、业务逻辑...
10. **生命周期**:当一个HTTP请求到达服务器时,Struts 2会创建Action实例,执行相应的业务逻辑,然后根据返回的结果类型选择跳转目标,最后销毁Action实例以避免内存泄漏。 总的来说,“struts-2.0.14jar(all)包....
8. **生命周期管理**: Struts 2利用Spring等依赖注入框架管理Action实例的生命周期,实现了Action的单例或多例模式。这在`com/opensymphony/xwork2/inject`包下的类中有所体现。 9. **异常处理**: Struts 2提供了...
通过这个插件,Struts2可以识别并直接注入由Spring管理的bean,无需手动配置Action实例,提高了代码的可测试性和解耦性。 标签中的"S2SH"指的是经典的JavaEE开发组合——Struts2 + Spring + Hibernate。Hibernate是...
- Action实例化:在整合后,Action实例由Spring容器创建和管理,而不是由Struts2创建,这有利于进行依赖注入。 - Spring Action代理:Struts2-Spring插件会创建一个Spring代理,这个代理将调用实际的Spring管理的...
### Struts 2综合应用实例——添加学生信息 #### 实验背景与目标 在本实验中,我们将通过构建一个简单的Web应用程序——添加学生信息——来深入理解并掌握Struts 2框架的应用。此实验旨在帮助学习者熟悉Struts 2的...
在整合Spring时,Struts2可以利用Spring的依赖注入(DI)特性,将Service层对象注入到Action中,使得Action无需手动创建Service实例。 接下来,Hibernate是一个对象关系映射(ORM)框架,它简化了数据库操作。在本...
4. 创建Action的实例,并将请求参数绑定到Action的属性。 5. 调用Action的`execute()`方法,执行业务逻辑。 6. 根据`execute()`方法的返回值,决定跳转到哪个结果页面或进行其他处理。 此外,可以通过`struts....
在实际项目中,你需要根据需求配置web.xml、struts.xml文件,编写Action类,创建视图页面,并进行必要的安全设置。 总的来说,Struts2作为一个成熟的Java web框架,为开发者提供了丰富的功能和灵活的扩展性,是构建...
"struts2-mailreader-2.0.14.war"和"struts2-blank-2.0.14.war"是两个示例项目。MailReader示例展示了如何使用Struts2处理邮件阅读的业务,包括登录验证、邮件列表展示等功能,而Blank项目则是一个基础模板,提供了...
### Struts 2、Hibernate、Spring的整合应用实例 #### 一、概述 在Java EE领域,Struts 2、Hibernate以及Spring这三个框架被广泛应用于构建高性能的企业级应用。Struts 2负责处理用户交互及页面展示;Hibernate...
3. **ValueStack**:管理Action实例和值栈对象的地方,是OGNL表达式查找和设置值的对象容器。 在实际开发中,我们还需要关注Struts2的配置,例如: - **struts-default.xml**:定义了一些默认的拦截器栈和结果类型...
### S2SH整合实例:Struts2.0、Spring2.6、Hibernate3.2 在本篇文章中,我们将深入探讨如何将Struts2.0、Spring2.6与Hibernate3.2进行整合,构建一个典型的三层架构应用系统。本文旨在为初学者提供一个完整的示例,...
这将告诉Struts2使用Spring对象工厂来创建Action实例。 4. **Action配置**:在Struts2配置中,不再需要指定Action类的完全限定名,而是使用Spring的bean ID。例如: ```xml <action name="myAction" class=...
每个Action类对应一个业务逻辑操作,当用户发起请求时,Struts 2会根据配置文件找到对应的Action实例来处理请求。ActionContext则是存储请求上下文信息的对象,它包含了当前线程的所有运行时信息,如值栈、session、...
- **ValueStack**:负责管理并提供对Action实例和模型对象的访问。 2. **struts2-core-2.0.14.jar**: 这是Struts2的核心库,它整合了XWork并添加了更多的特性,如MVC设计模式、配置管理、插件支持等。主要包含...
随后,`ActionProxy`创建一个`ActionInvocation`实例,并通过代理模式调用Action。 5. **拦截器(Interceptor)介入**:在调用Action前,`ActionInvocation`会根据配置加载与Action相关的所有拦截器,这些拦截器可以...
- `ValueStack`:存储Action实例和Ognl表达式,方便在视图层访问模型数据。 2. **freemarker-2.3.8.jar**:FreeMarker是一个模板引擎,用于生成动态HTML或其他格式的输出。在Struts2中,FreeMarker通常作为视图层...