- 浏览: 517179 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (278)
- java (41)
- 设计模式 (4)
- sql (10)
- webservice (2)
- spring (9)
- struts (6)
- struts2 (32)
- hibernate (27)
- Struts_hibernate_Spring整合 (4)
- Velocity (1)
- Servlet (9)
- JSP (6)
- javascript (19)
- jquery (10)
- ajax (4)
- html、xml (3)
- JDBC (2)
- JDK (6)
- mysql (2)
- oracle (11)
- SqlServer (1)
- DB2 (4)
- tool (7)
- linux (5)
- UML (1)
- eclipse (8)
- 执行文件 (1)
- 应用服务器 (4)
- 代码重构 (1)
- 日本語 (19)
- 交规 (1)
- office (9)
- firefox (1)
- net (1)
- 测试 (1)
- temp (6)
- 对日外包 (1)
- windows (1)
- 版本控制 (1)
- android (2)
- 项目管理 (1)
最新评论
转自: http://tjc.iteye.com/blog/339354
情景设定:
首先简单介绍一下Spring的Bean作用域
singleton 在每个Spring IoC容器中一个bean定义对应一个对象实例。
prototype 一个bean定义对应多个对象实例。
request 在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各 自的bean实例, 它们
依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。
session 在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web
的Spring ApplicationContext情 形下有效。
global session 在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet
context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。
以上就是Spring对于容器中bean的几种作用域含义的简单描述。我们重点关注一下singleton,prototype这两种作用域。
★★关于singleton:
use it like this
or
★★关于prototype:
The non-singleton, prototype scope of bean deployment results in the creation of a new bean instance every
time a request for that specific bean is made (that is, it is injected into another bean or it is requested via a programmatic getBean() method call on the container). As a rule of thumb, you should use the prototype scope for all beans that are stateful, while the singleton scope should be used for stateless beans.
use it like this
or
顺便注意一下:
更多请参考Spring reference 3.4.2. The prototype scope
OK,问题出来了
然而,你可能需要在运行期让singleton-scoped bean每次都获得prototype-scoped bean的新实例。在这种情况下,只将prototype-scoped bean注入到你的singleton bean中是没有用的,因为正如上文所说的,仅仅在当Spring容器实例化singleton bean并且处理注入的依赖时,生成唯一实例。
这种情况改怎么解决呢?
oh,我不用Spring 行吗?
行,你又回到起点了....
Spring 为我们提供了方法注入lookup-method 来解决这个问题。我们来体验一下。
一下code参考http://java.ccidnet.com/art/3739/20060317/481857_1.html
在之前搭建的环境的基础上添加cglib库,copy SPRING_HOME/lib/cglib-2.1_x.jar to
classpath.
新建com.ufinity.spring.lookupmethod package;
编写如下文件
Hello.java
public interface Hello { public Random getRandom(); public abstract Random createRandom(); }
HelloAbstract.java
public abstract class HelloAbstract implements Hello { private Random random; public Random getRandom() { return random; } public void setRandom(Random random) { this.random = random; } public abstract Random createRandom(); }
Random.java
public class Random { private int i = (int) (100 * Math.random()); public void printRandom() { System.out.println("输出随机整数: " + i); } }
配置你的bean
<?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="ran" class="com.ufinity.spring.lookupmethod.Random" scope="prototype"/> <bean id="hello" class="com.ufinity.spring.lookupmethod.HelloAbstract"> <lookup-method name="createRandom" bean="ran"/> <property name="random"> <ref local="ran"/> </property> </bean> </beans>
OK,just test
LookUpMethodTest.java
public class LookUpMethodTest { @Test public void testLookupMethod() { Resource res = new ClassPathResource("applicationContext-lookupmethod.xml"); BeanFactory ft = new XmlBeanFactory(res); Hello h = (Hello) ft.getBean("hello"); Random r1 = h.getRandom(); Random r2 = h.getRandom(); System.out.println("没有采用Lookup方法注入:"); System.out.println("Random 的两个实例指向同一个引用:" + (r1 == r2)); r1.printRandom(); r2.printRandom(); Random r3 = h.createRandom(); Random r4 = h.createRandom(); System.out.println("\n采用Lookup方法注入:"); System.out.println("Random 的两个实例指向同一个引用:" + (r3 == r4)); r3.printRandom(); r4.printRandom(); } }
output:
Random 的两个实例指向同一个引用:true
输出随机整数: 65
输出随机整数: 65
采用Lookup方法注入:
Random 的两个实例指向同一个引用:false
输出随机整数: 97
输出随机整数: 69
发表评论
文章已被作者锁定,不允许评论。
-
SpringMVC 数据绑定全面示例(复杂对象,数组等)
2016-01-11 11:41 1061SpringMVC 数据绑定全面示例(复杂对象,数组等) ... -
Spring 相关问题(一)
2011-05-10 11:21 889一、 Spring dataSource 配置 (数据源配置 ... -
lookup-method (1)
2010-07-29 13:05 1074“Lookup方法”可以使Spring替换一个bean原有 ... -
注解事务,接口编程
2010-07-21 23:38 776转: http://www.iteye.com/topic/ ... -
HibernateDaoSupport getsession 不想用spring控制事务,可以自己控制
2010-06-12 13:17 1576public class TestOgi1DaoImpl ... -
HibernateDaoSupport getSession()不能释放资源
2010-06-12 10:23 17411、使用手动释放资源: ... -
spring 有三种启用模式 1ContextLoaderServlet 2.ContextLoaderListener 3.ContextLoaderPlu
2010-06-11 13:04 2261<?xml version="1.0" ... -
struts1+spring+hibernate 包冲突
2010-06-11 10:45 780去掉类路径上的关于Hibernate的3个libasm.jar ...
相关推荐
<lookup-method name="getClassB" bean="classB"/> ``` Java配置: ```java @Configuration public class AppConfig { @Bean @Scope("prototype") public ClassB classB() { return new ClassB(); } @...
// With "request" modulerequest ( { url : 'http://google.com' , method : 'GET' , lookup : lookup} , ( error , response , body ) => { // ...} ) ;// Direct usagelookup ( 'google.com' , { } , ( error , ...
dns-lookup- dns.lookup... method : 'GET' , lookup : lookup } , ( error , response , body ) => { // ... } ) ; // Direct usage lookup ( 'google.com' , { } , ( error , address , family ) => { // ... }
lookup-method 可以用来注入 Bean,避免了硬编码的依赖关系。 7. 使用 factory-method 来实例化 Bean factory-method 可以用来实例化 Bean,提供了更多的灵活性。 8. 使用 depends-on 来指定 Bean 的依赖关系 ...
`<lookup-method>`元素用于定义一个lookup-method,`<property>`元素用于设置Bean的属性值。 接口和实现类 在本文示例中,我们定义了两个接口:Dog和Person。Dog接口定义了一个run方法,Person接口定义了一个hunt...
Spring系列第12篇:lazy-init:bean延迟初始化Spring系列第13篇:使用继承简化bean配置(abstract & parent)Spring系列第14篇:lookup-method和replaced-method比较陌生,怎么玩的?Spring系列第15篇:代理详解(Java...
远程方法调用(Remote Method Invocation,RMI)是Java编程语言中的一种机制,它允许一个对象在某个Java虚拟机(JVM)上执行方法,而该对象实际位于另一个JVM中。这种技术使得分布式计算成为可能,使得Java应用程序...
2. 使用方法注入(lookup-method),让容器在运行时重写bean的方法,返回其他bean的新实例。 Spring还提供了定制bean生命周期行为的机制。例如,可以在bean初始化完成后执行特定操作: 1. 使用`init-method`属性,...
<lookup-method name="create" bean="StudentResource"/> <lookup-method name="create" bean="StudentsResource"/> ``` 这段配置指定了两个URL路径:`/student/{studentId}` 和 `/student`,...
在Java编程领域,远程方法调用(Remote Method Invocation,RMI)是一种强大的技术,它允许一个Java对象在某个JVM(Java虚拟机)上执行另一个JVM中的对象的方法。RMI是分布式计算的基础,尤其在构建分布式应用程序时...
例如,在提供的代码示例中,我们看到了一个名为`useType`的Bean实例被定义,并且通过`<lookup-method>`指定了一个名为`getMyType`的方法,该方法返回另一个名为`test.sat.type.MyType.TypeOne`的Bean实例。...
在`<bean>`元素中,`lookup-method`和`replaced-method`属性的引入,使得在运行时动态查找或替换bean的方法成为可能,这是对AOP(面向切面编程)的一种补充,提供了更细粒度的控制。 除此之外,`<util>`命名空间在...
在解析`bean`时,会创建`GenericBeanDefinition`对象,设置属性,处理元数据、lookup-method、replaced-method、构造参数、属性、qualifier等。 4. **自定义标签解析**: - 自定义标签解析涉及到Spring的命名空间...
在上面的示例中,我们使用 lookup-method 标签来注入 getAuthor() 方法,该方法将返回一个新的 Author Bean 的实例。 四、单元测试 为了验证上述实现,我们可以编写单元测试来测试该实现。例如,我们可以编写以下...
10. **使用`<lookup-method>`和`<factory-method>`**: 这两个元素允许在运行时动态创建bean,而不是在配置时静态定义。这对于实现策略模式或动态代理等场景很有帮助。 11. **使用`<bean>`的`lazy-init`属性**: ...
除了这些核心概念,Spring的XML配置还包括其他元素,如`<import>`引入其他配置文件,`<alias>`为bean定义别名,以及`<lookup-method>`和`<replaced-method>`来处理方法的动态代理等。XML配置提供了一种声明式的方式...
- 0000776: UniDBLookUpXXX: ListSource cursor position does not follow Lookup value - 0000773: UniDBGrid: Column.Title.Font/Color - 0000771: UniDBGrid: Column.Font property - 0000772: UniDBGrid: ...
--dns-timeout=SECS set the DNS lookup timeout to SECS. --connect-timeout=SECS set the connect timeout to SECS. --read-timeout=SECS set the read timeout to SECS. -w, --wait=SECONDS wait SECONDS ...