- 浏览: 1229688 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (718)
- HTML (13)
- JS基础 (23)
- JS应用 (40)
- AJAX (6)
- JSP相关 (12)
- JAVA基础 (52)
- JAVA应用 (74)
- APPLET (11)
- SWING\RCP (2)
- JAVA反射 (6)
- 设计模式 (26)
- 数据库设计 (20)
- Struts (35)
- Struts2 (12)
- Spring (22)
- Hibernate (45)
- Ibatis (18)
- mybatis (3)
- SSH (8)
- UML (5)
- WebService (3)
- XML (16)
- Log4j (7)
- WEB容器 (26)
- 数据结构 (36)
- Linux (34)
- Ruby on Rails (1)
- 其它技术 (27)
- IDE配置 (15)
- 项目实战 (2)
- Oracle (69)
- JAVA报表 (7)
- Android学习 (2)
- 博客链接 (1)
- 网络基础 (1)
- WEB集群 (1)
- .Net开发 (11)
- PB (4)
- 系统构建 (15)
最新评论
-
jnjeC:
牛逼啊哥们,讲得太好了
Maven仓库理解、如何引入本地包、Maven多种方式打可执行jar包 -
九尾狐的yi巴:
很好 感谢!
Itext中文处理(更新版) -
luweifeng1983:
有用的,重启一下嘛。
设置eclipse外部修改文件后自动刷新 -
Master-Gao:
设置了也不管用,怎么破呢?
设置eclipse外部修改文件后自动刷新 -
aigo_h:
锋子还有时间写博客,还是很闲哈!
Add directory entries问题
我们知道在Struts中Action是从map中拿出来的,是单实例的。那么在多线程调用的时候会出问题。
那么在Spring中通过getBean方法每调用一次,spring都会new一个实例给我们,所以可以利用这一点把Struts中action的创建交给Spring来处理。
Spring Bean的作用域:
Bean作用域
在每个Spring IoC容器中一个bean定义对应一个对象实例。 |
|
一个bean定义对应多个对象实例。 |
|
在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用域仅在基于web的Spring |
|
在一个HTTP |
|
在一个全局的HTTP |
继续之前先回顾一下==与equals的用法
我们说==比较的是两个对象的地址,而equals比较的是两个对象的内容。所以
String s1 = new String("sfsf"); String s2 = new String("sfsf"); System.out.println(s1==s2); System.out.println(s1.equals(s2));
上面打印的结果为:
false true
说明:s1,s2分别在栈中分配内存,即两个局部变量。那么他们的值存放的是地址。
new String的时候会在堆中分配对象的空间,显然调用了两次new分配了两个对象的地址。所以s1与s2的值即地址是不一样的,所以s1==s2返回为false.
而s1.equals(s2)比较的是两个对象的内容,显然对象内容都是sfsf所以返回为true.
相关知识如:
String s = new String("xyz");创建了几个String Object 答:"xyz"本身作为字符常量,在汇编语言中应该作为常量放在数据段,Java有一个类似数据段的constant pool保存这个常量,在classloader加载这个类的时候就把"xyz"和这个类的其他一些信息放在constant pool new String("xyz")根据常量"xyz"在heap上创建String对象所以,一共两个对象 String(String original) Initializes a newly created String object so that it represents the same sequence of characters as the argument; in other words, the newly created string is a copy of the argument string.
那么现在我们对从spring得到的对象进行测试。
测试代码:
package com.lwf.bean; public class Bean1 { }
配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <bean id="bean1" class="com.lwf.bean.Bean1"></bean> </beans>
测试类:
package com.lwf.client; import junit.framework.TestCase; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.lwf.bean.Bean1; public class Client extends TestCase { public void testScope() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext*.xml"); Bean1 bean1 = (Bean1)ctx.getBean("bean1"); Bean1 bean2 = (Bean1)ctx.getBean("bean1"); System.out.println(bean1==bean2); System.out.println(bean1.equals(bean2)); } }
运行结果:
2010-05-19 14:34:07,419 INFO [org.springframework.context.support.ClassPathXmlApplicationContext] - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1c78e57: display name [org.springframework.context.support.ClassPathXmlApplicationContext@1c78e57]; startup date [Wed May 19 14:34:07 CST 2010]; root of context hierarchy 2010-05-19 14:34:07,654 INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - Loading XML bean definitions from file [D:\workdirlocal\SpringBean\bin\applicationContext.xml] 2010-05-19 14:34:08,076 INFO [org.springframework.context.support.ClassPathXmlApplicationContext] - Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@1c78e57]: org.springframework.beans.factory.support.DefaultListableBeanFactory@80fa6f 2010-05-19 14:34:08,123 INFO [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@80fa6f: defining beans [bean1]; root of factory hierarchy true true
测试发现bean1==bean2,bean1.equals(bean2)均返回为true。这说明默认的情况下,Spring采用的是单例Singleton模式创建对象,一旦创建,以后每次只是把引用返回。所以所有返回的对象都是同一个。
这个在配置文件中是可以修改的,如我们在bean的配置上增加scope属性:
<bean id="bean1" class="com.lwf.bean.Bean1" scope="prototype"></bean>
测试上面代码:
结果为:
2010-05-19 16:05:47,353 INFO [org.springframework.context.support.ClassPathXmlApplicationContext] - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1c78e57: display name [org.springframework.context.support.ClassPathXmlApplicationContext@1c78e57]; startup date [Wed May 19 16:05:47 CST 2010]; root of context hierarchy 2010-05-19 16:05:47,524 INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - Loading XML bean definitions from file [D:\workdirlocal\SpringBean\bin\applicationContext.xml] 2010-05-19 16:05:47,899 INFO [org.springframework.context.support.ClassPathXmlApplicationContext] - Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@1c78e57]: org.springframework.beans.factory.support.DefaultListableBeanFactory@80fa6f 2010-05-19 16:05:47,931 INFO [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@80fa6f: defining beans [bean1]; root of factory hierarchy false false
可以看到返回为false,false即每次创建的实例是不同的。我们在使用这一特性解决struts action单实例时就要这样配置。
Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。
发表评论
-
spring 3 和mybatis 3集成,并用junit4进行测试
2011-11-04 14:01 1465转:spring 3 和mybatis 3集成,并用junit ... -
java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource的解决方法
2011-11-03 16:17 2748用Myeclipse开发struts时,配置struts-co ... -
Strut2+Spring整合框架搭建
2011-11-02 22:19 1079参考:http://lukuijun.iteye.com/bl ... -
Spring+hibernate延迟加载报错解决办法之二
2010-06-29 17:28 1213在做删除操作的时候出现了org.springframework ... -
Spring+hibernate延迟加载报错解决办法之一
2010-06-29 17:25 1213我们在项目中一般都会使用Spring来管理Hibernate的 ... -
Spring项目中怎么配置log4j
2010-05-27 11:10 1586在spring项目中配置log4j http://blogg ... -
Spring与Struts集成方式三
2010-05-26 17:11 1152在集成方式一和二中我们是在web.xml中加入配置代码: & ... -
Spring与Struts集成方式二
2010-05-26 14:49 1045在集成方式一的基础上做改进: 第一种集成方案是在action ... -
Spring与Struts集成方式一
2010-05-25 14:13 916我们在Struts中在action类中调用Model层组件进行 ... -
Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)
2010-05-24 17:15 2770采用编程式事务 事务主要分为:编程式事务和声明式事务 ... -
修改Eclipse配置,使得在配置文件中完成自动完成功能。
2010-05-24 15:10 2300在Eclipse中引入spring的配置文件applicati ... -
Spring aop 基于schema的AOP支持及JoinPoint的使用、如何使用CGLIB代理
2010-05-24 14:52 4130基于schema的aop只是将配置写到配置文件中。 代 ... -
Spring AOP 概念理解及@AspectJ支持
2010-05-20 15:56 1585为了更好的理解Spring简介一文http://quicker ... -
Spirng AOP简介
2010-05-19 17:28 2285AOP 面向切面编程(AOP)通过提供另外一种思考程序结构的 ... -
Spring Bean中的自动装配——byType
2010-05-19 17:08 1183自动装配byType即通过查找类属性在配置文件中bean中定义 ... -
Spring Bean中的自动装配——byName
2010-05-19 16:34 3153自动装配(autowire)协作者 Spring IoC容器 ... -
Spring Bean定义的继承
2010-05-19 10:36 1328现有Bean2,Bean3,Bean4,Bean5 可观察到 ... -
Spring Set注入:基本类型、List、Map、Set、Array、Date类型注入
2010-05-18 15:58 11550Spring依赖注入有两种:构造器注入与Set注入 其中以S ... -
spring 初探
2010-05-17 16:53 1257Spring核心设计思想为IOC ... -
简单DAO层示例
2010-05-14 17:30 2081在使用spring架构之前,我们怎么设计自己的DAO层的呢? ...
相关推荐
- **Action类改造**:将Action类变为Spring的管理Bean,通常标记为`prototype`作用域,因为每个请求可能需要一个新的实例。 5. **Spring管理Struts的Action** 在Spring配置文件中,声明Struts Action为Bean,并...
Singleton 作用域是 Spring 容器默认的作用域,在这种作用域中, Bean 实例是共享的,所有对该 Bean 的请求都会返回同一个实例。这种作用域适合无状态的 Bean,例如 DAO 层和 Service 层。 在 Spring 配置文件中,...
在企业级应用开发中,Java 是一种广泛使用的编程语言,特别是在Spring框架的支持下,能够构建高效、可扩展的系统。Spring框架的核心特性之一是...选择正确的Bean作用域是实现高效且健壮的企业级应用开发的关键步骤。
在Spring的配置文件中定义bean,标记为`prototype`作用域,以便每次请求都能创建新的实例。 5. **Action类的注入** 在Action类中,可以使用@Autowired注解进行依赖注入,或者在Spring配置文件中声明并配置需要注入...
- 在 Struts 的动作映射配置中,不再直接定义 Action 类的全限定名,而是使用 Spring 定义的 Bean ID。例如,如果 Spring 配置文件中定义了一个名为 `myAction` 的 Bean,那么在 Struts 配置中应该引用这个 ID。 5...
通过这些知识点,我们可以看到Spring、Hibernate和Struts各自解决了企业级应用开发中的不同问题。Spring主要提供了一种轻量级的DI容器和AOP机制来帮助管理对象的生命周期和横切关注点;Hibernate则为Java应用程序...
2. 第二种方法是使用Spring插件,让Struts2直接从Spring容器中获取Action实例。在这种情况下,Struts2配置文件中的`class`属性不再指定具体类,而是Spring Bean的ID: ```xml <action name="LoginAction" class=...
这个插件使得Spring能够接管Struts的Action实例化过程,保证每个Action实例都是由Spring容器管理的。 4. **配置文件**:在整合过程中,需要在Spring的配置文件(如`applicationContext.xml`)中定义Action类,并...
2. **Struts2的Spring插件**:Struts2提供了一个Spring插件,该插件允许Struts2从Spring容器中获取Action实例,同时处理Action的依赖注入。 3. **共享Session作用域**:在整合后,Struts2和Spring可以共享Session...
【Struts2+Hibernate3.2+Spring2.0配置+入门实例】 本文将详细介绍如何配置和构建一个基于Struts2、Hibernate3.2和Spring2.0的企业级Java应用入门实例。首先,我们理解整体架构,这有助于我们更好地了解各个组件的...
这意味着Action Bean的ID被更改为Name,其Class和作用域也在Spring的配置中定义,通常作用域设置为`prototype`,以便每次请求都能创建一个新的Action实例。 #### 3. Spring配置深入 Spring的配置文件负责管理Bean...
"spring_scope"可能涵盖了Spring的Bean作用域,如Singleton、Prototype、Request、Session等,以及它们在不同场景下的应用。 Hibernate是一个对象关系映射(ORM)框架,简化了数据库操作。"spring_hibernate_1"和...
- **Bean 的作用域**:Spring 支持多种作用域,包括 singleton、prototype、request、session 和 application。 - **singleton**:单例模式,容器中只有一个 Bean 实例。 - **prototype**:原型模式,每次获取时...
4. 在Spring配置文件中定义Action类Bean,并设置为原型(prototype)作用域。 5. 配置Hibernate的SessionFactory和DataSource。 在实际开发中,我们通常按照数据库层(POJO和Hibernate映射)、数据访问层(DAO)、...
- 在使用Spring时,注意Bean的作用域,如singleton或prototype,以适应不同的需求。 8. **范例中的S22S2**: 压缩包文件S22S2可能包含了上述整合过程所需的所有文件,包括源代码、配置文件、库文件等。解压后,...
WebWork框架与Struts1相似,也存在线程安全问题,但它提供了更多的配置选项来解决这些问题。 - **WebWork中Action实例管理机制:** - WebWork框架默认也会复用`Action`实例,但可以通过配置文件来改变这种行为,...
②把action交给spring管理,即在spring配置文件中定义action Bean并使用依赖注入功能在action中注入业务Bean,同时修改作用域。 ③在struts.xml中的class使用第②步中所定义的action Bean 的id属性值。
1. **applicationContext.xml**:这是Spring的核心配置文件,用于定义Bean的定义,包括它们的依赖关系、初始化参数、作用域等。在这里,可能会配置Spring的DataSource、SessionFactory(Hibernate的配置)、Service...
由于Struts2中的Action对象是针对每个请求生成一个新的实例,而Spring默认使用`singleton`作用域来管理Bean。为了与Struts2保持一致,需要将Action的Scope设置为`prototype`或`session`。 - **`prototype`**:为每...
对于每个Action,其作用域(scope)通常被设定为`prototype`,这意味着每次请求都会创建一个新的Action实例,这有助于避免线程安全问题,同时可以更好地利用Spring的依赖注入特性。例如: ```xml <action name=...