`

Spring中取BeanFactory

 
阅读更多

      Spring中说了,一个bean实现BeanFactoryAware,就可以取得这个bean所在的上下文的BeanFactory:

<?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.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<bean name="codehelpcommand" class="com.zyp.finance.server.CodeHelpCommand"/>
<bean name="baseServiceImpl" class="com.zyp.finance.server.BaseServiceImpl"/>
 </beans>

上面的baseServiceImpl实现了BeanFactoryAware接口,按理应该可以获取到codehelpcommand这个bean的,结果下面的小测试出了问题:

 

package com.zyp.finance.server;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.zyp.finance.client.BaseService;
import com.zyp.finance.client.RequestData;

/**
 * The server side implementation of the RPC service.
 */
public class BaseServiceImpl extends RemoteServiceServlet implements
	BaseService, BeanFactoryAware{
	private BeanFactory beanFactory;
	public RequestData baseServer(RequestData data) {
		String action = data.getActionName();
		ICommand command = fetchCommand(action);
		RequestData response = command.execute(data);
		return response;
	}
	


	public void setBeanFactory(BeanFactory arg0) throws BeansException {
		System.out.println("arg0="+arg0);//1:打印出了2个bean
		beanFactory = arg0;
		
	}
	
	//通过spring获取对应的bean处理
	public ICommand fetchCommand(String action){
		System.out.println("action="+action);
		if(this.beanFactory==null){
			System.out.println("this.beanFactory is null");//2:打印出了这句,beanFactory为空。
		}
		Object bean =  this.beanFactory.getBean(action);
		if(bean==null){
			System.out.println("error,no such bean:"+action);
			return null;
		}
		else return (ICommand) bean;
		
	}

}
 

启动服务器的时候,打印出了1处的context中的其他bean:

arg0=org.springframework.beans.factory.support.DefaultListableBeanFactory@a9255c: defining beans [codehelpcommand,baseServiceImpl]; root of factory hierarchy

 

调用2处的方法的时候,报错,beanFactory为空。

 

当初整合GWT和Spring的时,想起同事写了个单例来存放beanFactory,按照那个思路改了下代码,就好了:

 

package com.zyp.finance.server;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;

public class ContextUtil implements BeanFactoryAware{
	private static  BeanFactory beanFactory;
	private static  ContextUtil instance = new ContextUtil();
	public  BeanFactory getBeanFactory() {
		return beanFactory;
	}

	private ContextUtil(){
		
	}
	
	public static ContextUtil getInstance(){
		return instance;
	}

	public void setBeanFactory(BeanFactory arg0) throws BeansException {
		beanFactory = arg0;		
	}
}

 

将这个ContextUtil放在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.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<bean name="codehelpcommand" class="com.zyp.finance.server.CodeHelpCommand"/>
<bean name="baseServiceImpl" class="com.zyp.finance.server.BaseServiceImpl"/>
<bean name="contextUtil" class="com.zyp.finance.server.ContextUtil"/>
 </beans>

 BaseServiceImpl获取,并且这个类自己不用再实现BeanFactoryAware了。

package com.zyp.finance.server;

import org.springframework.beans.factory.BeanFactory;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.zyp.finance.client.BaseService;
import com.zyp.finance.client.RequestData;

public class BaseServiceImpl extends RemoteServiceServlet implements
	BaseService{
	private BeanFactory beanFactory = ContextUtil.getInstance().getBeanFactory();
	
	//通过spring获取对应的bean处理
	public ICommand fetchCommand(String action){
		Object bean =  this.beanFactory.getBean(action);
	         //成功获取到了,其他代码省略。
		
	}

}

 至于为什么会这样。。不清楚了。。明明bean都是默认单例的。。小纠结~挖个坑,二天来埋

 

分享到:
评论

相关推荐

    Spring教程  主要内容:介绍Spring的历史,Spring的概论和它的体系结构,重点阐述它在J2EE中扮演的角色。

    BeanFactory是Spring的基本容器,而ApplicationContext是更高级的容器,除了BeanFactory的所有功能外,还提供了更多企业级服务,如消息源、应用事件、国际化等。 12. Spring的AOP框架 Spring的AOP支持面向切面的...

    spring编程详细说明

    BeanFactory和ApplicationContext的使用取决于具体需求。BeanFactory更轻量级,适合小型项目或测试环境,而ApplicationContext在大型应用中能提供更多的服务。例如,ApplicationContext可以方便地加载资源,处理国际...

    spring 4.11源码

    在Spring 4.11中,我们可以看到`BeanFactory`和`ApplicationContext`是实现IOC的关键类。`BeanFactory`作为基础容器,负责对象的实例化、配置和管理,而`ApplicationContext`在前者的基础上添加了更多企业级服务,如...

    spring源代码解析

    BeanFactory是Spring中最基础的IoC容器实现,它负责加载配置元数据,实例化、配置和管理对象,也就是所谓的"bean"。Spring提供了多种类型的BeanFactory,例如XMLBeanFactory,它可以从XML配置文件中读取bean的定义。...

    spring_闪电上手

    Spring通过Bean工厂(BeanFactory)和应用上下文(ApplicationContext)来管理Bean,Bean是Spring中的核心概念,代表一个可配置的Java对象。BeanFactory是基本的容器,而ApplicationContext则提供了更丰富的企业级...

    25个经典的Spring面试问答.docx

    在Spring框架中,BeanFactory和ApplicationContext是两个重要的模块,前者提供了基本的Bean容器功能,而后者提供了更多的功能,包括Bean的生命周期管理和事件处理。Spring框架还提供了多种配置方式,包括基于XML的...

    spring内核详解

    Spring框架在设计上大量运用了设计模式,例如工厂模式(BeanFactory)、单例模式(Singleton)、代理模式(AOP实现)、装饰者模式(Bean的后处理器)等。这些设计模式的运用使得Spring具有良好的可扩展性和灵活性,...

    几种spring获取bean的方法.txt

    Spring容器会自动调用该接口的`setBeanFactory(BeanFactory beanFactory)`方法,将整个`BeanFactory`实例注入到实现了该接口的类中。这样就可以通过`BeanFactory`获取任意的Bean实例。 **示例代码:** ```java ...

    Spring基础面试

    - **知识点**: `ApplicationContext` 是 Spring 框架中用于管理 Bean 的核心接口之一,它提供了比 `BeanFactory` 更丰富的功能。 - **解释**: `ApplicationContext` 接口不仅实现了 `BeanFactory` 的功能,还增加了...

    Spring在代码中获取bean的几种方式.rar

    在Spring框架中,管理Bean是其核心特性之一。Bean是由Spring容器创建、初始化、装配以及管理的对象,开发者可以通过多种方式在代码中获取这些Bean。以下将详细介绍Spring在代码中获取bean的几种主要方法: 1. **`...

    spring开发指南(pdf)

    - **依赖注入 (Dependency Injection, DI)**:这是Spring框架最核心的功能之一,通过将对象之间的依赖关系由程序代码转移到配置文件中管理,实现了组件间的解耦,提高了系统的灵活性和可维护性。Spring支持三种依赖...

    spring 開發指南

    - **Spring Bean封装机制**:Bean是Spring框架中的核心概念,它是对象的实例,由Spring容器管理其生命周期。Spring通过BeanWrapper、BeanFactory和ApplicationContext等接口和类,提供了丰富的API来管理和操作Bean。...

    spring源码

    Spring 框架是 Java 开发中的一个基石,它提供了丰富的功能来简化企业级应用的开发。Spring 的源码分析可以帮助我们深入理解其工作原理,从而更好地利用它提供的功能并进行定制化开发。下面,我们将深入探讨 Spring ...

Global site tag (gtag.js) - Google Analytics