2

我正在研究一些 Spring 3 注释驱动的控制器和服务,并且对这怎么可能有疑问?

  1. 我的servlet-context.xml文件中有要加载的以下项目的路径:

    <context:component-scan base-package="com.project.controller, com.project.service"/>

在控制器下,我在 init 类中有这个,init 被标记为:

@PostConstruct
public void init() {
    ApplicationContext context = new GenericApplicationContext();
    bizServices = (BizServices) context.getBean("bizServices");
}

在我的服务中,我有一个用于服务的 bean,标记为:

@Service("bizServices")
public class BizServicesImpl implements BizServices { ... }

我得到的例外是:

SEVERE: Allocate exception for servlet Spring MVC Dispatcher Servlet
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named     'bizServices' is defined

这告诉我要么我使用了错误的应用程序上下文服务,要么找不到 bean。我可以在没有 Autowire 的情况下在 PostConstruct 中显式定位并加载此 Service 类吗?如果我让我的服务类从工厂加载,我可以指定工厂类是什么,那会是 xml 中的 bean 配置条目吗?

再次感谢...

4

2 回答 2

2

在您的 @PostConstruct 中,您正在实例化一个新的 ApplicationContext。这个新实例对原来的 ApplicationContext 一无所知。如果您要做的是访问 bizServices,请在您的控制器中声明一个带有 @Autowire 注释的 BizServices 类型的字段。

于 2011-04-17T06:03:35.700 回答
1

您没有完全实例化 init 方法的上下文。您必须通过指定应用程序上下文 xml 的类路径位置来手动加载 bean 定义。

GenricApplicationContext javadoc

使用示例:

 GenericApplicationContext ctx = new GenericApplicationContext();
 XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
 xmlReader.loadBeanDefinitions(new ClassPathResource("applicationContext.xml"));  // load your beans
 PropertiesBeanDefinitionReader propReader = new PropertiesBeanDefinitionReader(ctx);
 propReader.loadBeanDefinitions(new ClassPathResource("otherBeans.properties"));
 ctx.refresh();

 MyBean myBean = (MyBean) ctx.getBean("myBean");
于 2011-04-17T09:05:02.417 回答