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都是默认单例的。。小纠结~挖个坑,二天来埋
分享到:
相关推荐
BeanFactory是Spring的基本容器,而ApplicationContext是更高级的容器,除了BeanFactory的所有功能外,还提供了更多企业级服务,如消息源、应用事件、国际化等。 12. Spring的AOP框架 Spring的AOP支持面向切面的...
BeanFactory和ApplicationContext的使用取决于具体需求。BeanFactory更轻量级,适合小型项目或测试环境,而ApplicationContext在大型应用中能提供更多的服务。例如,ApplicationContext可以方便地加载资源,处理国际...
在Spring 4.11中,我们可以看到`BeanFactory`和`ApplicationContext`是实现IOC的关键类。`BeanFactory`作为基础容器,负责对象的实例化、配置和管理,而`ApplicationContext`在前者的基础上添加了更多企业级服务,如...
BeanFactory是Spring中最基础的IoC容器实现,它负责加载配置元数据,实例化、配置和管理对象,也就是所谓的"bean"。Spring提供了多种类型的BeanFactory,例如XMLBeanFactory,它可以从XML配置文件中读取bean的定义。...
Spring通过Bean工厂(BeanFactory)和应用上下文(ApplicationContext)来管理Bean,Bean是Spring中的核心概念,代表一个可配置的Java对象。BeanFactory是基本的容器,而ApplicationContext则提供了更丰富的企业级...
在Spring框架中,BeanFactory和ApplicationContext是两个重要的模块,前者提供了基本的Bean容器功能,而后者提供了更多的功能,包括Bean的生命周期管理和事件处理。Spring框架还提供了多种配置方式,包括基于XML的...
Spring框架在设计上大量运用了设计模式,例如工厂模式(BeanFactory)、单例模式(Singleton)、代理模式(AOP实现)、装饰者模式(Bean的后处理器)等。这些设计模式的运用使得Spring具有良好的可扩展性和灵活性,...
Spring容器会自动调用该接口的`setBeanFactory(BeanFactory beanFactory)`方法,将整个`BeanFactory`实例注入到实现了该接口的类中。这样就可以通过`BeanFactory`获取任意的Bean实例。 **示例代码:** ```java ...
- **知识点**: `ApplicationContext` 是 Spring 框架中用于管理 Bean 的核心接口之一,它提供了比 `BeanFactory` 更丰富的功能。 - **解释**: `ApplicationContext` 接口不仅实现了 `BeanFactory` 的功能,还增加了...
在Spring框架中,管理Bean是其核心特性之一。Bean是由Spring容器创建、初始化、装配以及管理的对象,开发者可以通过多种方式在代码中获取这些Bean。以下将详细介绍Spring在代码中获取bean的几种主要方法: 1. **`...
- **依赖注入 (Dependency Injection, DI)**:这是Spring框架最核心的功能之一,通过将对象之间的依赖关系由程序代码转移到配置文件中管理,实现了组件间的解耦,提高了系统的灵活性和可维护性。Spring支持三种依赖...
- **Spring Bean封装机制**:Bean是Spring框架中的核心概念,它是对象的实例,由Spring容器管理其生命周期。Spring通过BeanWrapper、BeanFactory和ApplicationContext等接口和类,提供了丰富的API来管理和操作Bean。...
Spring 框架是 Java 开发中的一个基石,它提供了丰富的功能来简化企业级应用的开发。Spring 的源码分析可以帮助我们深入理解其工作原理,从而更好地利用它提供的功能并进行定制化开发。下面,我们将深入探讨 Spring ...