`

bean多例

阅读更多

在实现多进程监控的时候修改原来的monitor agent代码以满足需求。原代码如下:

<bean id="agentRequestHanlder" class="com.XXX.monitor.AgentRequestHanlder"	scope="prototype" >
		<property name="agents">
			<map>
				<entry key="jstat" value-ref="jstat" />
				<entry key="load" value-ref="load" />
				<entry key="memory" value-ref="memory" />
				<entry key="cpu" value-ref="cpu" />
				<entry key="io" value-ref="io" />
				<entry key="file" value-ref="file" />
				<entry key="net" value-ref="net" />
				<entry key="pidIo" value-ref="pidIo" />
				<entry key="pidCpu" value-ref="pidCpu" />
				<entry key="jmeter" value-ref="jmeterAgent" />
			</map>
		</property>
	</bean>	
……
	<bean id="pidIo" class="com.XXX.monitor.agent.sysstat.PidIOAgent">
		<property name="transferDataSender" ref="transferDataSender"></property>
	</bean>
	<bean id="pidCpu" class="com.XXX.monitor.agent.sysstat.PidCpuAgent">
		<property name="transferDataSender" ref="transferDataSender"></property>
	</bean>

 

单进程监控时service中根据key(即监控的指标)在agents中匹配对应的监控类。对于多进程的话若依旧由于pidIo对应的bean是单例的,

所以最后的进程会覆盖之前的进程设置信息。对此将pidIo改为多例,即每次都会创建一个新对象。

但考虑到源代码的兼容性,以及其他人调用bean时不会产生错误,另外建立了两个bean方便调用,如下:

不知道是否合适……

	<bean id="agentRequestHanlder" class="com.XXX.monitor.AgentRequestHanlder"	scope="prototype" >
		<property name="agents">
			<map>
				<entry key="jstat" value-ref="jstat" />
				<entry key="load" value-ref="load" />
				<entry key="memory" value-ref="memory" />
				<entry key="cpu" value-ref="cpu" />
				<entry key="io" value-ref="io" />
				<entry key="file" value-ref="file" />
				<entry key="net" value-ref="net" />
				<entry key="pidIo" value-ref="pidIoProtoType" />
				<entry key="pidCpu" value-ref="pidCpuProtoType" />
				<entry key="jmeter" value-ref="jmeterAgent" />
			</map>
		</property>
	</bean>	
……
	<bean id="pidIo" class="com.XXX.monitor.agent.sysstat.PidIOAgent">
		<property name="transferDataSender" ref="transferDataSender"></property>
	</bean>
	<bean id="pidCpu" class="com.XXX.monitor.agent.sysstat.PidCpuAgent">
		<property name="transferDataSender" ref="transferDataSender"></property>
	</bean>
	<bean id="pidIoProtoType" class="com.XXX.monitor.agent.sysstat.PidIOAgent" scope="prototype">
		<property name="transferDataSender" ref="transferDataSender"></property>
	</bean>
	<bean id="pidCpuProtoType" class="com.XXX.monitor.agent.sysstat.PidCpuAgent" scope="prototype">
		<property name="transferDataSender" ref="transferDataSender"></property>
	</bean>

 

Ps:经过测试此种方法不合适,经作为教训留着把,因为agents这个map已经固定,用get方法得到的还是确定的实例。。。最终改成根据agents返回的结果动态生成实例,见http://trinea.iteye.com/admin/blogs/1003265

 

遇到的问题

1、spring2.0多例定义的方法

	<bean id="pidIo" class="com.XXX.monitor.agent.sysstat.PidIOAgent" singleton="false">
		<property name="transferDataSender" ref="transferDataSender"></property>
	</bean>

 

 xml会在singleton="false"处提示报错

cvc-complex-type.3.2.2: Attribute 'singleton' is not allowed to appear in element 'bean'.

原因为:

在spring2.0中,bean没有“singleton”这个属性,而是在“scope”中对它进行设定。“scope”可以设定为 “singleton”和“prototype”默认情况下是“singleton”即和原先的“singleton=true”性质一样。如果要实现多例模式则将“scope”设定为“prototype”,即和原先版本的“singleton=false”一样。

 

参考:

http://blog.csdn.net/zoucui/archive/2009/02/16/3897798.aspx

分享到:
评论

相关推荐

    Spring In Action-3.2@Scope单例、多例Bean

    Spring In Action-3.2@Scope单例、多例Bean,Spring In Action-3.2@Scope单例、多例Bean,Spring In Action-3.2@Scope单例、多例Bean,Spring In Action-3.2@Scope单例、多例Bean

    Spring Bean的初始化和销毁实例详解

    Spring Bean的初始化和销毁实例详解 Spring Bean的初始化和销毁是Spring框架中一个非常重要的概念,它们都是Bean生命周期中不可或缺的一部分。在Spring框架中,我们可以使用多种方式来控制Bean的初始化和销毁,以下...

    单例多例模式

    如果要产生多例,则需要在配置文件的bean中添加scope="prototype"。这将告诉Spring框架为每个请求创建一个新的对象实例。 三、为什么要用单例多例? 单例模式的优点是能够节省系统资源,避免了重复创建对象的开销...

    No bean named xxx available报错解决

    在本例中,报错信息是"No bean named 'student' available",意味着Spring容器找不到名为'student'的bean。为了解决这个问题,我们需要遵循Spring框架的bean定义和自动注入规则。以下是详细的分析和解决方案: 首先...

    Spring的Bean配置说明

    - **单例模式与多例模式**: - **`singleton`属性**:控制Bean是否以单例模式运行。当设置为`true`时(默认值),在同一个`BeanFactory`或`ApplicationContext`中,无论何时请求该Bean,都会返回相同的实例。如果...

    spring bean life cycle

    `scope`属性可以设定Bean的作用域,如单例(singleton)或多例(prototype)。 总的来说,Spring Bean生命周期的理解和灵活运用,能帮助我们更好地控制Bean的行为,实现更高效、更可控的依赖管理和资源管理。通过...

    java bean 转为JSON

    这里我们以Jackson为例,它是一个功能强大的JSON处理库。在`JsonUtil.java`中,可以定义一个转换方法: ```java import com.fasterxml.jackson.databind.ObjectMapper; public class JsonUtil { private static ...

    JSON 转BEAN 工具包

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于前后端交互,而...此外,还可以考虑添加更多的功能,如JSON数组与BEAN集合的转换,或者支持自定义的转换策略,使得工具包更加灵活和强大。

    实体Bean继承讲解

    本文将深入探讨实体Bean继承的三种映射方式,并以一种方式为例进行详细讲解。 首先,让我们了解Java持久化规范提供的三种继承实体映射方式: 1. 所有继承层次共用一张表(Single Table Inheritance) 2. 每个具体...

    普元eos-springbean开发

    - **场景介绍**:以报销单维护为例,通过Spring功能向导快速完成基本功能的开发。 - **关键知识点**: - **Spring单表维护向导**:利用EOS提供的向导功能,快速实现对单表数据的增删查改操作。 - **SpringBean配置...

    EJB3.0无状态SessionBean例子

    在本例中,可能有一个名为`HelloWorldRemote`的远程接口,同样定义了`sayHello()`方法。Bean类使用`@Remote`注解声明这个接口,并实现其方法。为了使远程接口能够工作,还需要设置相关的JNDI(Java Naming and ...

    ejb 消息驱动Bean例子

    在本例中,我们将探讨如何使用EJB消息驱动Bean处理Queue和Topic。 1. **消息驱动Bean的基本概念**: - **MDB的角色**:MDB充当JMS(Java Message Service)客户端,它监听特定的消息源,接收到消息后自动调用Bean...

    jsp和bean结合举例

    本例中使用的购物车Bean `Car1` 实现了添加商品到购物车、列出购物车中的商品以及删除商品的功能。 ##### 1. 购物车Bean代码分析 ```java public class Car1 implements Serializable { private Hashtable list =...

    数据库生成相关的DAO和相应的BEAN文件

    在本例中,"DAOGenerator"可能是一个自定义的工具或者是一系列生成DAO和BEAN文件的脚本。使用此类工具时,需要先确保有数据库连接的权限,然后指定数据库的URL、用户名、密码以及需要生成代码的表名。运行工具后,会...

    SSH笔记-通过实现FactoryBean接口来创建 Bean

    此外,`FactoryBean`还可以用于创建单例或多例对象,只需要在`FactoryBean`的实现中控制即可。 在Spring4中,`FactoryBean`仍然保持着其核心功能,并且在处理AOP代理、JMS消息生产者、DAO工厂等方面有广泛应用。...

    Bean的生命周期介绍

    Bean的创建通常有两种模式:单例模式(Singleton)与多例模式(Prototype)。 1. **单实例模式**:在容器启动时创建Bean对象,之后无论多少次请求该Bean,返回的都是同一个对象。这是默认的Bean作用域。 - 例如,...

    spring装配bean实例代码

    在本例中,我们将重点关注XML配置,对应的压缩包文件名为“springxmldemo”,这表明我们将讨论如何通过XML配置文件来定义和管理Bean。 1. **XML配置方式** XML配置是Spring早期的主要装配方式,通过`beans`元素...

    使用Betwixt将XML转为JAVA Bean(内有JAR包)

    假设我们的XML文件中有多个`&lt;address&gt;`节点,每个节点代表一个人的不同地址。 接下来,我们需要配置Betwixt来理解这种映射关系。这可以通过编写XML配置文件或者使用编程式API来完成。这里我们使用编程式API为例: ...

    json 转换成 bean集合 example

    这里以Jackson为例,展示如何实现这一转换。 1. 添加Jackson依赖: 在你的`pom.xml`文件中,添加以下Jackson依赖: ```xml &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt; &lt;artifactId&gt;jackson-databind ...

Global site tag (gtag.js) - Google Analytics