当singleton Bean依赖propotype Bean,可以使用在配置Bean添加look-method来解决

在Spring里面,当一个singleton bean依赖一个prototype bean,因为singleton bean是单例的,因此prototype bean在singleton bean里面也会变成单例.

这个怎么解决呢???可以使用Spring提供的lookup-method来注入。

举例说明:先列出相关类:代码中的说明足够说明问题。user类:prototype bean

package com.cn.pojo;

import java.io.Serializable;

public class User implements Serializable{

	/**
	 *
	 */
	private static final long serialVersionUID = 1L;

	private int userId;
	private String userName;
	private String userPwd;
	private String userInfo;
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getUserPwd() {
		return userPwd;
	}
	public void setUserPwd(String userPwd) {
		this.userPwd = userPwd;
	}
	public String getUserInfo() {
		return userInfo;
	}
	public void setUserInfo(String userInfo) {
		this.userInfo = userInfo;
	} 

}

LookupMethod类:singleton bean

package com.cn.springTest;

import com.cn.pojo.User;

/**
 * LookupMethod为singleton,user为propotype
 * 当singleton Bean依赖propotype Bean,可以使用在配置Bean添加look-method来解决
 * @author Administrator
 *
 */
public class LookupMethod {
		private User user;

		public User getUser() {
			return user;
		}

		public void setUser(User user) {
			this.user = user;
		}

}

核心配置文件:

<!-- user userbean -->
	<bean id ="user" class="com.cn.pojo.User" scope="prototype">
	   <property name="userId" value="1" />
	   <property name="userName" value="userName" />
	   <property name="userPwd" value="userPwd" />
	   <property name="userInfo" value="userInfo" />
	</bean>

	<!-- lookupMethod  LookupMethod为单例,user为原型的获取实例-->
	<bean id ="lookupMethod" class="com.cn.springTest.LookupMethod">
		<!-- <property name="user" ref="user"/> -->  <!-- 这种写法会将user当着单例来获取-->
	    <lookup-method name="getUser" bean="user"/><!--lookup-method方式会将user当着原型来获取-->
	</bean>

测试类:SpringLookupMethod

import com.cn.util.SpringContextUtil;

public class SpringLookupMethod {

	public static void main(String[] args) {
		ApplicationContext actx = new ClassPathXmlApplicationContext("ApplicationContext.xml");
		actx.getBean("springContextUtil");
		LookupMethod lookupMethod = (LookupMethod) SpringContextUtil.getBean("lookupMethod");
		System.out.println(lookupMethod);
		LookupMethod lookupMethod1 = (LookupMethod) SpringContextUtil.getBean("lookupMethod");
		System.out.println(lookupMethod1);
		System.out.println(lookupMethod.getUser());
		System.out.println(lookupMethod1.getUser());
		System.out.println(lookupMethod.getUser());
		System.out.println(lookupMethod1.getUser());
	}

}

这样的测试足够说明问题。

时间: 2024-11-07 18:33:48

当singleton Bean依赖propotype Bean,可以使用在配置Bean添加look-method来解决的相关文章

4.spriing:Bean的生命周期/工厂方法配置Bean/FactoryBean

1.Bean的生命周期 scope:singleton/prototype 1)spring容器管理singleton作用的生命周期,spring能够精确知道Bean合适创建,何时初始化完成,以及何时被销毁 2)spring容器管理prototype作用的生命周期,spring只负责创建,容器实例化之后就交给客户端进行管理,spring容器不会再 跟踪其生命周期. 可以借鉴servlet的生命周期"实例化--初始化--接受请求--销毁" Spring IOC容器可以管理Bean的生命周

Spring -- spEL&amp;Bean的生命周期&amp;工厂方法配置Bean

对于学习spring有帮助的网站:http://jinnianshilongnian.iteye.com/blog/1482071 Spring表达式语言:SpEL Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言. 语法类似于 EL:SpEL 使用 #{-} 作为定界符,所有在大框号中的字符都将被认为是 SpEL SpEL 为 bean 的属性进行动态赋值提供了便利 通过 SpEL 可以实现: 1.通过 bean 的 id 对 bean 进行引用 2

Spring中&lt;bean&gt;标签之使用p标签配置bean的属性

在spring的bean配置文件中我们常可以见到下面的例子: <bean id="user" class="com.sys.User" p:name-ref="name" /> 其中,p:name-ref="name"使用了p标签来配置bean的name的引用. 在使用p标签配置bean的属性时,我们先要声明p标签的命名空间xmlns:p="http://www.springframework.org/s

Spring配置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:util="http://www.springframework.org/sch

Spring--通过注解来配置bean【转】

Spring通过注解配置bean 基于注解配置bean 基于注解来配置bean的属性 在classpath中扫描组件 组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定的组件包括: [email protected]:基本注解,标识了一个受Spring管理的组件 [email protected]:标识持久层组件 [email protected]:标识服务层(业务层)组件 [email protected]:

Spring--通过注解来配置bean

Spring通过注解配置bean 基于注解配置bean 基于注解来配置bean的属性 在classpath中扫描组件 组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定的组件包括: [email protected]:基本注解,标识了一个受Spring管理的组件 [email protected]:标识持久层组件 [email protected]:标识服务层(业务层)组件 [email protected]:

Spring_通过工厂方法配置 Bean

beans-factory.xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.s

Spring使用教程(二)配置bean:静态工厂方法和实例工厂方法

public class Car { private String brand; private double price; public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public double getPrice() { return price; } public void setPrice(double price) { this.

spring 通过工厂方法配置Bean

概要: 通过调用静态工厂方法创建Bean 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中.当client须要对象时,仅仅须要简单地调用静态方法,而不用关心创建对象地细节. 要声明通过静态方法创建的Bean,须要在Bean地class属性里指定拥有该工厂的方法的类,同一时候在factory-method属性里指定工厂方法的名称.最后,使用<constructor-arg>元素为该方法传递方法參数 通过调用实例工厂方法创建Bean 实例工厂方法:将对象的创建过程封装到另外一个对象实